From 7ddc3964369212a524e16e33e4fba95f510a867b Mon Sep 17 00:00:00 2001 From: Mohsen Einhesari Date: Wed, 22 Jul 2020 20:42:03 +0430 Subject: [PATCH 01/46] add dependencies --- .idea/.name | 1 + .idea/jarRepositories.xml | 25 +++++++ .idea/misc.xml | 2 +- app/build.gradle | 85 +++++++++++++++++------- build.gradle | 4 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 6 files changed, 93 insertions(+), 28 deletions(-) create mode 100644 .idea/.name create mode 100644 .idea/jarRepositories.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 00000000..a3fe6a01 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Github \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 00000000..a5f05cd8 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 37a75096..a297d42b 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/build.gradle b/app/build.gradle index c31daba5..4ffcb9a5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,8 +1,7 @@ apply plugin: 'com.android.application' - apply plugin: 'kotlin-android' - apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' android { compileSdkVersion 29 @@ -23,28 +22,68 @@ android { } } +def appcompat_version = '1.1.0' +def corektx_version = '1.3.0' +def junit_version = '4.13' +def extjunit_version = '1.1.1' +def espresso_core_version = '3.2.0' +def material_version = '1.1.0' +def constraint_layout_version = '1.1.3' +def mockito_version = '3.2.4' +def rxjava_version = '2.2.17' +def rxandroid_version = '2.1.1' +def rxrelay_version = '2.1.1' +def rxbindind_version = '3.1.0' +def retrofit_version = '2.7.2' +def retrofit_gson_converter_version = '2.7.2' +def retrofit_rxadapter_version = '1.0.0' +def okhttp_version = '4.4.0' +def okhttp_logging_version = '4.4.0' +def nav_version = "2.3.0" +def lifecycle_version = "2.3.0-alpha05" +def leakcanary_version = "2.1" +def glide_version = "4.11.0" +def dagger_version = "2.25.4" + dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.0.2' - implementation 'androidx.core:core-ktx:1.0.2' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'com.google.android.material:material:1.0.0' - implementation 'com.squareup.retrofit2:retrofit:2.5.0' - implementation 'com.squareup.okhttp3:okhttp:3.11.0' - implementation 'org.koin:koin-android:2.0.1' - implementation 'org.koin:koin-android-viewmodel:2.0.1' - - - implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.50' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.1' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.1' - implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0' - implementation 'androidx.preference:preference-ktx:1.1.0' - implementation 'com.squareup.retrofit2:converter-gson:2.4.0' - implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' - - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + implementation "androidx.appcompat:appcompat:$appcompat_version" + implementation "androidx.core:core-ktx:$corektx_version" + implementation "com.google.android.material:material:$material_version" + implementation "androidx.constraintlayout:constraintlayout:$constraint_layout_version" + + implementation "io.reactivex.rxjava2:rxjava:$rxjava_version" + implementation "io.reactivex.rxjava2:rxandroid:$rxandroid_version" + implementation "com.jakewharton.rxrelay2:rxrelay:$rxrelay_version" + implementation "com.jakewharton.rxbinding3:rxbinding:$rxbindind_version" + implementation "com.jakewharton.rxbinding3:rxbinding-material:$rxbindind_version" + + implementation "com.squareup.retrofit2:retrofit:$retrofit_version" + implementation "com.squareup.retrofit2:converter-gson:$retrofit_gson_converter_version" + implementation "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:$retrofit_rxadapter_version" + + implementation "com.squareup.okhttp3:okhttp:$okhttp_version" + implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_logging_version" + + implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" + implementation "androidx.navigation:navigation-ui-ktx:$nav_version" + + implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" + + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakcanary_version" + + implementation "com.github.bumptech.glide:glide:$glide_version" + kapt "com.github.bumptech.glide:compiler:$glide_version" + + api "com.google.dagger:dagger:$dagger_version" + kapt "com.google.dagger:dagger-compiler:$dagger_version" + + testImplementation "junit:junit:$junit_version" + androidTestImplementation "androidx.test.ext:junit:$extjunit_version" + androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_core_version" + + implementation "org.mockito:mockito-core:$mockito_version" + androidTestImplementation "org.mockito:mockito-android:$mockito_version" } diff --git a/build.gradle b/build.gradle index eccd7a6e..54a63d02 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,14 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.3.72' repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.0' + classpath 'com.android.tools.build:gradle:4.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2d0cdcbf..2b665698 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Jan 11 10:25:49 IRST 2020 +#Wed Jul 22 20:34:47 IRDT 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip From 37802286bc19a22031d04010dcb2070206c3e304 Mon Sep 17 00:00:00 2001 From: Mohsen Einhesari Date: Wed, 22 Jul 2020 21:54:33 +0430 Subject: [PATCH 02/46] add packages --- app/build.gradle | 2 +- .../{ => presentation}/github/ExampleInstrumentedTest.kt | 4 +--- app/src/main/AndroidManifest.xml | 6 +++--- .../challenge/{ => presentation}/github/LoginUriActivity.kt | 2 +- .../challenge/{ => presentation}/github/MainActivity.kt | 2 +- app/src/main/res/menu/menu_main.xml | 2 +- .../challenge/{ => presentation}/github/ExampleUnitTest.kt | 2 +- 7 files changed, 9 insertions(+), 11 deletions(-) rename app/src/androidTest/java/com/mydigipay/challenge/{ => presentation}/github/ExampleInstrumentedTest.kt (81%) rename app/src/main/java/com/mydigipay/challenge/{ => presentation}/github/LoginUriActivity.kt (97%) rename app/src/main/java/com/mydigipay/challenge/{ => presentation}/github/MainActivity.kt (93%) rename app/src/test/java/com/mydigipay/challenge/{ => presentation}/github/ExampleUnitTest.kt (85%) diff --git a/app/build.gradle b/app/build.gradle index 4ffcb9a5..0a9fe950 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,7 +7,7 @@ android { compileSdkVersion 29 buildToolsVersion "29.0.1" defaultConfig { - applicationId "com.mydigipay.challenge.github" + applicationId "com.mydigipay.challenge.presentation.github" minSdkVersion 17 targetSdkVersion 29 versionCode 1 diff --git a/app/src/androidTest/java/com/mydigipay/challenge/github/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/mydigipay/challenge/presentation/github/ExampleInstrumentedTest.kt similarity index 81% rename from app/src/androidTest/java/com/mydigipay/challenge/github/ExampleInstrumentedTest.kt rename to app/src/androidTest/java/com/mydigipay/challenge/presentation/github/ExampleInstrumentedTest.kt index 7fa57ded..31a3d356 100644 --- a/app/src/androidTest/java/com/mydigipay/challenge/github/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/com/mydigipay/challenge/presentation/github/ExampleInstrumentedTest.kt @@ -1,8 +1,6 @@ -package com.mydigipay.challenge.github +package com.mydigipay.challenge.presentation.github import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.runner.AndroidJUnit4 import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 999179d8..f13caa66 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="com.mydigipay.challenge.presentation.github"> @@ -21,7 +21,7 @@ - + diff --git a/app/src/main/java/com/mydigipay/challenge/github/LoginUriActivity.kt b/app/src/main/java/com/mydigipay/challenge/presentation/github/LoginUriActivity.kt similarity index 97% rename from app/src/main/java/com/mydigipay/challenge/github/LoginUriActivity.kt rename to app/src/main/java/com/mydigipay/challenge/presentation/github/LoginUriActivity.kt index 399278ed..13ada4a5 100644 --- a/app/src/main/java/com/mydigipay/challenge/github/LoginUriActivity.kt +++ b/app/src/main/java/com/mydigipay/challenge/presentation/github/LoginUriActivity.kt @@ -1,4 +1,4 @@ -package com.mydigipay.challenge.github +package com.mydigipay.challenge.presentation.github import android.app.Activity import android.content.Intent diff --git a/app/src/main/java/com/mydigipay/challenge/github/MainActivity.kt b/app/src/main/java/com/mydigipay/challenge/presentation/github/MainActivity.kt similarity index 93% rename from app/src/main/java/com/mydigipay/challenge/github/MainActivity.kt rename to app/src/main/java/com/mydigipay/challenge/presentation/github/MainActivity.kt index 3ba92da9..c99102d1 100644 --- a/app/src/main/java/com/mydigipay/challenge/github/MainActivity.kt +++ b/app/src/main/java/com/mydigipay/challenge/presentation/github/MainActivity.kt @@ -1,4 +1,4 @@ -package com.mydigipay.challenge.github +package com.mydigipay.challenge.presentation.github import android.content.Intent import android.net.Uri diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 9e80e0d5..d93fbd2d 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -1,7 +1,7 @@ + tools:context="com.mydigipay.challenge.presentation.github.MainActivity"> Date: Wed, 22 Jul 2020 23:00:34 +0430 Subject: [PATCH 03/46] replace koin with dagger and create app component --- .idea/misc.xml | 2 +- app/build.gradle | 13 ++++ .../github/ExampleInstrumentedTest.kt | 1 + .../java/com/mydigipay/challenge/app/App.kt | 25 +++----- .../challenge/di/component/AppComponent.kt | 14 +++++ .../challenge/network/di/AccessTokenModule.kt | 12 ++-- .../challenge/network/di/NetworkModule.kt | 53 ---------------- .../presentation/github/LoginUriActivity.kt | 61 +++++++++---------- .../presentation/github/MainActivity.kt | 4 +- 9 files changed, 75 insertions(+), 110 deletions(-) create mode 100644 app/src/main/java/com/mydigipay/challenge/di/component/AppComponent.kt delete mode 100644 app/src/main/java/com/mydigipay/challenge/network/di/NetworkModule.kt diff --git a/.idea/misc.xml b/.idea/misc.xml index a297d42b..c37443c9 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 0a9fe950..b3786d51 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,6 +10,7 @@ android { applicationId "com.mydigipay.challenge.presentation.github" minSdkVersion 17 targetSdkVersion 29 + multiDexEnabled true versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -20,6 +21,16 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + kotlinOptions { + jvmTarget = "1.8" + } + } + } def appcompat_version = '1.1.0' @@ -86,4 +97,6 @@ dependencies { implementation "org.mockito:mockito-core:$mockito_version" androidTestImplementation "org.mockito:mockito-android:$mockito_version" + + implementation 'com.android.support:multidex:1.0.3' } diff --git a/app/src/androidTest/java/com/mydigipay/challenge/presentation/github/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/mydigipay/challenge/presentation/github/ExampleInstrumentedTest.kt index 31a3d356..748e8cd9 100644 --- a/app/src/androidTest/java/com/mydigipay/challenge/presentation/github/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/com/mydigipay/challenge/presentation/github/ExampleInstrumentedTest.kt @@ -1,5 +1,6 @@ package com.mydigipay.challenge.presentation.github +import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import org.junit.Test diff --git a/app/src/main/java/com/mydigipay/challenge/app/App.kt b/app/src/main/java/com/mydigipay/challenge/app/App.kt index 65530767..6e562ce3 100644 --- a/app/src/main/java/com/mydigipay/challenge/app/App.kt +++ b/app/src/main/java/com/mydigipay/challenge/app/App.kt @@ -1,29 +1,20 @@ package com.mydigipay.challenge.app import android.app.Application -import androidx.preference.PreferenceManager -import com.mydigipay.challenge.network.di.accessTokenModule -import com.mydigipay.challenge.network.di.networkModule -import com.mydigipay.challenge.repository.token.TokenRepositoryImpl -import org.koin.android.ext.koin.androidContext -import org.koin.core.context.startKoin -import org.koin.core.qualifier.named -import org.koin.dsl.module -const val APPLICATION_CONTEXT = "APPLICATION_CONTEXT" +import com.mydigipay.challenge.di.component.AppComponent +import com.mydigipay.challenge.di.component.DaggerAppComponent + +lateinit var component: AppComponent + class App : Application() { override fun onCreate() { super.onCreate() - startKoin { - androidContext(this@App) - modules(listOf(appModule, networkModule, accessTokenModule)) - } + initDagger() } - val appModule = module { - factory { TokenRepositoryImpl(get()) } - single(named(APPLICATION_CONTEXT)) { applicationContext } - single { PreferenceManager.getDefaultSharedPreferences(get()) } + private fun initDagger() { + component = DaggerAppComponent.factory().create(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/mydigipay/challenge/di/component/AppComponent.kt b/app/src/main/java/com/mydigipay/challenge/di/component/AppComponent.kt new file mode 100644 index 00000000..68215ed4 --- /dev/null +++ b/app/src/main/java/com/mydigipay/challenge/di/component/AppComponent.kt @@ -0,0 +1,14 @@ +package com.mydigipay.challenge.di.component + +import android.content.Context +import dagger.BindsInstance +import dagger.Component + +@Component(modules = []) +interface AppComponent { + + @Component.Factory + interface Factory { + fun create(@BindsInstance context: Context): AppComponent + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mydigipay/challenge/network/di/AccessTokenModule.kt b/app/src/main/java/com/mydigipay/challenge/network/di/AccessTokenModule.kt index 34fcc6cf..73429ded 100644 --- a/app/src/main/java/com/mydigipay/challenge/network/di/AccessTokenModule.kt +++ b/app/src/main/java/com/mydigipay/challenge/network/di/AccessTokenModule.kt @@ -3,11 +3,11 @@ package com.mydigipay.challenge.network.di import com.mydigipay.challenge.network.oauth.AccessTokenService import com.mydigipay.challenge.repository.oauth.AccessTokenDataSource import com.mydigipay.challenge.repository.oauth.AccessTokenDataSourceImpl -import org.koin.core.qualifier.named -import org.koin.dsl.module +//import org.koin.core.qualifier.named +//import org.koin.dsl.module import retrofit2.Retrofit -val accessTokenModule = module { - factory { get(named(RETROFIT)).create(AccessTokenService::class.java) } - factory { AccessTokenDataSourceImpl(get()) as AccessTokenDataSource } -} \ No newline at end of file +//val accessTokenModule = module { +// factory { get(named(RETROFIT)).create(AccessTokenService::class.java) } +// factory { AccessTokenDataSourceImpl(get()) as AccessTokenDataSource } +//} \ No newline at end of file diff --git a/app/src/main/java/com/mydigipay/challenge/network/di/NetworkModule.kt b/app/src/main/java/com/mydigipay/challenge/network/di/NetworkModule.kt deleted file mode 100644 index 60ae9e5b..00000000 --- a/app/src/main/java/com/mydigipay/challenge/network/di/NetworkModule.kt +++ /dev/null @@ -1,53 +0,0 @@ -package com.mydigipay.challenge.network.di - -import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory -import com.mydigipay.challenge.repository.token.TokenRepository -import com.mydigipay.challenge.repository.token.TokenRepositoryImpl -import okhttp3.Interceptor -import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor -import org.koin.core.qualifier.named -import org.koin.dsl.module -import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory -import java.util.concurrent.TimeUnit - -const val OK_HTTP = "OK_HTTP" -const val RETROFIT = "RETROFIT" -const val READ_TIMEOUT = "READ_TIMEOUT" -const val WRITE_TIMEOUT = "WRITE_TIMEOUT" -const val CONNECTION_TIMEOUT = "CONNECTION_TIMEOUT" -val networkModule = module { - - single(named(READ_TIMEOUT)) { 30 * 1000 } - single(named(WRITE_TIMEOUT)) { 10 * 1000 } - single(named(CONNECTION_TIMEOUT)) { 10 * 1000 } - - factory { - HttpLoggingInterceptor() - .setLevel(HttpLoggingInterceptor.Level.HEADERS) - .setLevel(HttpLoggingInterceptor.Level.BODY) - } - - factory(named(OK_HTTP)) { - OkHttpClient.Builder() - .readTimeout(get(named(READ_TIMEOUT)), TimeUnit.MILLISECONDS) - .writeTimeout(get(named(WRITE_TIMEOUT)), TimeUnit.MILLISECONDS) - .connectTimeout(get(named(CONNECTION_TIMEOUT)), TimeUnit.MILLISECONDS) - .addInterceptor(get()) - .build() - } - - single(named(RETROFIT)) { - Retrofit.Builder() - .client(get(named(OK_HTTP))) - .baseUrl("http://api.github.com") - .addConverterFactory(GsonConverterFactory.create()) - .addCallAdapterFactory(CoroutineCallAdapterFactory()) - .build() - } - - single { - TokenRepositoryImpl(get()) as TokenRepository - } -} \ No newline at end of file diff --git a/app/src/main/java/com/mydigipay/challenge/presentation/github/LoginUriActivity.kt b/app/src/main/java/com/mydigipay/challenge/presentation/github/LoginUriActivity.kt index 13ada4a5..4d5cce8a 100644 --- a/app/src/main/java/com/mydigipay/challenge/presentation/github/LoginUriActivity.kt +++ b/app/src/main/java/com/mydigipay/challenge/presentation/github/LoginUriActivity.kt @@ -8,11 +8,10 @@ import com.mydigipay.challenge.repository.oauth.AccessTokenDataSource import com.mydigipay.challenge.repository.token.TokenRepository import kotlinx.android.synthetic.main.login_uri_activity.* import kotlinx.coroutines.* -import org.koin.android.ext.android.inject class LoginUriActivity : Activity() { - private val tokenRepository: TokenRepository by inject() - private val accessTokenDataSource: AccessTokenDataSource by inject() +// private val tokenRepository: TokenRepository by inject() +// private val accessTokenDataSource: AccessTokenDataSource by inject() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -22,34 +21,34 @@ class LoginUriActivity : Activity() { override fun onResume() { super.onResume() - val intent = intent - if (Intent.ACTION_VIEW == intent.action) { - val uri = intent.data - val code = uri?.getQueryParameter("code") ?: "" - code.takeIf { it.isNotEmpty() }?.let { code -> - val accessTokenJob = CoroutineScope(Dispatchers.IO).launch { - val response = accessTokenDataSource.accessToken( - RequestAccessToken( - CLIENT_ID, - CLIENT_SECRET, - code, - REDIRECT_URI, - "0" - ) - ).await() - - tokenRepository.saveToken(response.accessToken).await() - } - - accessTokenJob.invokeOnCompletion { - CoroutineScope(Dispatchers.Main).launch { - token.text = tokenRepository.readToken().await() - this.cancel() - accessTokenJob.cancelAndJoin() - } - } - } ?: run { finish() } - } +// val intent = intent +// if (Intent.ACTION_VIEW == intent.action) { +// val uri = intent.data +// val code = uri?.getQueryParameter("code") ?: "" +// code.takeIf { it.isNotEmpty() }?.let { code -> +// val accessTokenJob = CoroutineScope(Dispatchers.IO).launch { +// val response = accessTokenDataSource.accessToken( +// RequestAccessToken( +// CLIENT_ID, +// CLIENT_SECRET, +// code, +// REDIRECT_URI, +// "0" +// ) +// ).await() +// +// tokenRepository.saveToken(response.accessToken).await() +// } +// +// accessTokenJob.invokeOnCompletion { +// CoroutineScope(Dispatchers.Main).launch { +// token.text = tokenRepository.readToken().await() +// this.cancel() +// accessTokenJob.cancelAndJoin() +// } +// } +// } ?: run { finish() } +// } } diff --git a/app/src/main/java/com/mydigipay/challenge/presentation/github/MainActivity.kt b/app/src/main/java/com/mydigipay/challenge/presentation/github/MainActivity.kt index c99102d1..34dfb52e 100644 --- a/app/src/main/java/com/mydigipay/challenge/presentation/github/MainActivity.kt +++ b/app/src/main/java/com/mydigipay/challenge/presentation/github/MainActivity.kt @@ -6,8 +6,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import kotlinx.android.synthetic.main.activity_main.* -const val CLIENT_ID = "CLIENT_ID" -const val CLIENT_SECRET = "CLIENT_SECRET" +const val CLIENT_ID = "Iv1.791f3bf9dee10749" +const val CLIENT_SECRET = "b252036c3238ec98a4a1dbd2ad6683c5664295a7" const val REDIRECT_URI = "REDIRECT_URI" class MainActivity : AppCompatActivity() { From 80ca13eaf848e545c1d19fa60e99c2b163cd78d8 Mon Sep 17 00:00:00 2001 From: Mohsen Einhesari Date: Wed, 22 Jul 2020 23:08:53 +0430 Subject: [PATCH 04/46] add dagger ViewModelModule and ViewModelFactoryModule --- .../challenge/app/ViewModelProviderFactory.kt | 15 +++++++++++++++ .../challenge/di/component/AppComponent.kt | 17 ++++++++++++++++- .../di/module/ViewModelFactoryModule.kt | 10 ++++++++++ .../challenge/di/module/ViewModelModule.kt | 11 +++++++++++ .../challenge/di/scope/ViewModelKey.kt | 13 +++++++++++++ 5 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/mydigipay/challenge/app/ViewModelProviderFactory.kt create mode 100644 app/src/main/java/com/mydigipay/challenge/di/module/ViewModelFactoryModule.kt create mode 100644 app/src/main/java/com/mydigipay/challenge/di/module/ViewModelModule.kt create mode 100644 app/src/main/java/com/mydigipay/challenge/di/scope/ViewModelKey.kt diff --git a/app/src/main/java/com/mydigipay/challenge/app/ViewModelProviderFactory.kt b/app/src/main/java/com/mydigipay/challenge/app/ViewModelProviderFactory.kt new file mode 100644 index 00000000..a02e04b3 --- /dev/null +++ b/app/src/main/java/com/mydigipay/challenge/app/ViewModelProviderFactory.kt @@ -0,0 +1,15 @@ +package com.mydigipay.challenge.app + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import javax.inject.Inject +import javax.inject.Provider + +class ViewModelProviderFactory @Inject constructor( + private val creators: MutableMap, Provider> +) : ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + return creators[modelClass]?.get() as? T + ?: throw IllegalArgumentException("The requested ViewModel isn't bound") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mydigipay/challenge/di/component/AppComponent.kt b/app/src/main/java/com/mydigipay/challenge/di/component/AppComponent.kt index 68215ed4..56e08f6f 100644 --- a/app/src/main/java/com/mydigipay/challenge/di/component/AppComponent.kt +++ b/app/src/main/java/com/mydigipay/challenge/di/component/AppComponent.kt @@ -1,14 +1,29 @@ package com.mydigipay.challenge.di.component import android.content.Context +import com.einhesari.batmanmovies.di.module.ViewModelModule import dagger.BindsInstance import dagger.Component +import dagger.Subcomponent -@Component(modules = []) +@Component interface AppComponent { @Component.Factory interface Factory { fun create(@BindsInstance context: Context): AppComponent } + + val viewModelProviderFactory: ViewModelComponent.Factory + +} + +@Subcomponent(modules = [ViewModelModule::class]) +interface ViewModelComponent { + + @Subcomponent.Factory + interface Factory { + fun create(): ViewModelComponent + } + } \ No newline at end of file diff --git a/app/src/main/java/com/mydigipay/challenge/di/module/ViewModelFactoryModule.kt b/app/src/main/java/com/mydigipay/challenge/di/module/ViewModelFactoryModule.kt new file mode 100644 index 00000000..20e383a2 --- /dev/null +++ b/app/src/main/java/com/mydigipay/challenge/di/module/ViewModelFactoryModule.kt @@ -0,0 +1,10 @@ +package com.einhesari.batmanmovies.di.module + +import androidx.lifecycle.ViewModelProvider +import com.mydigipay.challenge.app.ViewModelProviderFactory +import dagger.Module + +@Module +abstract class ViewModelFactoryModule { + abstract fun bindViewModelFactory(viewModelProviderFactory: ViewModelProviderFactory): ViewModelProvider.Factory +} \ No newline at end of file diff --git a/app/src/main/java/com/mydigipay/challenge/di/module/ViewModelModule.kt b/app/src/main/java/com/mydigipay/challenge/di/module/ViewModelModule.kt new file mode 100644 index 00000000..b3a2e7e1 --- /dev/null +++ b/app/src/main/java/com/mydigipay/challenge/di/module/ViewModelModule.kt @@ -0,0 +1,11 @@ +package com.einhesari.batmanmovies.di.module + +import androidx.lifecycle.ViewModel +import dagger.Binds +import dagger.Module +import dagger.multibindings.IntoMap + +@Module +abstract class ViewModelModule { + +} \ No newline at end of file diff --git a/app/src/main/java/com/mydigipay/challenge/di/scope/ViewModelKey.kt b/app/src/main/java/com/mydigipay/challenge/di/scope/ViewModelKey.kt new file mode 100644 index 00000000..05603713 --- /dev/null +++ b/app/src/main/java/com/mydigipay/challenge/di/scope/ViewModelKey.kt @@ -0,0 +1,13 @@ +package com.mydigipay.challenge.di.scope + +import androidx.lifecycle.ViewModel +import dagger.MapKey +import kotlin.reflect.KClass + + +@MustBeDocumented +@Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.RUNTIME) +@MapKey +annotation class ViewModelKey(val value: KClass) { +} \ No newline at end of file From 6a6502b70d33d9b3ffca4f82a5b0df64360528e9 Mon Sep 17 00:00:00 2001 From: Mohsen Einhesari Date: Wed, 22 Jul 2020 23:30:24 +0430 Subject: [PATCH 05/46] add MainActivityViewModel --- app/src/main/AndroidManifest.xml | 2 +- .../challenge/di/component/AppComponent.kt | 3 ++ .../repository/oauth/AccessTokenDataSource.kt | 2 +- .../oauth/AccessTokenDataSourceImpl.kt | 2 +- .../repository/token/TokenRepository.kt | 2 +- .../repository/token/TokenRepositoryImpl.kt | 2 +- .../challenge/network/di/AccessTokenModule.kt | 4 -- .../challenge/presentation/MainActivity.kt | 40 +++++++++++++++++++ .../presentation/MainActivityViewModel.kt | 11 +++++ .../presentation/github/LoginUriActivity.kt | 6 --- .../presentation/github/MainActivity.kt | 25 ------------ app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/menu/menu_main.xml | 2 +- 13 files changed, 61 insertions(+), 42 deletions(-) rename app/src/main/java/com/mydigipay/challenge/{ => domain}/repository/oauth/AccessTokenDataSource.kt (83%) rename app/src/main/java/com/mydigipay/challenge/{ => domain}/repository/oauth/AccessTokenDataSourceImpl.kt (86%) rename app/src/main/java/com/mydigipay/challenge/{ => domain}/repository/token/TokenRepository.kt (73%) rename app/src/main/java/com/mydigipay/challenge/{ => domain}/repository/token/TokenRepositoryImpl.kt (91%) create mode 100644 app/src/main/java/com/mydigipay/challenge/presentation/MainActivity.kt create mode 100644 app/src/main/java/com/mydigipay/challenge/presentation/MainActivityViewModel.kt delete mode 100644 app/src/main/java/com/mydigipay/challenge/presentation/github/MainActivity.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f13caa66..a50193dd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,7 +11,7 @@ android:theme="@style/AppTheme" android:name="com.mydigipay.challenge.app.App"> diff --git a/app/src/main/java/com/mydigipay/challenge/di/component/AppComponent.kt b/app/src/main/java/com/mydigipay/challenge/di/component/AppComponent.kt index 56e08f6f..b119bfa1 100644 --- a/app/src/main/java/com/mydigipay/challenge/di/component/AppComponent.kt +++ b/app/src/main/java/com/mydigipay/challenge/di/component/AppComponent.kt @@ -2,6 +2,7 @@ package com.mydigipay.challenge.di.component import android.content.Context import com.einhesari.batmanmovies.di.module.ViewModelModule +import com.mydigipay.challenge.presentation.MainActivity import dagger.BindsInstance import dagger.Component import dagger.Subcomponent @@ -21,6 +22,8 @@ interface AppComponent { @Subcomponent(modules = [ViewModelModule::class]) interface ViewModelComponent { + fun inject(mainActivity: MainActivity) + @Subcomponent.Factory interface Factory { fun create(): ViewModelComponent diff --git a/app/src/main/java/com/mydigipay/challenge/repository/oauth/AccessTokenDataSource.kt b/app/src/main/java/com/mydigipay/challenge/domain/repository/oauth/AccessTokenDataSource.kt similarity index 83% rename from app/src/main/java/com/mydigipay/challenge/repository/oauth/AccessTokenDataSource.kt rename to app/src/main/java/com/mydigipay/challenge/domain/repository/oauth/AccessTokenDataSource.kt index ad56e5d7..808e77a5 100644 --- a/app/src/main/java/com/mydigipay/challenge/repository/oauth/AccessTokenDataSource.kt +++ b/app/src/main/java/com/mydigipay/challenge/domain/repository/oauth/AccessTokenDataSource.kt @@ -1,4 +1,4 @@ -package com.mydigipay.challenge.repository.oauth +package com.mydigipay.challenge.domain.repository.oauth import com.mydigipay.challenge.network.oauth.RequestAccessToken import com.mydigipay.challenge.network.oauth.ResponseAccessToken diff --git a/app/src/main/java/com/mydigipay/challenge/repository/oauth/AccessTokenDataSourceImpl.kt b/app/src/main/java/com/mydigipay/challenge/domain/repository/oauth/AccessTokenDataSourceImpl.kt similarity index 86% rename from app/src/main/java/com/mydigipay/challenge/repository/oauth/AccessTokenDataSourceImpl.kt rename to app/src/main/java/com/mydigipay/challenge/domain/repository/oauth/AccessTokenDataSourceImpl.kt index d480bc06..47e83fc8 100644 --- a/app/src/main/java/com/mydigipay/challenge/repository/oauth/AccessTokenDataSourceImpl.kt +++ b/app/src/main/java/com/mydigipay/challenge/domain/repository/oauth/AccessTokenDataSourceImpl.kt @@ -1,4 +1,4 @@ -package com.mydigipay.challenge.repository.oauth +package com.mydigipay.challenge.domain.repository.oauth import com.mydigipay.challenge.network.oauth.AccessTokenService import com.mydigipay.challenge.network.oauth.RequestAccessToken diff --git a/app/src/main/java/com/mydigipay/challenge/repository/token/TokenRepository.kt b/app/src/main/java/com/mydigipay/challenge/domain/repository/token/TokenRepository.kt similarity index 73% rename from app/src/main/java/com/mydigipay/challenge/repository/token/TokenRepository.kt rename to app/src/main/java/com/mydigipay/challenge/domain/repository/token/TokenRepository.kt index 8338e729..75624180 100644 --- a/app/src/main/java/com/mydigipay/challenge/repository/token/TokenRepository.kt +++ b/app/src/main/java/com/mydigipay/challenge/domain/repository/token/TokenRepository.kt @@ -1,4 +1,4 @@ -package com.mydigipay.challenge.repository.token +package com.mydigipay.challenge.domain.repository.token import kotlinx.coroutines.Deferred diff --git a/app/src/main/java/com/mydigipay/challenge/repository/token/TokenRepositoryImpl.kt b/app/src/main/java/com/mydigipay/challenge/domain/repository/token/TokenRepositoryImpl.kt similarity index 91% rename from app/src/main/java/com/mydigipay/challenge/repository/token/TokenRepositoryImpl.kt rename to app/src/main/java/com/mydigipay/challenge/domain/repository/token/TokenRepositoryImpl.kt index 5aad06ef..0ccea70e 100644 --- a/app/src/main/java/com/mydigipay/challenge/repository/token/TokenRepositoryImpl.kt +++ b/app/src/main/java/com/mydigipay/challenge/domain/repository/token/TokenRepositoryImpl.kt @@ -1,4 +1,4 @@ -package com.mydigipay.challenge.repository.token +package com.mydigipay.challenge.domain.repository.token import android.content.SharedPreferences import kotlinx.coroutines.CoroutineScope diff --git a/app/src/main/java/com/mydigipay/challenge/network/di/AccessTokenModule.kt b/app/src/main/java/com/mydigipay/challenge/network/di/AccessTokenModule.kt index 73429ded..4cb348c1 100644 --- a/app/src/main/java/com/mydigipay/challenge/network/di/AccessTokenModule.kt +++ b/app/src/main/java/com/mydigipay/challenge/network/di/AccessTokenModule.kt @@ -1,11 +1,7 @@ package com.mydigipay.challenge.network.di -import com.mydigipay.challenge.network.oauth.AccessTokenService -import com.mydigipay.challenge.repository.oauth.AccessTokenDataSource -import com.mydigipay.challenge.repository.oauth.AccessTokenDataSourceImpl //import org.koin.core.qualifier.named //import org.koin.dsl.module -import retrofit2.Retrofit //val accessTokenModule = module { // factory { get(named(RETROFIT)).create(AccessTokenService::class.java) } diff --git a/app/src/main/java/com/mydigipay/challenge/presentation/MainActivity.kt b/app/src/main/java/com/mydigipay/challenge/presentation/MainActivity.kt new file mode 100644 index 00000000..2248c56e --- /dev/null +++ b/app/src/main/java/com/mydigipay/challenge/presentation/MainActivity.kt @@ -0,0 +1,40 @@ +package com.mydigipay.challenge.presentation + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.mydigipay.challenge.app.component +import com.mydigipay.challenge.presentation.github.R +import kotlinx.android.synthetic.main.activity_main.* +import javax.inject.Inject + +const val CLIENT_ID = "Iv1.791f3bf9dee10749" +const val CLIENT_SECRET = "b252036c3238ec98a4a1dbd2ad6683c5664295a7" +const val REDIRECT_URI = "REDIRECT_URI" + +class MainActivity : AppCompatActivity() { + + @Inject + lateinit var viewModel: MainActivityViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + component.viewModelProviderFactory.create().inject(this) + if(viewModel.isUserAuthorized()){ + TODO("Not Implemented") + }else{ + setContentView(R.layout.activity_main) + authorize.setOnClickListener { view -> + val url = + "https://github.com/login/oauth/authorize?client_id=$CLIENT_ID&redirect_uri=$REDIRECT_URI&scope=repo user&state=0" + val i = Intent(Intent.ACTION_VIEW) + i.data = Uri.parse(url) + startActivity(i) + } + } + + + } +} diff --git a/app/src/main/java/com/mydigipay/challenge/presentation/MainActivityViewModel.kt b/app/src/main/java/com/mydigipay/challenge/presentation/MainActivityViewModel.kt new file mode 100644 index 00000000..beb98b67 --- /dev/null +++ b/app/src/main/java/com/mydigipay/challenge/presentation/MainActivityViewModel.kt @@ -0,0 +1,11 @@ +package com.mydigipay.challenge.presentation + +import android.view.View +import androidx.lifecycle.ViewModel + +class MainActivityViewModel : ViewModel() { + + fun isUserAuthorized(): Boolean { + TODO("Not Implemented") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mydigipay/challenge/presentation/github/LoginUriActivity.kt b/app/src/main/java/com/mydigipay/challenge/presentation/github/LoginUriActivity.kt index 4d5cce8a..2f6d3a08 100644 --- a/app/src/main/java/com/mydigipay/challenge/presentation/github/LoginUriActivity.kt +++ b/app/src/main/java/com/mydigipay/challenge/presentation/github/LoginUriActivity.kt @@ -1,13 +1,7 @@ package com.mydigipay.challenge.presentation.github import android.app.Activity -import android.content.Intent import android.os.Bundle -import com.mydigipay.challenge.network.oauth.RequestAccessToken -import com.mydigipay.challenge.repository.oauth.AccessTokenDataSource -import com.mydigipay.challenge.repository.token.TokenRepository -import kotlinx.android.synthetic.main.login_uri_activity.* -import kotlinx.coroutines.* class LoginUriActivity : Activity() { // private val tokenRepository: TokenRepository by inject() diff --git a/app/src/main/java/com/mydigipay/challenge/presentation/github/MainActivity.kt b/app/src/main/java/com/mydigipay/challenge/presentation/github/MainActivity.kt deleted file mode 100644 index 34dfb52e..00000000 --- a/app/src/main/java/com/mydigipay/challenge/presentation/github/MainActivity.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.mydigipay.challenge.presentation.github - -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import kotlinx.android.synthetic.main.activity_main.* - -const val CLIENT_ID = "Iv1.791f3bf9dee10749" -const val CLIENT_SECRET = "b252036c3238ec98a4a1dbd2ad6683c5664295a7" -const val REDIRECT_URI = "REDIRECT_URI" - -class MainActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - - authorize.setOnClickListener { view -> - val url = "https://github.com/login/oauth/authorize?client_id=$CLIENT_ID&redirect_uri=$REDIRECT_URI&scope=repo user&state=0" - val i = Intent(Intent.ACTION_VIEW) - i.data = Uri.parse(url) - startActivity(i) - } - } -} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fe87f339..0b873bfc 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity"> + tools:context="com.mydigipay.challenge.presentation.MainActivity">