├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── drawable │ │ │ │ ├── github.png │ │ │ │ └── ic_launcher_background.xml │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── layout │ │ │ │ ├── activity_main.xml │ │ │ │ ├── content_register.xml │ │ │ │ ├── fragment_project_list.xml │ │ │ │ ├── activity_login.xml │ │ │ │ ├── project_list_item.xml │ │ │ │ ├── activity_register.xml │ │ │ │ └── fragment_project_details.xml │ │ │ ├── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── styles.xml │ │ │ │ └── strings.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ └── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── ryadav3 │ │ │ │ └── mvvmsample │ │ │ │ ├── view │ │ │ │ ├── callback │ │ │ │ │ ├── RegisterActivityCallback.kt │ │ │ │ │ ├── LoginActivityCallback.kt │ │ │ │ │ └── ProjectClickCallback.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── CustomBindingAdapter.kt │ │ │ │ │ └── ProjectAdapter.kt │ │ │ │ └── ui │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── LoginActivity.kt │ │ │ │ │ ├── RegisterActivity.kt │ │ │ │ │ ├── ProjectFragment.kt │ │ │ │ │ └── ProjectListFragment.kt │ │ │ │ ├── service │ │ │ │ ├── room │ │ │ │ │ ├── UserDatabase.kt │ │ │ │ │ └── UserDao.kt │ │ │ │ ├── model │ │ │ │ │ ├── User.kt │ │ │ │ │ ├── Project.kt │ │ │ │ │ └── GitHubUser.kt │ │ │ │ └── repository │ │ │ │ │ ├── GitHubService.kt │ │ │ │ │ ├── UserRepository.kt │ │ │ │ │ └── ProjectRepository.kt │ │ │ │ ├── app │ │ │ │ └── MyApp.kt │ │ │ │ └── viewmodel │ │ │ │ ├── ProjectListViewModel.kt │ │ │ │ ├── UserViewModel.kt │ │ │ │ └── ProjectViewModel.kt │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── ryadav3 │ │ │ └── mvvmsample │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── com │ │ └── ryadav3 │ │ └── mvvmsample │ │ └── ExampleInstrumentedTest.kt ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── .gitignore ├── gradlew.bat └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi123shanker/kotlin-mvvm-sample/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi123shanker/kotlin-mvvm-sample/HEAD/app/src/main/res/drawable/github.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi123shanker/kotlin-mvvm-sample/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi123shanker/kotlin-mvvm-sample/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi123shanker/kotlin-mvvm-sample/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi123shanker/kotlin-mvvm-sample/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi123shanker/kotlin-mvvm-sample/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi123shanker/kotlin-mvvm-sample/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi123shanker/kotlin-mvvm-sample/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi123shanker/kotlin-mvvm-sample/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi123shanker/kotlin-mvvm-sample/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ravi123shanker/kotlin-mvvm-sample/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/java/com/ryadav3/mvvmsample/view/callback/RegisterActivityCallback.kt: -------------------------------------------------------------------------------- 1 | package com.ryadav3.mvvmsample.view.callback 2 | 3 | import android.view.View 4 | 5 | interface RegisterActivityCallback { 6 | fun onRegisterClick(view: View) 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/ryadav3/mvvmsample/view/callback/LoginActivityCallback.kt: -------------------------------------------------------------------------------- 1 | package com.ryadav3.mvvmsample.view.callback 2 | 3 | import android.view.View 4 | 5 | interface LoginActivityCallback { 6 | fun onLoginClick(view: View) 7 | fun onRegisterClick(view: View) 8 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Apr 11 16:02:24 IST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/ryadav3/mvvmsample/view/callback/ProjectClickCallback.kt: -------------------------------------------------------------------------------- 1 | package com.ryadav3.mvvmsample.view.callback 2 | 3 | import android.view.View 4 | import com.ryadav3.mvvmsample.service.model.Project 5 | 6 | 7 | 8 | interface ProjectClickCallback { 9 | fun onClick(view: View, project: Project) 10 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | #d3d3d3 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/test/java/com/ryadav3/mvvmsample/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.ryadav3.mvvmsample 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/ryadav3/mvvmsample/view/adapter/CustomBindingAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.ryadav3.mvvmsample.view.adapter 2 | 3 | import android.databinding.BindingAdapter 4 | import android.view.View 5 | 6 | class CustomBindingAdapter { 7 | companion object { 8 | @JvmStatic 9 | @BindingAdapter("visibleGone") 10 | fun showHide(view: View, show: Boolean) { 11 | view.visibility = if (show) View.VISIBLE else View.GONE 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/ryadav3/mvvmsample/service/room/UserDatabase.kt: -------------------------------------------------------------------------------- 1 | package com.ryadav3.mvvmsample.service.room 2 | 3 | import android.arch.persistence.room.Database 4 | import android.arch.persistence.room.Room 5 | import android.arch.persistence.room.RoomDatabase 6 | import android.content.Context 7 | import com.ryadav3.mvvmsample.service.model.User 8 | 9 | @Database(entities = arrayOf(User::class), version = 1) 10 | abstract class UserDatabase: RoomDatabase() { 11 | abstract fun userDao(): UserDao 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/ryadav3/mvvmsample/app/MyApp.kt: -------------------------------------------------------------------------------- 1 | package com.ryadav3.mvvmsample.app 2 | 3 | import android.app.Application 4 | import android.arch.persistence.room.Room 5 | import com.ryadav3.mvvmsample.service.room.UserDatabase 6 | 7 | class MyApp: Application() { 8 | override fun onCreate() { 9 | super.onCreate() 10 | MyApp.database= Room.databaseBuilder(this, UserDatabase::class.java, "users.db").allowMainThreadQueries().build() 11 | } 12 | companion object { 13 | lateinit var database: UserDatabase 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/ryadav3/mvvmsample/service/model/User.kt: -------------------------------------------------------------------------------- 1 | package com.ryadav3.mvvmsample.service.model 2 | 3 | import android.arch.persistence.room.Entity 4 | import android.arch.persistence.room.Ignore 5 | import android.arch.persistence.room.PrimaryKey 6 | 7 | @Entity(tableName = "user") 8 | data class User( 9 | val userName: String="", 10 | @PrimaryKey 11 | val email: String="", 12 | val mobile: String="", 13 | val password: String="" 14 | ){ 15 | 16 | @Ignore 17 | constructor() : this("", "", "", "") 18 | } -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 8dp 5 | 16dp 6 | 16dp 7 | 25sp 8 | 20sp 9 | 16sp 10 | 150dp 11 | 125dp 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/ryadav3/mvvmsample/service/repository/GitHubService.kt: -------------------------------------------------------------------------------- 1 | package com.ryadav3.mvvmsample.service.repository 2 | 3 | import com.ryadav3.mvvmsample.service.model.Project 4 | import retrofit2.Call 5 | import retrofit2.http.GET 6 | import retrofit2.http.Path 7 | 8 | interface GitHubService { 9 | @GET("users/{user}/repos") 10 | fun getProjectList(@Path("user") user: String): Call> 11 | 12 | @GET("/repos/{user}/{reponame}") 13 | fun getProjectDetails(@Path("user") user: String, @Path("reponame") projectName: String): Call 14 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/content_register.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/ryadav3/mvvmsample/viewmodel/ProjectListViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.ryadav3.mvvmsample.viewmodel 2 | 3 | import android.app.Application 4 | import android.arch.lifecycle.AndroidViewModel 5 | import android.arch.lifecycle.LiveData 6 | import com.ryadav3.mvvmsample.service.model.Project 7 | import com.ryadav3.mvvmsample.service.repository.ProjectRepository 8 | 9 | 10 | class ProjectListViewModel(application: Application): AndroidViewModel(application) { 11 | private val projectListObservable= ProjectRepository.getInstance().getProjectList("Google") 12 | 13 | /** 14 | * Expose the LiveData Projects query so the UI can observe it. 15 | */ 16 | fun getProjectListObservable(): LiveData> { 17 | return projectListObservable 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/ryadav3/mvvmsample/service/room/UserDao.kt: -------------------------------------------------------------------------------- 1 | package com.ryadav3.mvvmsample.service.room 2 | 3 | import android.arch.persistence.room.* 4 | import android.arch.persistence.room.OnConflictStrategy.FAIL 5 | import com.ryadav3.mvvmsample.service.model.User 6 | 7 | @Dao 8 | interface UserDao { 9 | @Insert(onConflict = FAIL) 10 | fun insertUser(user: User) 11 | 12 | @Query("SELECT * FROM user where email= :email and password= :password") 13 | fun getUser(email: String, password: String): User 14 | 15 | @Query("SELECT * FROM user") 16 | fun getAllUser(): List 17 | 18 | @Delete 19 | fun deleteUser(user: User) 20 | 21 | @Update 22 | fun updateUser(user: User) 23 | 24 | @Query("DELETE FROM user") 25 | fun deleteAllUser() 26 | 27 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/com/ryadav3/mvvmsample/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.ryadav3.mvvmsample 2 | 3 | import android.support.test.InstrumentationRegistry 4 | import android.support.test.runner.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getTargetContext() 22 | assertEquals("com.ryadav3.mvvmsample", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 15 | 16 |