From 16e040eba3da3bd513bb5f90c544d8285a50e9ee Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Mon, 20 Feb 2017 17:26:45 +0700 Subject: [PATCH 01/39] simplify getOverridingModule --- app/src/main/kotlin/com/hana053/micropost/Extensions.kt | 5 ++--- .../com/hana053/micropost/pages/login/LoginActivity.kt | 3 +-- .../kotlin/com/hana053/micropost/pages/main/MainActivity.kt | 3 +-- .../micropost/pages/micropostnew/MicropostNewActivity.kt | 3 +-- .../pages/relateduserlist/RelatedUserListActivity.kt | 3 +-- .../com/hana053/micropost/pages/signup/SignupActivity.kt | 3 +-- .../kotlin/com/hana053/micropost/pages/top/TopActivity.kt | 3 +-- .../com/hana053/micropost/pages/usershow/UserShowActivity.kt | 3 +-- 8 files changed, 9 insertions(+), 17 deletions(-) diff --git a/app/src/main/kotlin/com/hana053/micropost/Extensions.kt b/app/src/main/kotlin/com/hana053/micropost/Extensions.kt index 2b588fb..46d6d84 100644 --- a/app/src/main/kotlin/com/hana053/micropost/Extensions.kt +++ b/app/src/main/kotlin/com/hana053/micropost/Extensions.kt @@ -3,7 +3,6 @@ package com.hana053.micropost import android.app.Activity import com.github.salomonbrys.kodein.Kodein -fun Activity.getOverridingModule(clazz: Class<*>): Kodein.Module { - return (application as BaseApplication).getOverridingModule(clazz) +fun Activity.getOverridingModule(): Kodein.Module { + return (application as BaseApplication).getOverridingModule(javaClass) } - diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/login/LoginActivity.kt b/app/src/main/kotlin/com/hana053/micropost/pages/login/LoginActivity.kt index 583946e..2482d98 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/login/LoginActivity.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/login/LoginActivity.kt @@ -27,7 +27,6 @@ class LoginActivity : RxAppCompatActivity(), AppCompatActivityInjector { destroyInjector() } - override fun provideOverridingModule() - = getOverridingModule(LoginActivity::class.java) + override fun provideOverridingModule() = getOverridingModule() } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/main/MainActivity.kt b/app/src/main/kotlin/com/hana053/micropost/pages/main/MainActivity.kt index fa60332..c97e31d 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/main/MainActivity.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/main/MainActivity.kt @@ -62,7 +62,6 @@ class MainActivity : RxAppCompatActivity(), AppCompatActivityInjector { return super.onOptionsItemSelected(item) } - override fun provideOverridingModule() - = getOverridingModule(MainActivity::class.java) + override fun provideOverridingModule() = getOverridingModule() } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/micropostnew/MicropostNewActivity.kt b/app/src/main/kotlin/com/hana053/micropost/pages/micropostnew/MicropostNewActivity.kt index 73e28d3..b8613eb 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/micropostnew/MicropostNewActivity.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/micropostnew/MicropostNewActivity.kt @@ -32,6 +32,5 @@ class MicropostNewActivity : RxAppCompatActivity(), AppCompatActivityInjector { destroyInjector() } - override fun provideOverridingModule() - = getOverridingModule(MicropostNewActivity::class.java) + override fun provideOverridingModule() = getOverridingModule() } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListActivity.kt b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListActivity.kt index 41dc0ae..302122a 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListActivity.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListActivity.kt @@ -57,7 +57,6 @@ class RelatedUserListActivity : RxAppCompatActivity(), AppCompatActivityInjector return super.onOptionsItemSelected(item) } - override fun provideOverridingModule() - = getOverridingModule(RelatedUserListActivity::class.java) + override fun provideOverridingModule() = getOverridingModule() } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupActivity.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupActivity.kt index 92d9226..f0ee92e 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupActivity.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupActivity.kt @@ -39,7 +39,6 @@ class SignupActivity : RxAppCompatActivity(), AppCompatActivityInjector { signupNavigator.navigateToPrev() } - override fun provideOverridingModule() - = getOverridingModule(SignupActivity::class.java) + override fun provideOverridingModule() = getOverridingModule() } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/top/TopActivity.kt b/app/src/main/kotlin/com/hana053/micropost/pages/top/TopActivity.kt index 6c4000c..aa0b0a8 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/top/TopActivity.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/top/TopActivity.kt @@ -28,8 +28,7 @@ class TopActivity : RxAppCompatActivity(), AppCompatActivityInjector { destroyInjector() } - override fun provideOverridingModule() - = getOverridingModule(TopActivity::class.java) + override fun provideOverridingModule() = getOverridingModule() } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/UserShowActivity.kt b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/UserShowActivity.kt index 5524051..afe5a64 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/UserShowActivity.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/UserShowActivity.kt @@ -53,7 +53,6 @@ class UserShowActivity : RxAppCompatActivity(), AppCompatActivityInjector { return super.onOptionsItemSelected(item) } - override fun provideOverridingModule() - = getOverridingModule(UserShowActivity::class.java) + override fun provideOverridingModule() = getOverridingModule() } \ No newline at end of file From afe73238ed5970db08fb266f30eb614b526bcb1a Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Mon, 20 Feb 2017 17:38:24 +0700 Subject: [PATCH 02/39] updated readme --- README.md | 22 +++++++++++----------- app/jacoco.gradle | 47 ----------------------------------------------- 2 files changed, 11 insertions(+), 58 deletions(-) delete mode 100644 app/jacoco.gradle diff --git a/README.md b/README.md index 0a29f57..f0496c7 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,17 @@ # Android micropost app -This repository is an example Android application, which is based on Rails tutorial app. +This repository is an example Android application based on Rails tutorial app. [![Build Status](https://travis-ci.org/springboot-angular2-tutorial/android-app.svg?branch=master)](https://travis-ci.org/springboot-angular2-tutorial/android-app) -[![Coverage Status](https://coveralls.io/repos/github/springboot-angular2-tutorial/android-app/badge.svg?branch=master)](https://coveralls.io/github/springboot-angular2-tutorial/android-app?branch=master) -Key components. - -* Dagger 2 -* Retrolambda -* RxJava / RxAndroid -* Retrofit 2 -* Data Binding -* Robolectric 3 +* Kotlin 100% without kapt +* [Kodein](https://github.com/SalomonBrys/Kodein) as Dependency Injection +* MVP architecture +* [RxJava](https://github.com/ReactiveX/RxJava) / [RxAndroid](https://github.com/ReactiveX/RxAndroid) +* [RxBinding](https://github.com/JakeWharton/RxBinding) +* [Retrofit](https://github.com/square/retrofit) +* [Robolectric](http://robolectric.org/) for testing model layer +* [Espresso](https://google.github.io/android-testing-support-library/docs/espresso/) for testing presentation layer ## Getting Started @@ -40,7 +39,8 @@ Then, just run from Android Studio. Testing. ``` -./gradlew testDebug +./gradlew testDebugUnitTest +./gradlew connectedAndroidTest ``` Release build. diff --git a/app/jacoco.gradle b/app/jacoco.gradle deleted file mode 100644 index 2e22f2b..0000000 --- a/app/jacoco.gradle +++ /dev/null @@ -1,47 +0,0 @@ -apply plugin: 'jacoco' - -jacoco { - // https://bintray.com/bintray/jcenter/org.jacoco:org.jacoco.core - toolVersion = "0.7.7.201606060606" -} - -android { - testOptions { - unitTests.all { - jacoco { - includeNoLocationClasses = true - } - } - } -} - -project.afterEvaluate { - - android.applicationVariants.all { variant -> - def name = variant.name - def testTaskName = "test${name.capitalize()}UnitTest" - - tasks.create(name: "${testTaskName}Coverage", type: JacocoReport, dependsOn: "$testTaskName") { - group = "Reporting" - description = "Generate Jacoco coverage reports for the ${name.capitalize()} build." - - classDirectories = fileTree( - dir: "${project.buildDir}/intermediates/classes/${name}", - excludes: ['**/R.class', - '**/R$*.class', - '**/*$ViewInjector*.*', - '**/*$ViewBinder*.*', - '**/BuildConfig.*', - '**/Manifest*.*'] - ) - - sourceDirectories = files(['src/main/java'].plus(android.sourceSets[name].java.srcDirs)) - executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec") - - reports { - xml.enabled = true - html.enabled = true - } - } - } -} \ No newline at end of file From c4e407d78e656fd4f15f4d200f678bd6d2fdbeb6 Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Mon, 20 Feb 2017 18:24:07 +0700 Subject: [PATCH 03/39] utilize kotlin for some classes (adapter) --- .../com/hana053/micropost/Extensions.kt | 5 +- .../relateduserlist/RelatedUserListAdapter.kt | 48 ++++++++--------- .../micropost/shared/posts/PostListAdapter.kt | 52 +++++++++---------- 3 files changed, 49 insertions(+), 56 deletions(-) diff --git a/app/src/main/kotlin/com/hana053/micropost/Extensions.kt b/app/src/main/kotlin/com/hana053/micropost/Extensions.kt index 46d6d84..a87af38 100644 --- a/app/src/main/kotlin/com/hana053/micropost/Extensions.kt +++ b/app/src/main/kotlin/com/hana053/micropost/Extensions.kt @@ -3,6 +3,5 @@ package com.hana053.micropost import android.app.Activity import com.github.salomonbrys.kodein.Kodein -fun Activity.getOverridingModule(): Kodein.Module { - return (application as BaseApplication).getOverridingModule(javaClass) -} +fun Activity.getOverridingModule(): Kodein.Module = + (application as BaseApplication).getOverridingModule(javaClass) diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListAdapter.kt b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListAdapter.kt index b2bdf41..f6d8cba 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListAdapter.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListAdapter.kt @@ -24,44 +24,42 @@ class RelatedUserListAdapter( val followBtnClicksSubject: PublishSubject = PublishSubject.create() val avatarClicksSubject: PublishSubject = PublishSubject.create() - override fun getItemCount(): Int { - return users.size + class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + val container: LinearLayout = view.container + val avatar: ImageView = view.avatar + val userName: TextView = view.userName + val followBtn: Button = view.followBtn } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val v = LayoutInflater.from(parent.context) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = + LayoutInflater.from(parent.context) .inflate(R.layout.item_related_users, parent, false) - return ViewHolder(v) - } + .let(::ViewHolder) override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = users[position] - holder.userName.text = item.name - holder.container.tag = item + holder.apply { + container.tag = item + userName.text = item.name - AvatarView(holder.avatar).render(item.toUser()) - holder.avatar.setOnClickListener { - avatarClicksSubject.onNext(item.toUser()) - } + AvatarView(avatar).render(item.toUser()) + avatar.setOnClickListener { + avatarClicksSubject.onNext(item.toUser()) + } - val followBtnView = FollowBtnView(holder.followBtn) - followBtnView.render(item.toUser()) - holder.followBtn.setOnClickListener { - followBtnClicksSubject.onNext(followBtnView) + FollowBtnView(followBtn).apply { + render(item.toUser()) + followBtn.setOnClickListener { + followBtnClicksSubject.onNext(this) + } + } } } - class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { - val container: LinearLayout = view.container - val avatar: ImageView = view.avatar - val userName: TextView = view.userName - val followBtn: Button = view.followBtn - } + override fun getItemCount(): Int = users.size - fun getLastItemId(): Long? { - return users.map { it.relationshipId }.lastOrNull() - } + fun getLastItemId(): Long? = users.map { it.relationshipId }.lastOrNull() fun addAll(location: Int, users: List): Boolean { if (this.users.addAll(location, users)) { diff --git a/app/src/main/kotlin/com/hana053/micropost/shared/posts/PostListAdapter.kt b/app/src/main/kotlin/com/hana053/micropost/shared/posts/PostListAdapter.kt index 1bc660a..fb0e49f 100644 --- a/app/src/main/kotlin/com/hana053/micropost/shared/posts/PostListAdapter.kt +++ b/app/src/main/kotlin/com/hana053/micropost/shared/posts/PostListAdapter.kt @@ -22,46 +22,42 @@ class PostListAdapter( val avatarClicksSubject: PublishSubject = PublishSubject.create() - override fun getItemCount(): Int { - return posts.size + class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + val container: LinearLayout = view.container + val avatar: ImageView = view.avatar + val userName: TextView = view.userName + val createdAt: RelativeTimeTextView = view.createdAt + val content: TextView = view.content } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = + LayoutInflater.from(parent.context) + .inflate(R.layout.item_posts, parent, false) + .let(::ViewHolder) + override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = posts[position] - holder.userName.text = item.user.name - holder.createdAt.setReferenceTime(item.createdAt) - holder.content.text = item.content - holder.container.tag = item - AvatarView(holder.avatar).render(item.user) - holder.avatar.setOnClickListener { - avatarClicksSubject.onNext(item.user) + holder.apply { + container.tag = item + userName.text = item.user.name + createdAt.setReferenceTime(item.createdAt) + content.text = item.content + AvatarView(avatar).render(item.user) + avatar.setOnClickListener { + avatarClicksSubject.onNext(item.user) + } } - } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val v = LayoutInflater.from(parent.context) - .inflate(R.layout.item_posts, parent, false) - return ViewHolder(v) } - class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { - val container: LinearLayout = view.container - val avatar: ImageView = view.avatar - val userName: TextView = view.userName - val createdAt: RelativeTimeTextView = view.createdAt - val content: TextView = view.content - } + override fun getItemCount(): Int = posts.size - fun getFirstItemId(): Long? { - return posts.map { it.id }.firstOrNull() - } + fun getFirstItemId(): Long? = posts.map { it.id }.firstOrNull() - fun getLastItemId(): Long? { - return posts.map { it.id }.lastOrNull() - } + fun getLastItemId(): Long? = posts.map { it.id }.lastOrNull() - fun addAll(location: Int, posts: Collection): Boolean { + fun addAll(location: Int, posts: List): Boolean { if (this.posts.addAll(location, posts)) { notifyItemRangeInserted(location, posts.size) return true From f03fda3b155cec26138e900f970ee4ad3fca8fe9 Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Mon, 20 Feb 2017 21:00:30 +0700 Subject: [PATCH 04/39] utilize kotlin scope functions --- .../com/hana053/micropost/BaseApplication.kt | 4 +- .../com/hana053/micropost/domain/Avatar.kt | 5 +-- .../hana053/micropost/domain/RelatedUser.kt | 7 +-- .../micropost/interactor/InteractorModule.kt | 45 ++++++++----------- .../com/hana053/micropost/pages/Presenter.kt | 30 ++++++------- .../hana053/micropost/pages/ViewWrapper.kt | 3 ++ .../micropost/pages/login/LoginModule.kt | 3 +- .../micropost/pages/login/LoginView.kt | 9 +++- .../micropost/pages/main/MainModule.kt | 4 +- .../hana053/micropost/pages/main/MainView.kt | 3 +- .../pages/micropostnew/MIcropostNewModule.kt | 3 +- .../relateduserlist/RelatedUserListModule.kt | 4 +- .../relateduserlist/RelatedUserListView.kt | 3 +- .../followerlist/FollowerListService.kt | 4 +- .../followinglist/FollowingListService.kt | 4 +- .../micropost/pages/signup/SignupActivity.kt | 2 +- .../pages/signup/SignupNavigatorImpl.kt | 10 ++--- .../pages/signup/SignupServiceImpl.kt | 22 +++++---- .../micropost/pages/signup/SignupState.kt | 7 +-- .../pages/signup/email/SignupEmailFragment.kt | 5 +-- .../signup/email/SignupEmailPresenter.kt | 8 ++-- .../signup/email/SignupFullNameModule.kt | 3 +- .../signup/fullname/SignupFullNameFragment.kt | 5 +-- .../signup/fullname/SignupFullNameModule.kt | 3 +- .../fullname/SignupFullNamePresenter.kt | 4 +- .../signup/password/SignupPasswordFragment.kt | 5 +-- .../signup/password/SignupPasswordModule.kt | 3 +- .../password/SignupPasswordPresenter.kt | 4 +- .../hana053/micropost/pages/top/TopModule.kt | 3 +- .../usershow/detail/UserShowDetailModule.kt | 3 +- .../usershow/detail/UserShowDetailService.kt | 5 +-- .../usershow/posts/UserShowPostsModule.kt | 4 +- .../pages/usershow/posts/UserShowPostsView.kt | 9 ++-- .../repository/AuthTokenRepositoryImpl.kt | 11 ++--- .../micropost/service/AuthServiceImpl.kt | 14 +++--- .../micropost/service/HttpErrorHandlerImpl.kt | 11 ++--- .../micropost/service/LoginServiceImpl.kt | 10 ++--- .../micropost/shared/avatar/AvatarView.kt | 6 ++- .../shared/followbtn/FollowBtnService.kt | 6 +-- 39 files changed, 131 insertions(+), 163 deletions(-) diff --git a/app/src/main/kotlin/com/hana053/micropost/BaseApplication.kt b/app/src/main/kotlin/com/hana053/micropost/BaseApplication.kt index 75ca77e..7c21617 100644 --- a/app/src/main/kotlin/com/hana053/micropost/BaseApplication.kt +++ b/app/src/main/kotlin/com/hana053/micropost/BaseApplication.kt @@ -49,8 +49,6 @@ abstract class BaseApplication : Application(), KodeinAware { Pair(RelatedUserListActivity::class.java, relatedUserListModule()) ) - fun getOverridingModule(clazz: Class<*>): Kodein.Module { - return overridingModules[clazz]!! - } + fun getOverridingModule(clazz: Class<*>): Kodein.Module = overridingModules[clazz]!! } diff --git a/app/src/main/kotlin/com/hana053/micropost/domain/Avatar.kt b/app/src/main/kotlin/com/hana053/micropost/domain/Avatar.kt index db9b681..bfbb344 100644 --- a/app/src/main/kotlin/com/hana053/micropost/domain/Avatar.kt +++ b/app/src/main/kotlin/com/hana053/micropost/domain/Avatar.kt @@ -4,7 +4,6 @@ package com.hana053.micropost.domain interface Avatar { val avatarHash: String - fun avatarUrl(size: Int = 72): String { - return "https://secure.gravatar.com/avatar/$avatarHash?s=$size" - } + fun avatarUrl(size: Int = 72): String = + "https://secure.gravatar.com/avatar/$avatarHash?s=$size" } diff --git a/app/src/main/kotlin/com/hana053/micropost/domain/RelatedUser.kt b/app/src/main/kotlin/com/hana053/micropost/domain/RelatedUser.kt index b9d741f..8ac6096 100644 --- a/app/src/main/kotlin/com/hana053/micropost/domain/RelatedUser.kt +++ b/app/src/main/kotlin/com/hana053/micropost/domain/RelatedUser.kt @@ -10,7 +10,8 @@ data class RelatedUser( val userStats: UserStats, val relationshipId: Long ) : Avatar { - fun toUser(): User { - return User(id, name, email, avatarHash, isFollowedByMe, userStats) - } + + fun toUser(): User = + User(id, name, email, avatarHash, isFollowedByMe, userStats) + } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/interactor/InteractorModule.kt b/app/src/main/kotlin/com/hana053/micropost/interactor/InteractorModule.kt index 88f5769..676321d 100644 --- a/app/src/main/kotlin/com/hana053/micropost/interactor/InteractorModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/interactor/InteractorModule.kt @@ -17,19 +17,17 @@ fun interactorModule() = Kodein.Module { bind() with singleton { val authTokenRepository = instance() - OkHttpClient().newBuilder() - .addInterceptor { chain -> - val authToken = authTokenRepository.get() - val original = chain.request() - val builder = original.newBuilder() - if (authToken != null) - builder.header("authorization", "Bearer " + authToken) - val request = builder - .method(original.method(), original.body()) - .build() - chain.proceed(request) - } - .build() + OkHttpClient().newBuilder().addInterceptor { chain -> + val authToken = authTokenRepository.get() + val original = chain.request() + val builder = original.newBuilder() + if (authToken != null) + builder.header("authorization", "Bearer " + authToken) + val request = builder + .method(original.method(), original.body()) + .build() + chain.proceed(request) + }.build() } bind() with singleton { @@ -44,38 +42,31 @@ fun interactorModule() = Kodein.Module { } bind() with singleton { - val retrofit = instance() - retrofit.create(LoginInteractor::class.java) + instance().create(LoginInteractor::class.java) } bind() with singleton { - val retrofit = instance() - retrofit.create(FeedInteractor::class.java) + instance().create(FeedInteractor::class.java) } bind() with singleton { - val retrofit = instance() - retrofit.create(UserInteractor::class.java) + instance().create(UserInteractor::class.java) } bind() with singleton { - val retrofit = instance() - retrofit.create(RelationshipInteractor::class.java) + instance().create(RelationshipInteractor::class.java) } bind() with singleton { - val retrofit = instance() - retrofit.create(UserMicropostInteractor::class.java) + instance().create(UserMicropostInteractor::class.java) } bind() with singleton { - val retrofit = instance() - retrofit.create(MicropostInteractor::class.java) + instance().create(MicropostInteractor::class.java) } bind() with singleton { - val retrofit = instance() - retrofit.create(RelatedUserListInteractor::class.java) + instance().create(RelatedUserListInteractor::class.java) } } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/Presenter.kt b/app/src/main/kotlin/com/hana053/micropost/pages/Presenter.kt index ed76425..6979a62 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/Presenter.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/Presenter.kt @@ -15,22 +15,20 @@ interface Presenter { fun bind() fun Observable.withProgressDialog(): Observable = Observable.using({ - val progressBar = ProgressBar(view.content.context, null, android.R.attr.progressBarStyle) - progressBar.isIndeterminate = true - progressBar.visibility = View.VISIBLE - - val rl = RelativeLayout(view.content.context) - rl.gravity = Gravity.CENTER - rl.addView(progressBar) - - val layoutParams = RelativeLayout.LayoutParams( - RelativeLayout.LayoutParams.MATCH_PARENT, - RelativeLayout.LayoutParams.MATCH_PARENT - ) - - view.content.addView(rl, layoutParams) - - progressBar + ProgressBar(view.context(), null, android.R.attr.progressBarStyle).apply { + isIndeterminate = true + visibility = View.VISIBLE + + val rl = RelativeLayout(view.content.context).apply { + gravity = Gravity.CENTER + addView(this@apply) + } + val layoutParams = RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.MATCH_PARENT, + RelativeLayout.LayoutParams.MATCH_PARENT + ) + view.content.addView(rl, layoutParams) + } }, { this }, { it.visibility = View.GONE }) diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/ViewWrapper.kt b/app/src/main/kotlin/com/hana053/micropost/pages/ViewWrapper.kt index 33e4151..db1d08d 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/ViewWrapper.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/ViewWrapper.kt @@ -1,8 +1,11 @@ package com.hana053.micropost.pages +import android.content.Context import android.view.ViewGroup interface ViewWrapper { val content: ViewGroup + + fun context(): Context = content.context } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/login/LoginModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/login/LoginModule.kt index f46f088..521013c 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/login/LoginModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/login/LoginModule.kt @@ -15,8 +15,7 @@ fun loginModule() = Kodein.Module { } bind() with autoScopedSingleton(androidActivityScope) { - val content = instance().activity_login - LoginView(content) + instance().activity_login.let(::LoginView) } } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/login/LoginView.kt b/app/src/main/kotlin/com/hana053/micropost/pages/login/LoginView.kt index 57230a7..b9a6744 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/login/LoginView.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/login/LoginView.kt @@ -6,12 +6,17 @@ import com.jakewharton.rxbinding.view.clicks import com.jakewharton.rxbinding.view.enabled import com.jakewharton.rxbinding.widget.textChanges import kotlinx.android.synthetic.main.activity_login.view.* +import rx.Observable class LoginView(override val content: ViewGroup) : ViewWrapper { // Events - val emailChanges = content.emailEditText.textChanges().map { it.toString() }!! - val passwordChanges = content.passwordEditText.textChanges().map { it.toString() }!! + val emailChanges: Observable = content.emailEditText + .textChanges() + .map { it.toString() } + val passwordChanges: Observable = content.passwordEditText + .textChanges() + .map { it.toString() } val loginClicks = content.loginBtn.clicks() // Props diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/main/MainModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/main/MainModule.kt index 6b74867..d8966c6 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/main/MainModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/main/MainModule.kt @@ -20,8 +20,8 @@ fun mainModule() = Kodein.Module { } bind() with autoScopedSingleton(androidActivityScope) { - val content = instance().activity_main - MainView(content, instance()) + instance().activity_main + .let { MainView(it, instance()) } } bind() with autoScopedSingleton(androidActivityScope) { diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/main/MainView.kt b/app/src/main/kotlin/com/hana053/micropost/pages/main/MainView.kt index e0f1495..9c5cbae 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/main/MainView.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/main/MainView.kt @@ -31,8 +31,7 @@ class MainView( val swipeRefreshing = swipeRefreshLayout.refreshing() init { - val context = content.context - postRecyclerView.layoutManager = LinearLayoutManager(context) + postRecyclerView.layoutManager = LinearLayoutManager(context()) postRecyclerView.adapter = postListAdapter } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/micropostnew/MIcropostNewModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/micropostnew/MIcropostNewModule.kt index b90542f..457d11d 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/micropostnew/MIcropostNewModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/micropostnew/MIcropostNewModule.kt @@ -16,8 +16,7 @@ fun micropostNewModule() = Kodein.Module { } bind() with autoScopedSingleton(androidActivityScope) { - val content = instance().activity_micropost_new - MicropostNewView(content) + instance().activity_micropost_new.let(::MicropostNewView) } bind() with autoScopedSingleton(androidActivityScope) { diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListModule.kt index 5726490..9fe351f 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListModule.kt @@ -20,8 +20,8 @@ fun relatedUserListModule() = Kodein.Module { } bind() with autoScopedSingleton(androidActivityScope) { - val content = instance().activity_related_user_list - RelatedUserListView(content, instance()) + instance().activity_related_user_list + .let { RelatedUserListView(it, instance()) } } bind() with autoScopedSingleton(androidActivityScope) { diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListView.kt b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListView.kt index e3c873c..4625d23 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListView.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListView.kt @@ -21,8 +21,7 @@ class RelatedUserListView( .filter { !userRecyclerView.canScrollVertically(1) } init { - val context = content.context - userRecyclerView.layoutManager = LinearLayoutManager(context) + userRecyclerView.layoutManager = LinearLayoutManager(context()) userRecyclerView.adapter = relatedUserListAdapter } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followerlist/FollowerListService.kt b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followerlist/FollowerListService.kt index e82810f..fe81a75 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followerlist/FollowerListService.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followerlist/FollowerListService.kt @@ -37,7 +37,5 @@ class FollowerListService( .onErrorResumeNext { Observable.empty() } } - override fun title(): String { - return context.getString(R.string.Followers) - } + override fun title(): String = context.getString(R.string.Followers) } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followinglist/FollowingListService.kt b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followinglist/FollowingListService.kt index 92f6a33..6d6cadf 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followinglist/FollowingListService.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followinglist/FollowingListService.kt @@ -37,7 +37,5 @@ class FollowingListService( .onErrorResumeNext { Observable.empty() } } - override fun title(): String { - return context.getString(R.string.Followings) - } + override fun title(): String = context.getString(R.string.Followings) } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupActivity.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupActivity.kt index f0ee92e..ca15a9e 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupActivity.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupActivity.kt @@ -22,7 +22,7 @@ class SignupActivity : RxAppCompatActivity(), AppCompatActivityInjector { initializeInjector() - if (savedInstanceState == null) { + savedInstanceState?.let { supportFragmentManager .beginTransaction() .replace(R.id.container, SignupFullNameFragment()) diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupNavigatorImpl.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupNavigatorImpl.kt index d62c340..52c7112 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupNavigatorImpl.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupNavigatorImpl.kt @@ -27,12 +27,12 @@ class SignupNavigatorImpl( } override fun navigateToPrev() { - val backStackCnt = activity.supportFragmentManager.backStackEntryCount - if (backStackCnt == 0) { - activity.finish() - return + activity.supportFragmentManager.backStackEntryCount.let { + when (it) { + 0 -> activity.finish() + else -> activity.supportFragmentManager.popBackStack() + } } - activity.supportFragmentManager.popBackStack() } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupServiceImpl.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupServiceImpl.kt index e8c921d..81e0d94 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupServiceImpl.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupServiceImpl.kt @@ -21,26 +21,24 @@ class SignupServiceImpl( private val context = context.applicationContext - override fun signup(request: UserInteractor.SignupRequest): Observable { - return userInteractor.create(request) + override fun signup(request: UserInteractor.SignupRequest): Observable = + userInteractor.create(request) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) - .doOnError { err -> - if (isEmailAlreadyTaken(err)) { - Toast.makeText(context, "This email is already taken.", Toast.LENGTH_LONG).show() - signupNavigator.navigateToPrev() - } else { - httpErrorHandler.handleError(err) + .doOnError { + when { + isEmailAlreadyTaken(it) -> { + Toast.makeText(context, "This email is already taken.", Toast.LENGTH_LONG).show() + signupNavigator.navigateToPrev() + } + else -> httpErrorHandler.handleError(it) } } .onErrorResumeNext { Observable.empty() } .flatMap { loginService.login(request.email, request.password) } - } - private fun isEmailAlreadyTaken(e: Throwable): Boolean { - return e is HttpException && e.code() == 400 - } + private fun isEmailAlreadyTaken(e: Throwable): Boolean = e is HttpException && e.code() == 400 } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupState.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupState.kt index 18bf965..f901c95 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupState.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupState.kt @@ -8,7 +8,8 @@ data class SignupState( var email: String = "", var password: String = "" ) { - fun toSignupRequest(): UserInteractor.SignupRequest { - return UserInteractor.SignupRequest(fullName, email, password) - } + + fun toSignupRequest(): UserInteractor.SignupRequest = + UserInteractor.SignupRequest(fullName, email, password) + } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupEmailFragment.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupEmailFragment.kt index 85922e4..16cfcd7 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupEmailFragment.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupEmailFragment.kt @@ -17,9 +17,8 @@ class SignupEmailFragment : RxFragment(), SupportFragmentInjector { private val presenter: SignupEmailPresenter by instance() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_signup_email, container, false) - } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = + inflater.inflate(R.layout.fragment_signup_email, container, false) override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupEmailPresenter.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupEmailPresenter.kt index fe95a8d..49f2bc1 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupEmailPresenter.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupEmailPresenter.kt @@ -33,9 +33,9 @@ class SignupEmailPresenter( } } - private fun isFormValid(email: CharSequence): Boolean { - val emailPattern = "^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*@\\[?([\\d\\w\\.-]+)]?$" - return email.matches(emailPattern.toRegex()) - } + private fun isFormValid(email: CharSequence): Boolean = + "^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*@\\[?([\\d\\w\\.-]+)]?$" + .let(String::toRegex) + .let { email.matches(it) } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupFullNameModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupFullNameModule.kt index 931943d..3a0e289 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupFullNameModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupFullNameModule.kt @@ -16,8 +16,7 @@ fun signupEmailModule() = Kodein.Module { } bind() with autoScopedSingleton(androidActivityScope) { - val content = instance().fragment_signup_email - SignupEmailView(content) + instance().fragment_signup_email.let(::SignupEmailView) } } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNameFragment.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNameFragment.kt index d3fc7b2..c4d03ef 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNameFragment.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNameFragment.kt @@ -17,9 +17,8 @@ class SignupFullNameFragment : RxFragment(), SupportFragmentInjector { private val presenter: SignupFullNamePresenter by instance() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_signup_full_name, container, false) - } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = + inflater.inflate(R.layout.fragment_signup_full_name, container, false) override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNameModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNameModule.kt index a28ab90..d52bc6d 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNameModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNameModule.kt @@ -16,8 +16,7 @@ fun signupFullNameModule() = Kodein.Module { } bind() with autoScopedSingleton(androidActivityScope) { - val content = instance().fragment_signup_full_name - SignupFullNameView(content) + instance().fragment_signup_full_name.let(::SignupFullNameView) } } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNamePresenter.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNamePresenter.kt index bf01de0..0725e29 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNamePresenter.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNamePresenter.kt @@ -33,8 +33,6 @@ class SignupFullNamePresenter( } } - private fun isFormValid(fullName: CharSequence): Boolean { - return fullName.length >= 4 - } + private fun isFormValid(fullName: CharSequence): Boolean = fullName.length >= 4 } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/password/SignupPasswordFragment.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/password/SignupPasswordFragment.kt index 6bf0ee3..85b1c15 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/password/SignupPasswordFragment.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/password/SignupPasswordFragment.kt @@ -17,9 +17,8 @@ class SignupPasswordFragment : RxFragment(), SupportFragmentInjector { private val presenter: SignupPasswordPresenter by instance() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fragment_signup_password, container, false) - } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = + inflater.inflate(R.layout.fragment_signup_password, container, false) override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/password/SignupPasswordModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/password/SignupPasswordModule.kt index 4b03631..9e94b1b 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/password/SignupPasswordModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/password/SignupPasswordModule.kt @@ -16,8 +16,7 @@ fun signupPasswordModule() = Kodein.Module { } bind() with autoScopedSingleton(androidActivityScope) { - val content = instance().fragment_signup_password - SignupPasswordView(content) + instance().fragment_signup_password.let(::SignupPasswordView) } } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/password/SignupPasswordPresenter.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/password/SignupPasswordPresenter.kt index fa97496..e86a4ec 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/password/SignupPasswordPresenter.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/password/SignupPasswordPresenter.kt @@ -41,8 +41,6 @@ class SignupPasswordPresenter( .subscribe { navigator.navigateToMain() } } - private fun isFormValid(password: CharSequence): Boolean { - return password.length >= 8 - } + private fun isFormValid(password: CharSequence): Boolean = password.length >= 8 } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/top/TopModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/top/TopModule.kt index c221cad..451cd0a 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/top/TopModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/top/TopModule.kt @@ -15,8 +15,7 @@ fun topModule() = Kodein.Module { } bind() with autoScopedSingleton(androidActivityScope) { - val content = instance().activity_top - TopView(content) + instance().activity_top.let(::TopView) } } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/detail/UserShowDetailModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/detail/UserShowDetailModule.kt index 4ccf54d..30d7f7c 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/detail/UserShowDetailModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/detail/UserShowDetailModule.kt @@ -16,8 +16,7 @@ fun userShowDetailModule() = Kodein.Module { } bind() with autoScopedSingleton(androidActivityScope) { - val content = instance()._user_detail - UserShowDetailView(content) + instance()._user_detail.let(::UserShowDetailView) } bind() with autoScopedSingleton(androidActivityScope) { diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/detail/UserShowDetailService.kt b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/detail/UserShowDetailService.kt index 3c89525..8e34ab7 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/detail/UserShowDetailService.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/detail/UserShowDetailService.kt @@ -13,12 +13,11 @@ class UserShowDetailService( private val httpErrorHandler: HttpErrorHandler ) { - fun getUser(userId: Long): Observable { - return userInteractor.get(userId) + fun getUser(userId: Long): Observable = + userInteractor.get(userId) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnError { httpErrorHandler.handleError(it) } .onErrorResumeNext { Observable.empty() } - } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/posts/UserShowPostsModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/posts/UserShowPostsModule.kt index 0ecc1f7..f0d74d8 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/posts/UserShowPostsModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/posts/UserShowPostsModule.kt @@ -21,8 +21,8 @@ fun userShowPostsModule() = Kodein.Module { } bind() with autoScopedSingleton(androidActivityScope) { - val content = instance()._user_posts - UserShowPostsView(content, instance()) + instance()._user_posts + .let { UserShowPostsView(it, instance()) } } bind() with autoScopedSingleton(androidActivityScope) { diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/posts/UserShowPostsView.kt b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/posts/UserShowPostsView.kt index ca4deb7..266d0c7 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/posts/UserShowPostsView.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/posts/UserShowPostsView.kt @@ -15,9 +15,10 @@ class UserShowPostsView( private val postRecyclerView = content.postRecyclerView init { - val context = content.context - postRecyclerView.layoutManager = LinearLayoutManager(context) - postRecyclerView.adapter = postListAdapter - postRecyclerView.isNestedScrollingEnabled = false + with(postRecyclerView) { + layoutManager = LinearLayoutManager(context()) + adapter = postListAdapter + isNestedScrollingEnabled = false + } } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/repository/AuthTokenRepositoryImpl.kt b/app/src/main/kotlin/com/hana053/micropost/repository/AuthTokenRepositoryImpl.kt index 5034246..bb5db7a 100644 --- a/app/src/main/kotlin/com/hana053/micropost/repository/AuthTokenRepositoryImpl.kt +++ b/app/src/main/kotlin/com/hana053/micropost/repository/AuthTokenRepositoryImpl.kt @@ -8,20 +8,17 @@ class AuthTokenRepositoryImpl( private val AUTH_TOKEN = "AUTH_TOKEN" - override fun get(): String? { - return sharedPreferences.getString(AUTH_TOKEN, null) - } + override fun get(): String? = + sharedPreferences.getString(AUTH_TOKEN, null) - override fun set(authToken: String) { + override fun set(authToken: String) = sharedPreferences.edit() .putString(AUTH_TOKEN, authToken) .apply() - } - override fun clear() { + override fun clear() = sharedPreferences.edit() .putString(AUTH_TOKEN, null) .apply() - } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/service/AuthServiceImpl.kt b/app/src/main/kotlin/com/hana053/micropost/service/AuthServiceImpl.kt index fe90f2a..8d112ad 100644 --- a/app/src/main/kotlin/com/hana053/micropost/service/AuthServiceImpl.kt +++ b/app/src/main/kotlin/com/hana053/micropost/service/AuthServiceImpl.kt @@ -3,8 +3,6 @@ package com.hana053.micropost.service import com.hana053.micropost.domain.User import com.hana053.micropost.repository.AuthTokenRepository import com.nimbusds.jose.JWSObject -import java.lang.Long -import java.text.ParseException class AuthServiceImpl( @@ -14,13 +12,11 @@ class AuthServiceImpl( override fun isMyself(user: User): Boolean { val authToken = authTokenRepository.get() ?: return false - try { - val jwsObject = JWSObject.parse(authToken) - val sub = jwsObject.payload.toJSONObject()["sub"].toString() - return user.id == Long.valueOf(sub) - } catch (e: ParseException) { - throw RuntimeException(e) - } + return user.id == JWSObject.parse(authToken) + .payload + .toJSONObject()["sub"] + .toString() + .toLong() } diff --git a/app/src/main/kotlin/com/hana053/micropost/service/HttpErrorHandlerImpl.kt b/app/src/main/kotlin/com/hana053/micropost/service/HttpErrorHandlerImpl.kt index 4a95357..c513c6b 100644 --- a/app/src/main/kotlin/com/hana053/micropost/service/HttpErrorHandlerImpl.kt +++ b/app/src/main/kotlin/com/hana053/micropost/service/HttpErrorHandlerImpl.kt @@ -22,11 +22,12 @@ internal class HttpErrorHandlerImpl( } catch (e: ConnectException) { Toast.makeText(context, "Cannot connect to server.", Toast.LENGTH_LONG).show() } catch (e: HttpException) { - if (e.code() == 401) { - Toast.makeText(context, "Please sign in.", Toast.LENGTH_LONG).show() - authService.logout() - } else if (e.code() >= 500) { - Toast.makeText(context, "Something bad happened.", Toast.LENGTH_LONG).show() + when { + e.code() == 401 -> { + Toast.makeText(context, "Please sign in.", Toast.LENGTH_LONG).show() + authService.logout() + } + e.code() >= 500 -> Toast.makeText(context, "Something bad happened.", Toast.LENGTH_LONG).show() } } catch (e: Throwable) { Timber.e(e, "handleHttpError: ${e.message}") diff --git a/app/src/main/kotlin/com/hana053/micropost/service/LoginServiceImpl.kt b/app/src/main/kotlin/com/hana053/micropost/service/LoginServiceImpl.kt index 432514c..03f034a 100644 --- a/app/src/main/kotlin/com/hana053/micropost/service/LoginServiceImpl.kt +++ b/app/src/main/kotlin/com/hana053/micropost/service/LoginServiceImpl.kt @@ -25,11 +25,11 @@ class LoginServiceImpl( .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnNext { authTokenRepository.set(it.token) } - .doOnError { err -> - if (err is HttpException && err.code() == 401) { - Toast.makeText(context, "Email or Password is wrong.", Toast.LENGTH_LONG).show() - } else { - httpErrorHandler.handleError(err) + .doOnError { + when { + it is HttpException && it.code() == 401 -> + Toast.makeText(context, "Email or Password is wrong.", Toast.LENGTH_LONG).show() + else -> httpErrorHandler.handleError(it) } } .onErrorResumeNext(Observable.empty()) diff --git a/app/src/main/kotlin/com/hana053/micropost/shared/avatar/AvatarView.kt b/app/src/main/kotlin/com/hana053/micropost/shared/avatar/AvatarView.kt index 98141b2..b1bf20c 100644 --- a/app/src/main/kotlin/com/hana053/micropost/shared/avatar/AvatarView.kt +++ b/app/src/main/kotlin/com/hana053/micropost/shared/avatar/AvatarView.kt @@ -6,12 +6,14 @@ import com.squareup.picasso.Picasso class AvatarView( - private val content: ImageView + private val content: ImageView, + private val size: Int = 96 + ) { fun render(user: User) { Picasso.with(content.context) - .load(user.avatarUrl(96)) + .load(user.avatarUrl(size)) .into(content) } diff --git a/app/src/main/kotlin/com/hana053/micropost/shared/followbtn/FollowBtnService.kt b/app/src/main/kotlin/com/hana053/micropost/shared/followbtn/FollowBtnService.kt index b5f4b4d..b625597 100644 --- a/app/src/main/kotlin/com/hana053/micropost/shared/followbtn/FollowBtnService.kt +++ b/app/src/main/kotlin/com/hana053/micropost/shared/followbtn/FollowBtnService.kt @@ -16,6 +16,8 @@ class FollowBtnService( fun handleFollowBtnClicks(view: FollowBtnView): Observable { val obs = if (view.isFollowState()) follow(view) else unfollow(view) return obs.withBtnDisabled(view.enabled) + .doOnError { httpErrorHandler.handleError(it) } + .onErrorResumeNext { Observable.empty() } .map { view.user } } @@ -24,8 +26,6 @@ class FollowBtnService( .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnNext { view.toUnfollow() } - .doOnError { httpErrorHandler.handleError(it) } - .onErrorResumeNext { Observable.empty() } } private fun unfollow(view: FollowBtnView): Observable { @@ -33,8 +33,6 @@ class FollowBtnService( .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnNext { view.toFollow() } - .doOnError { httpErrorHandler.handleError(it) } - .onErrorResumeNext { Observable.empty() } } private fun Observable.withBtnDisabled(enabled: Action1): Observable { From 12c03d82585857226f1fdbb8b0d830d4dcf55314 Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Mon, 20 Feb 2017 21:12:41 +0700 Subject: [PATCH 05/39] kotlin scope func for tests --- .../com/hana053/micropost/testing/EspressoHelpers.kt | 10 +++++----- .../micropost/repository/AuthTokenRepositoryTest.kt | 3 +-- .../hana053/micropost/testing/TestSchedulerProxy.kt | 4 +--- .../hana053/micropost/testing/EmptyResponseBody.kt | 12 +++--------- .../com/hana053/micropost/testing/InjectableTest.kt | 8 ++++---- 5 files changed, 14 insertions(+), 23 deletions(-) diff --git a/app/src/androidTest/kotlin/com/hana053/micropost/testing/EspressoHelpers.kt b/app/src/androidTest/kotlin/com/hana053/micropost/testing/EspressoHelpers.kt index 6cdb1e2..16ecd34 100644 --- a/app/src/androidTest/kotlin/com/hana053/micropost/testing/EspressoHelpers.kt +++ b/app/src/androidTest/kotlin/com/hana053/micropost/testing/EspressoHelpers.kt @@ -13,11 +13,11 @@ fun atPositionOnView( targetId: Int ) = object : BoundedMatcher(RecyclerView::class.java) { - override fun matchesSafely(recyclerView: RecyclerView): Boolean { - val viewHolder = recyclerView.findViewHolderForAdapterPosition(position) - val targetView = viewHolder.itemView.findViewById(targetId) - return matcher.matches(targetView) - } + override fun matchesSafely(recyclerView: RecyclerView): Boolean = + recyclerView.findViewHolderForAdapterPosition(position) + .itemView + .findViewById(targetId) + .let { matcher.matches(it) } override fun describeTo(description: Description?) { description?.appendText("has view id $matcher at position $position") diff --git a/app/src/test/kotlin/com/hana053/micropost/repository/AuthTokenRepositoryTest.kt b/app/src/test/kotlin/com/hana053/micropost/repository/AuthTokenRepositoryTest.kt index 0916aba..6e39af5 100644 --- a/app/src/test/kotlin/com/hana053/micropost/repository/AuthTokenRepositoryTest.kt +++ b/app/src/test/kotlin/com/hana053/micropost/repository/AuthTokenRepositoryTest.kt @@ -6,11 +6,10 @@ import org.hamcrest.CoreMatchers.`is` import org.hamcrest.CoreMatchers.nullValue import org.hamcrest.MatcherAssert.assertThat import org.junit.Test -import org.robolectric.RuntimeEnvironment class AuthTokenRepositoryTest : RobolectricBaseTest() { - private val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(RuntimeEnvironment.application) + private val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(app) private val authTokenRepository = AuthTokenRepositoryImpl(sharedPreferences) @Test diff --git a/app/src/test/kotlin/com/hana053/micropost/testing/TestSchedulerProxy.kt b/app/src/test/kotlin/com/hana053/micropost/testing/TestSchedulerProxy.kt index 8bad9b3..c9e9c9a 100644 --- a/app/src/test/kotlin/com/hana053/micropost/testing/TestSchedulerProxy.kt +++ b/app/src/test/kotlin/com/hana053/micropost/testing/TestSchedulerProxy.kt @@ -28,9 +28,7 @@ internal class TestSchedulerProxy { } } - fun get(): TestSchedulerProxy { - return INSTANCE - } + fun get(): TestSchedulerProxy = INSTANCE } } diff --git a/app/src/testShared/kotlin/com/hana053/micropost/testing/EmptyResponseBody.kt b/app/src/testShared/kotlin/com/hana053/micropost/testing/EmptyResponseBody.kt index b4240b4..a05d7d0 100644 --- a/app/src/testShared/kotlin/com/hana053/micropost/testing/EmptyResponseBody.kt +++ b/app/src/testShared/kotlin/com/hana053/micropost/testing/EmptyResponseBody.kt @@ -5,15 +5,9 @@ import okhttp3.ResponseBody import okio.BufferedSource class EmptyResponseBody : ResponseBody() { - override fun contentType(): MediaType? { - return null - } - override fun contentLength(): Long { - return 0 - } + override fun contentType(): MediaType? = null + override fun contentLength(): Long = 0 + override fun source(): BufferedSource? = null - override fun source(): BufferedSource? { - return null - } } diff --git a/app/src/testShared/kotlin/com/hana053/micropost/testing/InjectableTest.kt b/app/src/testShared/kotlin/com/hana053/micropost/testing/InjectableTest.kt index 7c64fd7..d36b8bd 100644 --- a/app/src/testShared/kotlin/com/hana053/micropost/testing/InjectableTest.kt +++ b/app/src/testShared/kotlin/com/hana053/micropost/testing/InjectableTest.kt @@ -13,10 +13,10 @@ interface InjectableTest { @Before fun resetSharedPreferences() { - val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(app) - val editor = sharedPreferences.edit() - editor.clear() - editor.apply() + PreferenceManager.getDefaultSharedPreferences(app).edit() + .clear() + .apply() + } fun overrideAppBindings(init: Kodein.Builder.() -> Unit) { From f80a1b50ad2f4de53f22b7b21c5d151c2c43de7d Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Mon, 20 Feb 2017 21:24:18 +0700 Subject: [PATCH 06/39] refactor interactor module --- .../micropost/interactor/InteractorModule.kt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/com/hana053/micropost/interactor/InteractorModule.kt b/app/src/main/kotlin/com/hana053/micropost/interactor/InteractorModule.kt index 676321d..b6761fe 100644 --- a/app/src/main/kotlin/com/hana053/micropost/interactor/InteractorModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/interactor/InteractorModule.kt @@ -18,15 +18,14 @@ fun interactorModule() = Kodein.Module { val authTokenRepository = instance() OkHttpClient().newBuilder().addInterceptor { chain -> - val authToken = authTokenRepository.get() val original = chain.request() - val builder = original.newBuilder() - if (authToken != null) - builder.header("authorization", "Bearer " + authToken) - val request = builder - .method(original.method(), original.body()) - .build() - chain.proceed(request) + val modified = original.newBuilder().apply { + authTokenRepository.get()?.let { + header("authorization", "Bearer $it") + } + }.method(original.method(), original.body()).build() + + chain.proceed(modified) }.build() } From 26949affd83abb03aa16eac0e316617736dcfd10 Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Mon, 20 Feb 2017 22:48:29 +0700 Subject: [PATCH 07/39] fix StackOverflow in withProgressDialog --- .../com/hana053/micropost/pages/Presenter.kt | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/Presenter.kt b/app/src/main/kotlin/com/hana053/micropost/pages/Presenter.kt index 6979a62..586d223 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/Presenter.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/Presenter.kt @@ -15,20 +15,20 @@ interface Presenter { fun bind() fun Observable.withProgressDialog(): Observable = Observable.using({ - ProgressBar(view.context(), null, android.R.attr.progressBarStyle).apply { + val progressBar = ProgressBar(view.content.context, null, android.R.attr.progressBarStyle).apply { isIndeterminate = true visibility = View.VISIBLE - - val rl = RelativeLayout(view.content.context).apply { - gravity = Gravity.CENTER - addView(this@apply) - } - val layoutParams = RelativeLayout.LayoutParams( - RelativeLayout.LayoutParams.MATCH_PARENT, - RelativeLayout.LayoutParams.MATCH_PARENT - ) - view.content.addView(rl, layoutParams) } + val rl = RelativeLayout(view.content.context).apply { + gravity = Gravity.CENTER + addView(progressBar) + } + val layoutParams = RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.MATCH_PARENT, + RelativeLayout.LayoutParams.MATCH_PARENT + ) + view.content.addView(rl, layoutParams) + progressBar }, { this }, { it.visibility = View.GONE }) From d712fa0f2765b6b0e9718115c76a9452ddef4f65 Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Tue, 21 Feb 2017 08:34:51 +0700 Subject: [PATCH 08/39] fix signup activity --- app/build.gradle | 12 ++++++------ .../hana053/micropost/pages/signup/SignupActivity.kt | 2 +- build.gradle | 8 +++++++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c762b48..01d1442 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,11 +69,11 @@ dependencies { compile "com.squareup.retrofit2:retrofit:$retrofit_version" compile "com.squareup.retrofit2:adapter-rxjava:$retrofit_version" compile "com.squareup.retrofit2:converter-moshi:$retrofit_version" - compile 'com.squareup.okhttp3:okhttp:3.6.0' - compile 'com.squareup.picasso:picasso:2.5.2' - compile 'com.jakewharton.timber:timber:4.3.1' - compile 'com.github.curioustechizen.android-ago:library:1.3.2' - compile group: 'com.nimbusds', name: 'nimbus-jose-jwt', version: '4.34' + compile "com.squareup.okhttp3:okhttp:$okhttp_version" + compile "com.squareup.picasso:picasso:$picasso_version" + compile "com.jakewharton.timber:timber:$timber_version" + compile "com.github.curioustechizen.android-ago:library:$android_ago_version" + compile "com.nimbusds:nimbus-jose-jwt:$jose_jwt_version" debugCompile "com.squareup.leakcanary:leakcanary-android:$leakcanary_version" @@ -93,7 +93,7 @@ dependencies { androidTestCompile "com.android.support:support-annotations:$android_support_version" androidTestCompile "org.mockito:mockito-core:$mockito_version" androidTestCompile "com.nhaarman:mockito-kotlin:$mockito_kotlin_version" - androidTestCompile 'com.linkedin.dexmaker:dexmaker-mockito:2.2.0' + androidTestCompile "com.linkedin.dexmaker:dexmaker-mockito:$dexmaker_mockito_version" androidTestCompile "com.squareup.leakcanary:leakcanary-android-no-op:$leakcanary_version" } repositories { diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupActivity.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupActivity.kt index ca15a9e..f0ee92e 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupActivity.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupActivity.kt @@ -22,7 +22,7 @@ class SignupActivity : RxAppCompatActivity(), AppCompatActivityInjector { initializeInjector() - savedInstanceState?.let { + if (savedInstanceState == null) { supportFragmentManager .beginTransaction() .replace(R.id.container, SignupFullNameFragment()) diff --git a/build.gradle b/build.gradle index 2881c14..e0646ac 100644 --- a/build.gradle +++ b/build.gradle @@ -6,12 +6,18 @@ buildscript { rxbinding_version = '1.0.0' rxlifecycle_version = '1.0' retrofit_version = '2.1.0' + okhttp_version = '3.6.0' + picasso_version = '2.5.2' + timber_version = '4.3.1' + jose_jwt_version = '4.34' + android_ago_version = '1.3.2' robolectric_version = '3.2.2' android_support_test_version = '0.5' espresso_version = '2.2.2' hamcrest_version = '1.3' - mockito_version = '2.7.5' + mockito_version = '2.7.10' mockito_kotlin_version = '1.2.0' + dexmaker_mockito_version = '2.2.0' leakcanary_version = '1.5' } repositories { From b4c9e527dbe3b6791e9a76f62bcd7491fc5edc03 Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Tue, 21 Feb 2017 09:25:07 +0700 Subject: [PATCH 09/39] minor refactoring --- .../com/hana053/micropost/BaseApplication.kt | 2 +- .../com/hana053/micropost/Extensions.kt | 5 ++- .../com/hana053/micropost/domain/Avatar.kt | 3 +- .../hana053/micropost/domain/RelatedUser.kt | 3 +- .../relateduserlist/RelatedUserListAdapter.kt | 6 ++-- .../followerlist/FollowerListService.kt | 6 +--- .../followinglist/FollowingListService.kt | 6 +--- .../pages/signup/SignupServiceImpl.kt | 2 +- .../micropost/pages/signup/SignupState.kt | 3 +- .../signup/email/SignupEmailPresenter.kt | 2 +- .../fullname/SignupFullNamePresenter.kt | 2 +- .../micropost/service/HttpErrorHandlerImpl.kt | 33 ++++++++++--------- .../shared/followbtn/FollowBtnService.kt | 15 ++++----- .../shared/followbtn/FollowBtnView.kt | 8 ++--- .../micropost/shared/posts/PostListAdapter.kt | 2 +- 15 files changed, 41 insertions(+), 57 deletions(-) diff --git a/app/src/main/kotlin/com/hana053/micropost/BaseApplication.kt b/app/src/main/kotlin/com/hana053/micropost/BaseApplication.kt index 7c21617..a34f674 100644 --- a/app/src/main/kotlin/com/hana053/micropost/BaseApplication.kt +++ b/app/src/main/kotlin/com/hana053/micropost/BaseApplication.kt @@ -49,6 +49,6 @@ abstract class BaseApplication : Application(), KodeinAware { Pair(RelatedUserListActivity::class.java, relatedUserListModule()) ) - fun getOverridingModule(clazz: Class<*>): Kodein.Module = overridingModules[clazz]!! + fun getOverridingModule(clazz: Class<*>) = overridingModules[clazz]!! } diff --git a/app/src/main/kotlin/com/hana053/micropost/Extensions.kt b/app/src/main/kotlin/com/hana053/micropost/Extensions.kt index a87af38..c83fe6b 100644 --- a/app/src/main/kotlin/com/hana053/micropost/Extensions.kt +++ b/app/src/main/kotlin/com/hana053/micropost/Extensions.kt @@ -1,7 +1,6 @@ package com.hana053.micropost import android.app.Activity -import com.github.salomonbrys.kodein.Kodein -fun Activity.getOverridingModule(): Kodein.Module = - (application as BaseApplication).getOverridingModule(javaClass) +fun Activity.getOverridingModule() = + (application as BaseApplication).getOverridingModule(this::class.java) diff --git a/app/src/main/kotlin/com/hana053/micropost/domain/Avatar.kt b/app/src/main/kotlin/com/hana053/micropost/domain/Avatar.kt index bfbb344..5409fd5 100644 --- a/app/src/main/kotlin/com/hana053/micropost/domain/Avatar.kt +++ b/app/src/main/kotlin/com/hana053/micropost/domain/Avatar.kt @@ -4,6 +4,5 @@ package com.hana053.micropost.domain interface Avatar { val avatarHash: String - fun avatarUrl(size: Int = 72): String = - "https://secure.gravatar.com/avatar/$avatarHash?s=$size" + fun avatarUrl(size: Int = 72) = "https://secure.gravatar.com/avatar/$avatarHash?s=$size" } diff --git a/app/src/main/kotlin/com/hana053/micropost/domain/RelatedUser.kt b/app/src/main/kotlin/com/hana053/micropost/domain/RelatedUser.kt index 8ac6096..a0057b0 100644 --- a/app/src/main/kotlin/com/hana053/micropost/domain/RelatedUser.kt +++ b/app/src/main/kotlin/com/hana053/micropost/domain/RelatedUser.kt @@ -11,7 +11,6 @@ data class RelatedUser( val relationshipId: Long ) : Avatar { - fun toUser(): User = - User(id, name, email, avatarHash, isFollowedByMe, userStats) + fun toUser() = User(id, name, email, avatarHash, isFollowedByMe, userStats) } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListAdapter.kt b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListAdapter.kt index f6d8cba..d5a5d50 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListAdapter.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListAdapter.kt @@ -31,7 +31,7 @@ class RelatedUserListAdapter( val followBtn: Button = view.followBtn } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = LayoutInflater.from(parent.context) .inflate(R.layout.item_related_users, parent, false) .let(::ViewHolder) @@ -57,9 +57,9 @@ class RelatedUserListAdapter( } } - override fun getItemCount(): Int = users.size + override fun getItemCount() = users.size - fun getLastItemId(): Long? = users.map { it.relationshipId }.lastOrNull() + fun getLastItemId() = users.map { it.relationshipId }.lastOrNull() fun addAll(location: Int, users: List): Boolean { if (this.users.addAll(location, users)) { diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followerlist/FollowerListService.kt b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followerlist/FollowerListService.kt index fe81a75..d9f93a4 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followerlist/FollowerListService.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followerlist/FollowerListService.kt @@ -19,11 +19,7 @@ class FollowerListService( context: Context ) : RelatedUserListService { - private val context: Context - - init { - this.context = context.applicationContext - } + private val context = context.applicationContext override fun listUsers(userId: Long): Observable> { val maxId = adapter.getLastItemId() diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followinglist/FollowingListService.kt b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followinglist/FollowingListService.kt index 6d6cadf..62af020 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followinglist/FollowingListService.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/followinglist/FollowingListService.kt @@ -19,11 +19,7 @@ class FollowingListService( context: Context ) : RelatedUserListService { - private val context: Context - - init { - this.context = context.applicationContext - } + private val context = context.applicationContext override fun listUsers(userId: Long): Observable> { val maxId = adapter.getLastItemId() diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupServiceImpl.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupServiceImpl.kt index 81e0d94..6dae385 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupServiceImpl.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupServiceImpl.kt @@ -39,6 +39,6 @@ class SignupServiceImpl( loginService.login(request.email, request.password) } - private fun isEmailAlreadyTaken(e: Throwable): Boolean = e is HttpException && e.code() == 400 + private fun isEmailAlreadyTaken(e: Throwable) = e is HttpException && e.code() == 400 } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupState.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupState.kt index f901c95..43f23ea 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupState.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/SignupState.kt @@ -9,7 +9,6 @@ data class SignupState( var password: String = "" ) { - fun toSignupRequest(): UserInteractor.SignupRequest = - UserInteractor.SignupRequest(fullName, email, password) + fun toSignupRequest() = UserInteractor.SignupRequest(fullName, email, password) } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupEmailPresenter.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupEmailPresenter.kt index 49f2bc1..cb8c009 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupEmailPresenter.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/email/SignupEmailPresenter.kt @@ -33,7 +33,7 @@ class SignupEmailPresenter( } } - private fun isFormValid(email: CharSequence): Boolean = + private fun isFormValid(email: CharSequence) = "^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*@\\[?([\\d\\w\\.-]+)]?$" .let(String::toRegex) .let { email.matches(it) } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNamePresenter.kt b/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNamePresenter.kt index 0725e29..3d6e615 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNamePresenter.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/signup/fullname/SignupFullNamePresenter.kt @@ -33,6 +33,6 @@ class SignupFullNamePresenter( } } - private fun isFormValid(fullName: CharSequence): Boolean = fullName.length >= 4 + private fun isFormValid(fullName: CharSequence) = fullName.length >= 4 } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/service/HttpErrorHandlerImpl.kt b/app/src/main/kotlin/com/hana053/micropost/service/HttpErrorHandlerImpl.kt index c513c6b..dfe3a53 100644 --- a/app/src/main/kotlin/com/hana053/micropost/service/HttpErrorHandlerImpl.kt +++ b/app/src/main/kotlin/com/hana053/micropost/service/HttpErrorHandlerImpl.kt @@ -15,24 +15,27 @@ internal class HttpErrorHandlerImpl( private val context: Context = context.applicationContext override fun handleError(throwable: Throwable) { - try { - throw throwable - } catch (e: SocketTimeoutException) { - Toast.makeText(context, "Connection timed out.", Toast.LENGTH_LONG).show() - } catch (e: ConnectException) { - Toast.makeText(context, "Cannot connect to server.", Toast.LENGTH_LONG).show() - } catch (e: HttpException) { - when { - e.code() == 401 -> { - Toast.makeText(context, "Please sign in.", Toast.LENGTH_LONG).show() - authService.logout() + when (throwable) { + is SocketTimeoutException -> showToast("Connection timed out.") + is ConnectException -> showToast("Cannot connect to server.") + is HttpException -> { + when { + (throwable.code() == 401) -> { + showToast("Please sign in.") + authService.logout() + } + (throwable.code() >= 500) -> showToast("Something bad happened.") } - e.code() >= 500 -> Toast.makeText(context, "Something bad happened.", Toast.LENGTH_LONG).show() } - } catch (e: Throwable) { - Timber.e(e, "handleHttpError: ${e.message}") - Toast.makeText(context, "Something bad happened.", Toast.LENGTH_LONG).show() + is Throwable -> { + Timber.e(throwable, "handleHttpError: ${throwable.message}") + showToast("Something bad happened.") + } } } + private fun showToast(msg: String) { + Toast.makeText(context, msg, Toast.LENGTH_LONG).show() + } + } diff --git a/app/src/main/kotlin/com/hana053/micropost/shared/followbtn/FollowBtnService.kt b/app/src/main/kotlin/com/hana053/micropost/shared/followbtn/FollowBtnService.kt index b625597..cbecd92 100644 --- a/app/src/main/kotlin/com/hana053/micropost/shared/followbtn/FollowBtnService.kt +++ b/app/src/main/kotlin/com/hana053/micropost/shared/followbtn/FollowBtnService.kt @@ -21,25 +21,22 @@ class FollowBtnService( .map { view.user } } - private fun follow(view: FollowBtnView): Observable { - return relationshipInteractor.follow(view.user.id) + private fun follow(view: FollowBtnView) = + relationshipInteractor.follow(view.user.id) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnNext { view.toUnfollow() } - } - private fun unfollow(view: FollowBtnView): Observable { - return relationshipInteractor.unfollow(view.user.id) + private fun unfollow(view: FollowBtnView) = + relationshipInteractor.unfollow(view.user.id) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnNext { view.toFollow() } - } - private fun Observable.withBtnDisabled(enabled: Action1): Observable { - return Observable.using({ + private fun Observable.withBtnDisabled(enabled: Action1) = + Observable.using({ enabled.call(false) }, { this }, { enabled.call(true) }) - } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/shared/followbtn/FollowBtnView.kt b/app/src/main/kotlin/com/hana053/micropost/shared/followbtn/FollowBtnView.kt index 6949465..ae458f2 100644 --- a/app/src/main/kotlin/com/hana053/micropost/shared/followbtn/FollowBtnView.kt +++ b/app/src/main/kotlin/com/hana053/micropost/shared/followbtn/FollowBtnView.kt @@ -34,9 +34,7 @@ class FollowBtnView( this._user = user } - fun clicks(): Observable { - return button.clicks().map { this } - } + fun clicks(): Observable = button.clicks().map { this } fun toFollow() { button.text = FOLLOW @@ -46,8 +44,6 @@ class FollowBtnView( button.text = UNFOLLOW } - fun isFollowState(): Boolean { - return button.text == FOLLOW - } + fun isFollowState() = button.text == FOLLOW } \ No newline at end of file diff --git a/app/src/main/kotlin/com/hana053/micropost/shared/posts/PostListAdapter.kt b/app/src/main/kotlin/com/hana053/micropost/shared/posts/PostListAdapter.kt index fb0e49f..c1ffb91 100644 --- a/app/src/main/kotlin/com/hana053/micropost/shared/posts/PostListAdapter.kt +++ b/app/src/main/kotlin/com/hana053/micropost/shared/posts/PostListAdapter.kt @@ -30,7 +30,7 @@ class PostListAdapter( val content: TextView = view.content } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = LayoutInflater.from(parent.context) .inflate(R.layout.item_posts, parent, false) .let(::ViewHolder) From 0cde1dec733fe1aac510486ca1a93da76946d776 Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Tue, 21 Feb 2017 09:42:11 +0700 Subject: [PATCH 10/39] fix getting java class --- app/src/main/kotlin/com/hana053/micropost/Extensions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/hana053/micropost/Extensions.kt b/app/src/main/kotlin/com/hana053/micropost/Extensions.kt index c83fe6b..6b5de5d 100644 --- a/app/src/main/kotlin/com/hana053/micropost/Extensions.kt +++ b/app/src/main/kotlin/com/hana053/micropost/Extensions.kt @@ -3,4 +3,4 @@ package com.hana053.micropost import android.app.Activity fun Activity.getOverridingModule() = - (application as BaseApplication).getOverridingModule(this::class.java) + (application as BaseApplication).getOverridingModule(javaClass) From f11acd3d2120d69a6dddc5a72fb83252d2bead11 Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Tue, 21 Feb 2017 09:44:13 +0700 Subject: [PATCH 11/39] use autoScopedSingleton(androidActivityScope) --- .../relateduserlist/RelatedUserListModule.kt | 15 ++++++++++----- .../micropost/pages/usershow/UserShowModule.kt | 5 +++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListModule.kt index 9fe351f..9d94d48 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/relateduserlist/RelatedUserListModule.kt @@ -1,8 +1,11 @@ package com.hana053.micropost.pages.relateduserlist import android.app.Activity -import com.github.salomonbrys.kodein.* +import com.github.salomonbrys.kodein.Kodein import com.github.salomonbrys.kodein.android.androidActivityScope +import com.github.salomonbrys.kodein.autoScopedSingleton +import com.github.salomonbrys.kodein.bind +import com.github.salomonbrys.kodein.instance import com.hana053.micropost.pages.relateduserlist.RelatedUserListActivity.Companion.KEY_LIST_TYPE import com.hana053.micropost.pages.relateduserlist.RelatedUserListActivity.Companion.KEY_USER_ID import com.hana053.micropost.pages.relateduserlist.RelatedUserListActivity.ListType.FOLLOWER @@ -35,15 +38,17 @@ fun relatedUserListModule() = Kodein.Module { } } - bind(KEY_USER_ID) with provider { - instance().intent.extras.getLong(KEY_USER_ID) + bind(KEY_USER_ID) with autoScopedSingleton(androidActivityScope) { + extras().getLong(KEY_USER_ID) } - bind() with provider { - instance().intent.extras.getSerializable(KEY_LIST_TYPE) as RelatedUserListActivity.ListType + bind() with autoScopedSingleton(androidActivityScope) { + extras().getSerializable(KEY_LIST_TYPE) as RelatedUserListActivity.ListType } import(followBtnModule()) } +private fun Kodein.extras() = instance().intent.extras + diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/UserShowModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/UserShowModule.kt index baa7cb3..000c310 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/UserShowModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/UserShowModule.kt @@ -2,9 +2,10 @@ package com.hana053.micropost.pages.usershow import android.app.Activity import com.github.salomonbrys.kodein.Kodein +import com.github.salomonbrys.kodein.android.androidActivityScope +import com.github.salomonbrys.kodein.autoScopedSingleton import com.github.salomonbrys.kodein.bind import com.github.salomonbrys.kodein.instance -import com.github.salomonbrys.kodein.provider import com.hana053.micropost.pages.usershow.UserShowActivity.Companion.KEY_USER_ID import com.hana053.micropost.pages.usershow.detail.userShowDetailModule import com.hana053.micropost.pages.usershow.posts.userShowPostsModule @@ -12,7 +13,7 @@ import com.hana053.micropost.shared.followbtn.followBtnModule fun userShowModule() = Kodein.Module { - bind(KEY_USER_ID) with provider { + bind(KEY_USER_ID) with autoScopedSingleton(androidActivityScope) { instance().intent.extras.getLong(KEY_USER_ID) } From 6f297a43f8665cfb4210e10b4973bba4b9dbd3d8 Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Tue, 21 Feb 2017 09:48:10 +0700 Subject: [PATCH 12/39] minor refactoring for testing --- .../kotlin/com/hana053/micropost/testing/EspressoHelpers.kt | 2 +- .../com/hana053/micropost/pages/usershow/UserShowModule.kt | 1 - .../com/hana053/micropost/testing/TestSchedulerProxy.kt | 2 +- .../com/hana053/micropost/testing/EmptyResponseBody.kt | 6 ++---- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/src/androidTest/kotlin/com/hana053/micropost/testing/EspressoHelpers.kt b/app/src/androidTest/kotlin/com/hana053/micropost/testing/EspressoHelpers.kt index 16ecd34..7943acd 100644 --- a/app/src/androidTest/kotlin/com/hana053/micropost/testing/EspressoHelpers.kt +++ b/app/src/androidTest/kotlin/com/hana053/micropost/testing/EspressoHelpers.kt @@ -13,7 +13,7 @@ fun atPositionOnView( targetId: Int ) = object : BoundedMatcher(RecyclerView::class.java) { - override fun matchesSafely(recyclerView: RecyclerView): Boolean = + override fun matchesSafely(recyclerView: RecyclerView) = recyclerView.findViewHolderForAdapterPosition(position) .itemView .findViewById(targetId) diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/UserShowModule.kt b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/UserShowModule.kt index 000c310..d9ab323 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/usershow/UserShowModule.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/usershow/UserShowModule.kt @@ -23,4 +23,3 @@ fun userShowModule() = Kodein.Module { } - diff --git a/app/src/test/kotlin/com/hana053/micropost/testing/TestSchedulerProxy.kt b/app/src/test/kotlin/com/hana053/micropost/testing/TestSchedulerProxy.kt index c9e9c9a..12e7ab1 100644 --- a/app/src/test/kotlin/com/hana053/micropost/testing/TestSchedulerProxy.kt +++ b/app/src/test/kotlin/com/hana053/micropost/testing/TestSchedulerProxy.kt @@ -28,7 +28,7 @@ internal class TestSchedulerProxy { } } - fun get(): TestSchedulerProxy = INSTANCE + fun get() = INSTANCE } } diff --git a/app/src/testShared/kotlin/com/hana053/micropost/testing/EmptyResponseBody.kt b/app/src/testShared/kotlin/com/hana053/micropost/testing/EmptyResponseBody.kt index a05d7d0..c55654b 100644 --- a/app/src/testShared/kotlin/com/hana053/micropost/testing/EmptyResponseBody.kt +++ b/app/src/testShared/kotlin/com/hana053/micropost/testing/EmptyResponseBody.kt @@ -1,13 +1,11 @@ package com.hana053.micropost.testing -import okhttp3.MediaType import okhttp3.ResponseBody -import okio.BufferedSource class EmptyResponseBody : ResponseBody() { - override fun contentType(): MediaType? = null + override fun contentType() = null override fun contentLength(): Long = 0 - override fun source(): BufferedSource? = null + override fun source() = null } From d4b91198c956aaea82e7bba9f301190773102732 Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Tue, 21 Feb 2017 10:12:26 +0700 Subject: [PATCH 13/39] try configuring jvmargs --- gradle.properties.ci.example | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gradle.properties.ci.example b/gradle.properties.ci.example index 7cafc01..23160de 100644 --- a/gradle.properties.ci.example +++ b/gradle.properties.ci.example @@ -1 +1,5 @@ +org.gradle.daemon=true +org.gradle.jvmargs=-Xmx2560m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + micropost.apiUrl="http://localhost/api/" + From ac140159ea5b7f8c4390de51927cbc5f9ba9b14b Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Tue, 21 Feb 2017 10:30:37 +0700 Subject: [PATCH 14/39] revert gradle.properties for ci --- gradle.properties.ci.example | 3 --- 1 file changed, 3 deletions(-) diff --git a/gradle.properties.ci.example b/gradle.properties.ci.example index 23160de..226932e 100644 --- a/gradle.properties.ci.example +++ b/gradle.properties.ci.example @@ -1,5 +1,2 @@ -org.gradle.daemon=true -org.gradle.jvmargs=-Xmx2560m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 - micropost.apiUrl="http://localhost/api/" From f6ffe0096fd686f142c80448736d78273fecde46 Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Tue, 21 Feb 2017 11:40:26 +0700 Subject: [PATCH 15/39] Introduce TestButler --- app/build.gradle | 3 ++- .../micropost/testing/AppTestRunner.kt | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 app/src/androidTest/kotlin/com/hana053/micropost/testing/AppTestRunner.kt diff --git a/app/build.gradle b/app/build.gradle index 01d1442..2447d41 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,7 +12,7 @@ android { targetSdkVersion 25 versionCode 1 versionName "1.0.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "com.hana053.micropost.testing.AppTestRunner" multiDexEnabled = true buildConfigField('String', 'API_URL', getProperty("micropost.apiUrl")) } @@ -95,6 +95,7 @@ dependencies { androidTestCompile "com.nhaarman:mockito-kotlin:$mockito_kotlin_version" androidTestCompile "com.linkedin.dexmaker:dexmaker-mockito:$dexmaker_mockito_version" androidTestCompile "com.squareup.leakcanary:leakcanary-android-no-op:$leakcanary_version" + androidTestCompile "com.linkedin.testbutler:test-butler-library:1.2.0" } repositories { mavenCentral() diff --git a/app/src/androidTest/kotlin/com/hana053/micropost/testing/AppTestRunner.kt b/app/src/androidTest/kotlin/com/hana053/micropost/testing/AppTestRunner.kt new file mode 100644 index 0000000..1b1635c --- /dev/null +++ b/app/src/androidTest/kotlin/com/hana053/micropost/testing/AppTestRunner.kt @@ -0,0 +1,21 @@ +package com.hana053.micropost.testing + +import android.os.Bundle +import android.support.test.InstrumentationRegistry +import android.support.test.runner.AndroidJUnitRunner +import com.linkedin.android.testbutler.TestButler + + +class AppTestRunner : AndroidJUnitRunner() { + + override fun onStart() { + TestButler.setup(InstrumentationRegistry.getTargetContext()) + super.onStart() + } + + override fun finish(resultCode: Int, results: Bundle) { + TestButler.teardown(InstrumentationRegistry.getTargetContext()) + super.finish(resultCode, results) + } + +} \ No newline at end of file From dbd04850604b29c5cdb86bb1abfff640b25098fb Mon Sep 17 00:00:00 2001 From: Akira Sosa Date: Tue, 21 Feb 2017 10:29:36 +0700 Subject: [PATCH 16/39] rename view id on top --- .../kotlin/com/hana053/micropost/pages/top/TopActivityTest.kt | 4 ++-- .../main/kotlin/com/hana053/micropost/pages/top/TopView.kt | 4 ++-- app/src/main/res/layout/activity_top.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/androidTest/kotlin/com/hana053/micropost/pages/top/TopActivityTest.kt b/app/src/androidTest/kotlin/com/hana053/micropost/pages/top/TopActivityTest.kt index 80cb03b..1ee4c3e 100644 --- a/app/src/androidTest/kotlin/com/hana053/micropost/pages/top/TopActivityTest.kt +++ b/app/src/androidTest/kotlin/com/hana053/micropost/pages/top/TopActivityTest.kt @@ -42,7 +42,7 @@ class TopActivityTest : InjectableTest by InjectableTestImpl() { } activityRule.launchActivity(null) - onView(withId(R.id.signupBtn)).perform(click()) + onView(withId(R.id.btn_signup)).perform(click()) verify(navigator).navigateToSignup() } @@ -55,7 +55,7 @@ class TopActivityTest : InjectableTest by InjectableTestImpl() { } activityRule.launchActivity(null) - onView(withId(R.id.loginBtn)).perform(click()) + onView(withId(R.id.btn_login)).perform(click()) verify(navigator).navigateToLogin() } diff --git a/app/src/main/kotlin/com/hana053/micropost/pages/top/TopView.kt b/app/src/main/kotlin/com/hana053/micropost/pages/top/TopView.kt index 76594a9..cfbb5ad 100644 --- a/app/src/main/kotlin/com/hana053/micropost/pages/top/TopView.kt +++ b/app/src/main/kotlin/com/hana053/micropost/pages/top/TopView.kt @@ -7,6 +7,6 @@ import kotlinx.android.synthetic.main.activity_top.view.* class TopView(override val content: ViewGroup) : ViewWrapper { - val signupClicks = content.signupBtn.clicks() - val loginClicks = content.loginBtn.clicks() + val signupClicks = content.btn_signup.clicks() + val loginClicks = content.btn_login.clicks() } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_top.xml b/app/src/main/res/layout/activity_top.xml index 7d284c8..8592b95 100644 --- a/app/src/main/res/layout/activity_top.xml +++ b/app/src/main/res/layout/activity_top.xml @@ -40,7 +40,7 @@ android:paddingRight="72dp">