From 3f739d208412df0ba4e50b689dce2aad941824f5 Mon Sep 17 00:00:00 2001 From: Bapusaheb Patil Date: Fri, 23 Mar 2018 21:46:01 +0530 Subject: [PATCH 1/3] Dependencies updated + Kotlin dependencies [COMMENTED FOR NOW] --- app/build.gradle | 54 ++++++++++++++----- .../io/caster/simplemvp/AppComponent.java | 2 +- .../java/io/caster/simplemvp/AppModule.java | 5 +- .../io/caster/simplemvp/MvpApplication.java | 3 +- .../simplemvp/presentation/UserPresenter.java | 2 + .../presentation/UserPresenterImpl.java | 6 +-- .../InMemoryUserRepositoryImpl.java | 2 +- .../simplemvp/repository/UserRepository.java | 1 + .../io/caster/simplemvp/view/UserView.java | 3 ++ .../simplemvp/view/activity/MainActivity.java | 2 +- .../simplemvp/view/fragment/UserFragment.java | 15 ++---- build.gradle | 15 ++++-- gradle.properties | 21 ++------ gradle/wrapper/gradle-wrapper.properties | 2 +- 14 files changed, 76 insertions(+), 57 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7586326..e4f4d87 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,14 +1,16 @@ apply plugin: 'com.android.application' -apply plugin: 'com.neenbedankt.android-apt' +//apply plugin: 'kotlin-android' +//apply plugin: 'kotlin-android-extensions' +//apply plugin: 'kotlin-kapt' android { - compileSdkVersion 23 - buildToolsVersion "23.0.2" + compileSdkVersion 27 + buildToolsVersion "27.0.3" defaultConfig { applicationId "io.caster.simplemvp" minSdkVersion 16 - targetSdkVersion 23 + targetSdkVersion 27 versionCode 1 versionName "1.0" } @@ -19,17 +21,43 @@ android { } } } +// +//kotlin { +// experimental { +// coroutines "enable" +// } +//} +// +//androidExtensions { +// experimental true +//} +// +//kapt { +// generateStubs true +//} dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' - testCompile "org.mockito:mockito-core:1.10.19" + implementation fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:design:23.1.1' + // Test dependencies + testImplementation 'junit:junit:4.12' + testImplementation 'org.mockito:mockito-core:2.16.0' - compile 'com.jakewharton:butterknife:7.0.1' - compile 'com.google.dagger:dagger:2.0.2' - apt 'com.google.dagger:dagger-compiler:2.0.2' - provided 'javax.annotation:jsr250-api:1.0' + // Kotlin dependencies +// implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlinVer" +// implementation "org.jetbrains.anko:anko:$ankoVer" +// implementation "org.jetbrains.anko:anko-design:$ankoVer" + + // Support Library dependencies + implementation 'com.android.support:appcompat-v7:27.1.0' + implementation 'com.android.support:design:27.1.0' + implementation 'com.android.support:support-v4:27.1.0' + + // Dagger 2 dependencies + implementation 'com.google.dagger:dagger:2.15' + implementation 'com.google.dagger:dagger-android:2.15' + implementation 'com.google.dagger:dagger-android-support:2.15' + annotationProcessor 'com.google.dagger:dagger-compiler:2.15' + annotationProcessor 'com.google.dagger:dagger-android-processor:2.15' + compileOnly 'javax.annotation:jsr250-api:1.0' } diff --git a/app/src/main/java/io/caster/simplemvp/AppComponent.java b/app/src/main/java/io/caster/simplemvp/AppComponent.java index 103a29c..6789f25 100644 --- a/app/src/main/java/io/caster/simplemvp/AppComponent.java +++ b/app/src/main/java/io/caster/simplemvp/AppComponent.java @@ -6,7 +6,7 @@ import io.caster.simplemvp.view.fragment.UserFragment; @Singleton -@Component(modules = { AppModule.class }) +@Component(modules = {AppModule.class}) public interface AppComponent { void inject(UserFragment target); } diff --git a/app/src/main/java/io/caster/simplemvp/AppModule.java b/app/src/main/java/io/caster/simplemvp/AppModule.java index 345616c..3faea88 100644 --- a/app/src/main/java/io/caster/simplemvp/AppModule.java +++ b/app/src/main/java/io/caster/simplemvp/AppModule.java @@ -6,12 +6,13 @@ import dagger.Provides; import io.caster.simplemvp.presentation.UserPresenter; import io.caster.simplemvp.presentation.UserPresenterImpl; -import io.caster.simplemvp.repository.UserRepository; import io.caster.simplemvp.repository.InMemoryUserRepositoryImpl; +import io.caster.simplemvp.repository.UserRepository; @Module public class AppModule { - @Provides @Singleton + @Provides + @Singleton public UserRepository provideUserRepository() { return new InMemoryUserRepositoryImpl(); } diff --git a/app/src/main/java/io/caster/simplemvp/MvpApplication.java b/app/src/main/java/io/caster/simplemvp/MvpApplication.java index 01b35e6..269ee91 100644 --- a/app/src/main/java/io/caster/simplemvp/MvpApplication.java +++ b/app/src/main/java/io/caster/simplemvp/MvpApplication.java @@ -6,7 +6,6 @@ public class MvpApplication extends Application { private AppComponent component; - @Override public void onCreate() { super.onCreate(); @@ -16,6 +15,6 @@ public void onCreate() { } public AppComponent getComponent() { - return component; + return component; } } diff --git a/app/src/main/java/io/caster/simplemvp/presentation/UserPresenter.java b/app/src/main/java/io/caster/simplemvp/presentation/UserPresenter.java index d07e2f5..16b820f 100644 --- a/app/src/main/java/io/caster/simplemvp/presentation/UserPresenter.java +++ b/app/src/main/java/io/caster/simplemvp/presentation/UserPresenter.java @@ -4,6 +4,8 @@ public interface UserPresenter { void loadUserDetails(); + void setView(UserView view); + void saveUser(); } diff --git a/app/src/main/java/io/caster/simplemvp/presentation/UserPresenterImpl.java b/app/src/main/java/io/caster/simplemvp/presentation/UserPresenterImpl.java index 08304d9..6fbe563 100644 --- a/app/src/main/java/io/caster/simplemvp/presentation/UserPresenterImpl.java +++ b/app/src/main/java/io/caster/simplemvp/presentation/UserPresenterImpl.java @@ -18,7 +18,7 @@ public UserPresenterImpl(UserRepository userRepository) { public void loadUserDetails() { int userId = view.getUserId(); u = userRepository.getUser(userId); - if(u == null) { + if (u == null) { view.showUserNotFoundMessage(); } else { view.displayFirstName(u.getFirstName()); @@ -34,8 +34,8 @@ public void setView(UserView view) { @Override public void saveUser() { - if(u != null) { - if(view.getFirstName().trim().equals("") || view.getLastName().trim().equals("")) { + if (u != null) { + if (view.getFirstName().trim().equals("") || view.getLastName().trim().equals("")) { view.showUserNameIsRequired(); } else { u.setFirstName(view.getFirstName()); diff --git a/app/src/main/java/io/caster/simplemvp/repository/InMemoryUserRepositoryImpl.java b/app/src/main/java/io/caster/simplemvp/repository/InMemoryUserRepositoryImpl.java index 35bc0b6..f8ddac3 100644 --- a/app/src/main/java/io/caster/simplemvp/repository/InMemoryUserRepositoryImpl.java +++ b/app/src/main/java/io/caster/simplemvp/repository/InMemoryUserRepositoryImpl.java @@ -32,7 +32,7 @@ public User getUser(int id) { */ @Override public void save(User u) { - if(this.u == null) { + if (this.u == null) { this.u = getUser(0); // create the in memory user. } this.u.setId(u.getId()); diff --git a/app/src/main/java/io/caster/simplemvp/repository/UserRepository.java b/app/src/main/java/io/caster/simplemvp/repository/UserRepository.java index e071fd0..35e1f8f 100644 --- a/app/src/main/java/io/caster/simplemvp/repository/UserRepository.java +++ b/app/src/main/java/io/caster/simplemvp/repository/UserRepository.java @@ -4,5 +4,6 @@ public interface UserRepository { User getUser(int id); + void save(User u); } diff --git a/app/src/main/java/io/caster/simplemvp/view/UserView.java b/app/src/main/java/io/caster/simplemvp/view/UserView.java index 5592871..9715c5b 100644 --- a/app/src/main/java/io/caster/simplemvp/view/UserView.java +++ b/app/src/main/java/io/caster/simplemvp/view/UserView.java @@ -4,12 +4,15 @@ public interface UserView { int getUserId(); void displayFirstName(String name); + void displayLastName(String name); void showUserNotFoundMessage(); + void showUserSavedMessage(); String getFirstName(); + String getLastName(); void showUserNameIsRequired(); diff --git a/app/src/main/java/io/caster/simplemvp/view/activity/MainActivity.java b/app/src/main/java/io/caster/simplemvp/view/activity/MainActivity.java index f33d4c7..d05b272 100644 --- a/app/src/main/java/io/caster/simplemvp/view/activity/MainActivity.java +++ b/app/src/main/java/io/caster/simplemvp/view/activity/MainActivity.java @@ -5,9 +5,9 @@ import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; -import android.view.View; import android.view.Menu; import android.view.MenuItem; +import android.view.View; import io.caster.simplemvp.R; diff --git a/app/src/main/java/io/caster/simplemvp/view/fragment/UserFragment.java b/app/src/main/java/io/caster/simplemvp/view/fragment/UserFragment.java index fb07e43..de8b73a 100644 --- a/app/src/main/java/io/caster/simplemvp/view/fragment/UserFragment.java +++ b/app/src/main/java/io/caster/simplemvp/view/fragment/UserFragment.java @@ -1,21 +1,16 @@ package io.caster.simplemvp.view.fragment; +import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; -import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import android.widget.EditText; -import android.widget.TextView; import android.widget.Toast; import javax.inject.Inject; -import butterknife.Bind; -import butterknife.ButterKnife; -import butterknife.OnClick; import io.caster.simplemvp.MvpApplication; import io.caster.simplemvp.R; import io.caster.simplemvp.presentation.UserPresenter; @@ -26,12 +21,10 @@ */ public class UserFragment extends Fragment implements UserView { - @Inject UserPresenter userPresenter; - + private static final String USER_ID = "user_id"; protected EditText userFirstName; protected EditText userLastName; - - private static final String USER_ID = "user_id"; + @Inject UserPresenter userPresenter; public UserFragment() { } @@ -39,7 +32,7 @@ public UserFragment() { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ((MvpApplication)getActivity().getApplication()).getComponent().inject(this); + ((MvpApplication) getActivity().getApplication()).getComponent().inject(this); } @Override diff --git a/build.gradle b/build.gradle index a6cf621..e644e1a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,23 +1,30 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + ext { + kotlinVer = '1.2.31' + ankoVer = '0.10.4' + } repositories { jcenter() + google() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:2.0.0-rc2' - classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files + classpath 'com.android.tools.build:gradle:3.0.1' +// classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVer" } } allprojects { repositories { jcenter() + google() + mavenCentral() } } + task clean(type: Delete) { delete rootProject.buildDir } diff --git a/gradle.properties b/gradle.properties index 1d3591c..f92ca66 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,18 +1,3 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true \ No newline at end of file +org.gradle.parallel=true +org.gradle.daemon=true +org.gradle.jvmargs=-Xms256m -Xmx1024m \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 122a0dc..c3510d6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip From 9a3e66d0c88d2a5c18263084b4a8a0688618da27 Mon Sep 17 00:00:00 2001 From: Bapusaheb Patil Date: Fri, 23 Mar 2018 23:39:15 +0530 Subject: [PATCH 2/3] Migrated to Kotlin --- app/build.gradle | 44 ++--- .../io/caster/simplemvp/ApplicationTest.java | 13 -- .../io/caster/simplemvp/ApplicationTest.kt | 9 + .../io/caster/simplemvp/AppComponent.java | 12 -- .../java/io/caster/simplemvp/AppComponent.kt | 11 ++ .../java/io/caster/simplemvp/AppModule.java | 24 --- .../java/io/caster/simplemvp/AppModule.kt | 19 ++ .../io/caster/simplemvp/MvpApplication.java | 20 --- .../io/caster/simplemvp/MvpApplication.kt | 14 ++ .../java/io/caster/simplemvp/model/User.java | 32 ---- .../java/io/caster/simplemvp/model/User.kt | 7 + .../simplemvp/presentation/UserPresenter.java | 11 -- .../simplemvp/presentation/UserPresenter.kt | 11 ++ .../presentation/UserPresenterImpl.java | 49 ------ .../presentation/UserPresenterImpl.kt | 41 +++++ .../InMemoryUserRepositoryImpl.java | 42 ----- .../repository/InMemoryUserRepositoryImpl.kt | 40 +++++ .../simplemvp/repository/UserRepository.java | 9 - .../simplemvp/repository/UserRepository.kt | 9 + .../io/caster/simplemvp/view/UserView.java | 19 -- .../java/io/caster/simplemvp/view/UserView.kt | 19 ++ .../simplemvp/view/activity/MainActivity.java | 54 ------ .../simplemvp/view/activity/MainActivity.kt | 44 +++++ .../simplemvp/view/fragment/UserFragment.java | 98 ----------- .../simplemvp/view/fragment/UserFragment.kt | 71 ++++++++ app/src/main/res/layout/fragment_main.xml | 6 +- .../io/caster/simplemvp/PresenterTests.java | 163 ------------------ .../io/caster/simplemvp/PresenterTests.kt | 154 +++++++++++++++++ build.gradle | 2 +- 29 files changed, 475 insertions(+), 572 deletions(-) delete mode 100644 app/src/androidTest/java/io/caster/simplemvp/ApplicationTest.java create mode 100644 app/src/androidTest/java/io/caster/simplemvp/ApplicationTest.kt delete mode 100644 app/src/main/java/io/caster/simplemvp/AppComponent.java create mode 100644 app/src/main/java/io/caster/simplemvp/AppComponent.kt delete mode 100644 app/src/main/java/io/caster/simplemvp/AppModule.java create mode 100644 app/src/main/java/io/caster/simplemvp/AppModule.kt delete mode 100644 app/src/main/java/io/caster/simplemvp/MvpApplication.java create mode 100644 app/src/main/java/io/caster/simplemvp/MvpApplication.kt delete mode 100644 app/src/main/java/io/caster/simplemvp/model/User.java create mode 100644 app/src/main/java/io/caster/simplemvp/model/User.kt delete mode 100644 app/src/main/java/io/caster/simplemvp/presentation/UserPresenter.java create mode 100644 app/src/main/java/io/caster/simplemvp/presentation/UserPresenter.kt delete mode 100644 app/src/main/java/io/caster/simplemvp/presentation/UserPresenterImpl.java create mode 100644 app/src/main/java/io/caster/simplemvp/presentation/UserPresenterImpl.kt delete mode 100644 app/src/main/java/io/caster/simplemvp/repository/InMemoryUserRepositoryImpl.java create mode 100644 app/src/main/java/io/caster/simplemvp/repository/InMemoryUserRepositoryImpl.kt delete mode 100644 app/src/main/java/io/caster/simplemvp/repository/UserRepository.java create mode 100644 app/src/main/java/io/caster/simplemvp/repository/UserRepository.kt delete mode 100644 app/src/main/java/io/caster/simplemvp/view/UserView.java create mode 100644 app/src/main/java/io/caster/simplemvp/view/UserView.kt delete mode 100644 app/src/main/java/io/caster/simplemvp/view/activity/MainActivity.java create mode 100644 app/src/main/java/io/caster/simplemvp/view/activity/MainActivity.kt delete mode 100644 app/src/main/java/io/caster/simplemvp/view/fragment/UserFragment.java create mode 100644 app/src/main/java/io/caster/simplemvp/view/fragment/UserFragment.kt delete mode 100644 app/src/test/java/io/caster/simplemvp/PresenterTests.java create mode 100644 app/src/test/java/io/caster/simplemvp/PresenterTests.kt diff --git a/app/build.gradle b/app/build.gradle index e4f4d87..b455807 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.application' -//apply plugin: 'kotlin-android' -//apply plugin: 'kotlin-android-extensions' -//apply plugin: 'kotlin-kapt' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' android { compileSdkVersion 27 @@ -21,20 +21,20 @@ android { } } } -// -//kotlin { -// experimental { -// coroutines "enable" -// } -//} -// -//androidExtensions { -// experimental true -//} -// -//kapt { -// generateStubs true -//} + +kotlin { + experimental { + coroutines "enable" + } +} + +androidExtensions { + experimental true +} + +kapt { + generateStubs true +} dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) @@ -44,9 +44,9 @@ dependencies { testImplementation 'org.mockito:mockito-core:2.16.0' // Kotlin dependencies -// implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlinVer" -// implementation "org.jetbrains.anko:anko:$ankoVer" -// implementation "org.jetbrains.anko:anko-design:$ankoVer" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlinVer" + implementation "org.jetbrains.anko:anko:$ankoVer" + implementation "org.jetbrains.anko:anko-design:$ankoVer" // Support Library dependencies implementation 'com.android.support:appcompat-v7:27.1.0' @@ -57,7 +57,7 @@ dependencies { implementation 'com.google.dagger:dagger:2.15' implementation 'com.google.dagger:dagger-android:2.15' implementation 'com.google.dagger:dagger-android-support:2.15' - annotationProcessor 'com.google.dagger:dagger-compiler:2.15' - annotationProcessor 'com.google.dagger:dagger-android-processor:2.15' + kapt 'com.google.dagger:dagger-compiler:2.15' + kapt 'com.google.dagger:dagger-android-processor:2.15' compileOnly 'javax.annotation:jsr250-api:1.0' } diff --git a/app/src/androidTest/java/io/caster/simplemvp/ApplicationTest.java b/app/src/androidTest/java/io/caster/simplemvp/ApplicationTest.java deleted file mode 100644 index 8810cfe..0000000 --- a/app/src/androidTest/java/io/caster/simplemvp/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.caster.simplemvp; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/io/caster/simplemvp/ApplicationTest.kt b/app/src/androidTest/java/io/caster/simplemvp/ApplicationTest.kt new file mode 100644 index 0000000..06b883b --- /dev/null +++ b/app/src/androidTest/java/io/caster/simplemvp/ApplicationTest.kt @@ -0,0 +1,9 @@ +package io.caster.simplemvp + +import android.app.Application +import android.test.ApplicationTestCase + +/** + * [Testing Fundamentals](http://d.android.com/tools/testing/testing_android.html) + */ +class ApplicationTest : ApplicationTestCase(Application::class.java) \ No newline at end of file diff --git a/app/src/main/java/io/caster/simplemvp/AppComponent.java b/app/src/main/java/io/caster/simplemvp/AppComponent.java deleted file mode 100644 index 6789f25..0000000 --- a/app/src/main/java/io/caster/simplemvp/AppComponent.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.caster.simplemvp; - -import javax.inject.Singleton; - -import dagger.Component; -import io.caster.simplemvp.view.fragment.UserFragment; - -@Singleton -@Component(modules = {AppModule.class}) -public interface AppComponent { - void inject(UserFragment target); -} diff --git a/app/src/main/java/io/caster/simplemvp/AppComponent.kt b/app/src/main/java/io/caster/simplemvp/AppComponent.kt new file mode 100644 index 0000000..e3b8561 --- /dev/null +++ b/app/src/main/java/io/caster/simplemvp/AppComponent.kt @@ -0,0 +1,11 @@ +package io.caster.simplemvp + +import dagger.Component +import io.caster.simplemvp.view.fragment.UserFragment +import javax.inject.Singleton + +@Singleton +@Component(modules = [AppModule::class]) +interface AppComponent { + fun inject(target: UserFragment) +} diff --git a/app/src/main/java/io/caster/simplemvp/AppModule.java b/app/src/main/java/io/caster/simplemvp/AppModule.java deleted file mode 100644 index 3faea88..0000000 --- a/app/src/main/java/io/caster/simplemvp/AppModule.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.caster.simplemvp; - -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; -import io.caster.simplemvp.presentation.UserPresenter; -import io.caster.simplemvp.presentation.UserPresenterImpl; -import io.caster.simplemvp.repository.InMemoryUserRepositoryImpl; -import io.caster.simplemvp.repository.UserRepository; - -@Module -public class AppModule { - @Provides - @Singleton - public UserRepository provideUserRepository() { - return new InMemoryUserRepositoryImpl(); - } - - @Provides - public UserPresenter provideUserPresenter(UserRepository userRepository) { - return new UserPresenterImpl(userRepository); - } -} diff --git a/app/src/main/java/io/caster/simplemvp/AppModule.kt b/app/src/main/java/io/caster/simplemvp/AppModule.kt new file mode 100644 index 0000000..02a0d41 --- /dev/null +++ b/app/src/main/java/io/caster/simplemvp/AppModule.kt @@ -0,0 +1,19 @@ +package io.caster.simplemvp + +import dagger.Module +import dagger.Provides +import io.caster.simplemvp.presentation.UserPresenter +import io.caster.simplemvp.presentation.UserPresenterImpl +import io.caster.simplemvp.repository.InMemoryUserRepositoryImpl +import io.caster.simplemvp.repository.UserRepository +import javax.inject.Singleton + +@Module +class AppModule { + @Provides + @Singleton + fun provideUserRepository(): UserRepository = InMemoryUserRepositoryImpl() + + @Provides + fun provideUserPresenter(userRepository: UserRepository): UserPresenter = UserPresenterImpl(userRepository) +} diff --git a/app/src/main/java/io/caster/simplemvp/MvpApplication.java b/app/src/main/java/io/caster/simplemvp/MvpApplication.java deleted file mode 100644 index 269ee91..0000000 --- a/app/src/main/java/io/caster/simplemvp/MvpApplication.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.caster.simplemvp; - -import android.app.Application; - -public class MvpApplication extends Application { - - private AppComponent component; - - @Override - public void onCreate() { - super.onCreate(); - - component = DaggerAppComponent.builder().appModule(new AppModule()).build(); - - } - - public AppComponent getComponent() { - return component; - } -} diff --git a/app/src/main/java/io/caster/simplemvp/MvpApplication.kt b/app/src/main/java/io/caster/simplemvp/MvpApplication.kt new file mode 100644 index 0000000..f49394b --- /dev/null +++ b/app/src/main/java/io/caster/simplemvp/MvpApplication.kt @@ -0,0 +1,14 @@ +package io.caster.simplemvp + +import android.app.Application + +class MvpApplication : Application() { + + var component: AppComponent? = null + + override fun onCreate() { + super.onCreate() + + component = DaggerAppComponent.builder().appModule(AppModule()).build() + } +} diff --git a/app/src/main/java/io/caster/simplemvp/model/User.java b/app/src/main/java/io/caster/simplemvp/model/User.java deleted file mode 100644 index e40523a..0000000 --- a/app/src/main/java/io/caster/simplemvp/model/User.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.caster.simplemvp.model; - -public class User { - private int id; - private String firstName; - private String lastName; - - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } -} diff --git a/app/src/main/java/io/caster/simplemvp/model/User.kt b/app/src/main/java/io/caster/simplemvp/model/User.kt new file mode 100644 index 0000000..3192dab --- /dev/null +++ b/app/src/main/java/io/caster/simplemvp/model/User.kt @@ -0,0 +1,7 @@ +package io.caster.simplemvp.model + +data class User ( + var id: Int = 0, + var firstName: String? = null, + var lastName: String? = null +) diff --git a/app/src/main/java/io/caster/simplemvp/presentation/UserPresenter.java b/app/src/main/java/io/caster/simplemvp/presentation/UserPresenter.java deleted file mode 100644 index 16b820f..0000000 --- a/app/src/main/java/io/caster/simplemvp/presentation/UserPresenter.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.caster.simplemvp.presentation; - -import io.caster.simplemvp.view.UserView; - -public interface UserPresenter { - void loadUserDetails(); - - void setView(UserView view); - - void saveUser(); -} diff --git a/app/src/main/java/io/caster/simplemvp/presentation/UserPresenter.kt b/app/src/main/java/io/caster/simplemvp/presentation/UserPresenter.kt new file mode 100644 index 0000000..1c9c839 --- /dev/null +++ b/app/src/main/java/io/caster/simplemvp/presentation/UserPresenter.kt @@ -0,0 +1,11 @@ +package io.caster.simplemvp.presentation + +import io.caster.simplemvp.view.UserView + +interface UserPresenter { + fun loadUserDetails() + + fun setView(view: UserView) + + fun saveUser() +} diff --git a/app/src/main/java/io/caster/simplemvp/presentation/UserPresenterImpl.java b/app/src/main/java/io/caster/simplemvp/presentation/UserPresenterImpl.java deleted file mode 100644 index 6fbe563..0000000 --- a/app/src/main/java/io/caster/simplemvp/presentation/UserPresenterImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.caster.simplemvp.presentation; - -import io.caster.simplemvp.model.User; -import io.caster.simplemvp.repository.UserRepository; -import io.caster.simplemvp.view.UserView; - -public class UserPresenterImpl implements UserPresenter { - - private UserView view; - private UserRepository userRepository; - private User u; - - public UserPresenterImpl(UserRepository userRepository) { - this.userRepository = userRepository; - } - - @Override - public void loadUserDetails() { - int userId = view.getUserId(); - u = userRepository.getUser(userId); - if (u == null) { - view.showUserNotFoundMessage(); - } else { - view.displayFirstName(u.getFirstName()); - view.displayLastName(u.getLastName()); - } - } - - @Override - public void setView(UserView view) { - this.view = view; - loadUserDetails(); - } - - @Override - public void saveUser() { - if (u != null) { - if (view.getFirstName().trim().equals("") || view.getLastName().trim().equals("")) { - view.showUserNameIsRequired(); - } else { - u.setFirstName(view.getFirstName()); - u.setLastName(view.getLastName()); - userRepository.save(u); - view.showUserSavedMessage(); - } - - } - } -} diff --git a/app/src/main/java/io/caster/simplemvp/presentation/UserPresenterImpl.kt b/app/src/main/java/io/caster/simplemvp/presentation/UserPresenterImpl.kt new file mode 100644 index 0000000..532f60e --- /dev/null +++ b/app/src/main/java/io/caster/simplemvp/presentation/UserPresenterImpl.kt @@ -0,0 +1,41 @@ +package io.caster.simplemvp.presentation + +import io.caster.simplemvp.model.User +import io.caster.simplemvp.repository.UserRepository +import io.caster.simplemvp.view.UserView + +class UserPresenterImpl(val userRepository: UserRepository) : UserPresenter { + + private var view: UserView? = null + private var u: User? = null + + override fun loadUserDetails() { + val userId = view!!.userId + u = userRepository.getUser(userId) + if (u == null) { + view!!.showUserNotFoundMessage() + } else { + view!!.displayFirstName(u!!.firstName!!) + view!!.displayLastName(u!!.lastName!!) + } + } + + override fun setView(view: UserView) { + this.view = view + loadUserDetails() + } + + override fun saveUser() { + if (u != null) { + if (view!!.firstName.trim { it <= ' ' } == "" || view!!.lastName.trim { it <= ' ' } == "") { + view!!.showUserNameIsRequired() + } else { + u!!.firstName = view!!.firstName + u!!.lastName = view!!.lastName + userRepository.save(u!!) + view!!.showUserSavedMessage() + } + + } + } +} diff --git a/app/src/main/java/io/caster/simplemvp/repository/InMemoryUserRepositoryImpl.java b/app/src/main/java/io/caster/simplemvp/repository/InMemoryUserRepositoryImpl.java deleted file mode 100644 index f8ddac3..0000000 --- a/app/src/main/java/io/caster/simplemvp/repository/InMemoryUserRepositoryImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.caster.simplemvp.repository; - -import io.caster.simplemvp.model.User; - -public class InMemoryUserRepositoryImpl implements UserRepository { - private User u; - - /** - * Gets the user from memory. - * - * @param id The id of the user. - * @return a {@link User} - */ - @Override - public User getUser(int id) { - // Normally this would go to a DB/etc and fetch the user with an ID. - // Here though, we're just doing something in memory, so we're kind of just - // faking it out. - if (u == null) { - u = new User(); - u.setId(id); - u.setFirstName("Captain"); - u.setLastName("Crunch"); - } - return u; - } - - /** - * Save's the in-memory user. - * - * @param u The user. - */ - @Override - public void save(User u) { - if (this.u == null) { - this.u = getUser(0); // create the in memory user. - } - this.u.setId(u.getId()); - this.u.setFirstName(u.getFirstName()); - this.u.setLastName(u.getLastName()); - } -} diff --git a/app/src/main/java/io/caster/simplemvp/repository/InMemoryUserRepositoryImpl.kt b/app/src/main/java/io/caster/simplemvp/repository/InMemoryUserRepositoryImpl.kt new file mode 100644 index 0000000..10c67af --- /dev/null +++ b/app/src/main/java/io/caster/simplemvp/repository/InMemoryUserRepositoryImpl.kt @@ -0,0 +1,40 @@ +package io.caster.simplemvp.repository + +import io.caster.simplemvp.model.User + +class InMemoryUserRepositoryImpl : UserRepository { + private var u: User? = null + + /** + * Gets the user from memory. + * + * @param id The id of the user. + * @return a [User] + */ + override fun getUser(id: Int): User { + // Normally this would go to a DB/etc and fetch the user with an ID. + // Here though, we're just doing something in memory, so we're kind of just + // faking it out. + if (u == null) { + u = User() + u!!.id = id + u!!.firstName = "Captain" + u!!.lastName = "Crunch" + } + return u!! + } + + /** + * Save's the in-memory user. + * + * @param u The user. + */ + override fun save(u: User) { + if (this.u == null) { + this.u = getUser(0) // create the in memory user. + } + this.u!!.id = u.id + this.u!!.firstName = u.firstName + this.u!!.lastName = u.lastName + } +} diff --git a/app/src/main/java/io/caster/simplemvp/repository/UserRepository.java b/app/src/main/java/io/caster/simplemvp/repository/UserRepository.java deleted file mode 100644 index 35e1f8f..0000000 --- a/app/src/main/java/io/caster/simplemvp/repository/UserRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.caster.simplemvp.repository; - -import io.caster.simplemvp.model.User; - -public interface UserRepository { - User getUser(int id); - - void save(User u); -} diff --git a/app/src/main/java/io/caster/simplemvp/repository/UserRepository.kt b/app/src/main/java/io/caster/simplemvp/repository/UserRepository.kt new file mode 100644 index 0000000..7ef9acf --- /dev/null +++ b/app/src/main/java/io/caster/simplemvp/repository/UserRepository.kt @@ -0,0 +1,9 @@ +package io.caster.simplemvp.repository + +import io.caster.simplemvp.model.User + +interface UserRepository { + fun getUser(id: Int): User + + fun save(u: User) +} diff --git a/app/src/main/java/io/caster/simplemvp/view/UserView.java b/app/src/main/java/io/caster/simplemvp/view/UserView.java deleted file mode 100644 index 9715c5b..0000000 --- a/app/src/main/java/io/caster/simplemvp/view/UserView.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.caster.simplemvp.view; - -public interface UserView { - int getUserId(); - - void displayFirstName(String name); - - void displayLastName(String name); - - void showUserNotFoundMessage(); - - void showUserSavedMessage(); - - String getFirstName(); - - String getLastName(); - - void showUserNameIsRequired(); -} diff --git a/app/src/main/java/io/caster/simplemvp/view/UserView.kt b/app/src/main/java/io/caster/simplemvp/view/UserView.kt new file mode 100644 index 0000000..fbd7e23 --- /dev/null +++ b/app/src/main/java/io/caster/simplemvp/view/UserView.kt @@ -0,0 +1,19 @@ +package io.caster.simplemvp.view + +interface UserView { + val userId: Int + + val firstName: String + + val lastName: String + + fun displayFirstName(name: String) + + fun displayLastName(name: String) + + fun showUserNotFoundMessage() + + fun showUserSavedMessage() + + fun showUserNameIsRequired() +} diff --git a/app/src/main/java/io/caster/simplemvp/view/activity/MainActivity.java b/app/src/main/java/io/caster/simplemvp/view/activity/MainActivity.java deleted file mode 100644 index d05b272..0000000 --- a/app/src/main/java/io/caster/simplemvp/view/activity/MainActivity.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.caster.simplemvp.view.activity; - -import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.design.widget.Snackbar; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; - -import io.caster.simplemvp.R; - -public class MainActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); - fab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) - .setAction("Action", null).show(); - } - }); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.menu_main, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - - //noinspection SimplifiableIfStatement - if (id == R.id.action_settings) { - return true; - } - - return super.onOptionsItemSelected(item); - } -} diff --git a/app/src/main/java/io/caster/simplemvp/view/activity/MainActivity.kt b/app/src/main/java/io/caster/simplemvp/view/activity/MainActivity.kt new file mode 100644 index 0000000..fa8b936 --- /dev/null +++ b/app/src/main/java/io/caster/simplemvp/view/activity/MainActivity.kt @@ -0,0 +1,44 @@ +package io.caster.simplemvp.view.activity + +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import android.view.Menu +import android.view.MenuItem +import io.caster.simplemvp.R +import kotlinx.android.synthetic.main.activity_main.* +import org.jetbrains.anko.design.snackbar +import org.jetbrains.anko.toast + +class MainActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + setSupportActionBar(toolbar) + + fab.setOnClickListener { view -> + snackbar(view, "Replace with your own action", "Action") { + toast("You clicked on the FAB!") + }.show() + } + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + // Inflate the menu; this adds items to the action bar if it is present. + menuInflater.inflate(R.menu.menu_main, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + val id = item.itemId + + + return if (id == R.id.action_settings) { + true + } else super.onOptionsItemSelected(item) + + } +} diff --git a/app/src/main/java/io/caster/simplemvp/view/fragment/UserFragment.java b/app/src/main/java/io/caster/simplemvp/view/fragment/UserFragment.java deleted file mode 100644 index de8b73a..0000000 --- a/app/src/main/java/io/caster/simplemvp/view/fragment/UserFragment.java +++ /dev/null @@ -1,98 +0,0 @@ -package io.caster.simplemvp.view.fragment; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.EditText; -import android.widget.Toast; - -import javax.inject.Inject; - -import io.caster.simplemvp.MvpApplication; -import io.caster.simplemvp.R; -import io.caster.simplemvp.presentation.UserPresenter; -import io.caster.simplemvp.view.UserView; - -/** - * The V in MVP (Model View Presenter) - */ -public class UserFragment extends Fragment implements UserView { - - private static final String USER_ID = "user_id"; - protected EditText userFirstName; - protected EditText userLastName; - @Inject UserPresenter userPresenter; - - public UserFragment() { - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - ((MvpApplication) getActivity().getApplication()).getComponent().inject(this); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.fragment_main, container, false); - userFirstName = (EditText) v.findViewById(R.id.user_first_name); - userLastName = (EditText) v.findViewById(R.id.user_last_name); - v.findViewById(R.id.user_save).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - userPresenter.saveUser(); - } - }); - return v; - } - - @Override - public void onResume() { - super.onResume(); - userPresenter.setView(this); - } - - @Override - public int getUserId() { - return getArguments() == null ? 0 : getArguments().getInt(USER_ID, 0); - } - - @Override - public void displayFirstName(String name) { - userFirstName.setText(name); - } - - @Override - public void displayLastName(String name) { - userLastName.setText(name); - } - - @Override - public void showUserNotFoundMessage() { - Toast.makeText(getActivity(), R.string.user_not_found, Toast.LENGTH_LONG).show(); - } - - @Override - public void showUserSavedMessage() { - Toast.makeText(getActivity(), R.string.user_saved, Toast.LENGTH_SHORT).show(); - } - - @Override - public String getFirstName() { - return userFirstName.getText().toString(); - } - - @Override - public String getLastName() { - return userLastName.getText().toString(); - } - - @Override - public void showUserNameIsRequired() { - Toast.makeText(getActivity(), R.string.user_name_required_message, Toast.LENGTH_SHORT).show(); - } -} diff --git a/app/src/main/java/io/caster/simplemvp/view/fragment/UserFragment.kt b/app/src/main/java/io/caster/simplemvp/view/fragment/UserFragment.kt new file mode 100644 index 0000000..586f2ba --- /dev/null +++ b/app/src/main/java/io/caster/simplemvp/view/fragment/UserFragment.kt @@ -0,0 +1,71 @@ +package io.caster.simplemvp.view.fragment + +import android.os.Bundle +import android.support.v4.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import io.caster.simplemvp.MvpApplication +import io.caster.simplemvp.R +import io.caster.simplemvp.presentation.UserPresenter +import io.caster.simplemvp.view.UserView +import kotlinx.android.synthetic.main.fragment_main.* +import javax.inject.Inject + +/** + * The V in MVP (Model View Presenter) + */ +class UserFragment : Fragment(), UserView { + @Inject lateinit var userPresenter: UserPresenter + + override val userId: Int + get() = if (arguments == null) 0 else arguments!!.getInt(USER_ID, 0) + + override val firstName: String + get() = userFirstName.text.toString() + + override val lastName: String + get() = userLastName.text.toString() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + (activity!!.application as MvpApplication).component!!.inject(this) + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + val v = inflater.inflate(R.layout.fragment_main, container, false) + userSave.setOnClickListener { userPresenter.saveUser() } + return v + } + + override fun onResume() { + super.onResume() + userPresenter.setView(this) + } + + override fun displayFirstName(name: String) { + userFirstName.setText(name) + } + + override fun displayLastName(name: String) { + userLastName.setText(name) + } + + override fun showUserNotFoundMessage() { + Toast.makeText(activity, R.string.user_not_found, Toast.LENGTH_LONG).show() + } + + override fun showUserSavedMessage() { + Toast.makeText(activity, R.string.user_saved, Toast.LENGTH_SHORT).show() + } + + override fun showUserNameIsRequired() { + Toast.makeText(activity, R.string.user_name_required_message, Toast.LENGTH_SHORT).show() + } + + companion object { + const val USER_ID = "user_id" + } +} diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 393a25e..896899a 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -11,19 +11,19 @@ tools:showIn="@layout/activity_main">