diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 41871c2..4404972 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -5,7 +5,7 @@ diff --git a/app/build.gradle b/app/build.gradle index 4074a58..576eec3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,8 +4,6 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' -apply plugin: 'kotlin-android-extensions' - apply plugin: 'dagger.hilt.android.plugin' apply plugin: 'com.google.gms.google-services' @@ -13,26 +11,26 @@ apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' android { - compileSdkVersion 29 - dataBinding.enabled = true + compileSdkVersion 31 defaultConfig { applicationId "com.rootstrap.android" minSdkVersion 23 - targetSdkVersion 29 + targetSdkVersion 31 versionCode 42 versionName "1.0" testInstrumentationRunner 'com.rootstrap.android.CustomTestRunner' } - viewBinding { - enabled = true - } - compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + buildFeatures { + viewBinding true + dataBinding true + } + kotlinOptions { jvmTarget = '1.8' } @@ -58,6 +56,10 @@ android { } } + kapt { + correctErrorTypes true + } + flavorDimensions "server" productFlavors { @@ -137,63 +139,74 @@ android { } dependencies { + def room_version = "2.3.0" + def lifecycle_version = "2.4.0" + implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1' - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'androidx.core:core-ktx:1.3.2' - implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.1' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation "androidx.preference:preference-ktx:1.1.1" - implementation 'com.google.android.material:material:1.2.1' + implementation 'com.google.android.material:material:1.4.0' testImplementation 'junit:junit:4.13.1' testImplementation 'org.mockito:mockito-core:2.28.2' - androidTestImplementation 'androidx.test:runner:1.3.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' - androidTestImplementation 'androidx.test.espresso:espresso-intents:3.3.0' - androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test:runner:1.4.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + androidTestImplementation 'androidx.test.espresso:espresso-intents:3.4.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' - androidTestImplementation 'androidx.test:rules:1.3.0' + androidTestImplementation 'androidx.test:rules:1.4.0' androidTestImplementation 'com.squareup.okhttp3:mockwebserver:4.3.1' - //---- ANDROID ARCH ROOM ---- - implementation 'android.arch.persistence.room:runtime:1.1.1' - kapt "android.arch.persistence.room:compiler:1.1.1" - //---- ANDROID ARCH LIFECYCLE ---- - implementation 'android.arch.lifecycle:common-java8:1.1.1' - kapt "android.arch.lifecycle:compiler:1.1.1" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0" - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0" + + //---- ROOM ---- + implementation "androidx.room:room-runtime:$room_version" + kapt "androidx.room:room-compiler:$room_version" + // Kotlin Extensions and Coroutines support for Room + implementation "androidx.room:room-ktx:$room_version" + + //---- LIFECYCLE ----] + implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" + implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" //---- GOOGLE JSON SERIALIZER/DESERIALIZER ---- implementation 'com.google.code.gson:gson:2.8.6' + //---- MixPanel ---- implementation 'com.mixpanel.android:mixpanel-android:5.6.1' + //---- Firebase ---- - implementation platform('com.google.firebase:firebase-bom:26.1.0') - implementation 'com.google.firebase:firebase-core:18.0.2' + implementation platform('com.google.firebase:firebase-bom:28.4.2') + implementation 'com.google.firebase:firebase-core:20.0.0' implementation 'com.google.firebase:firebase-analytics-ktx' implementation 'com.google.firebase:firebase-crashlytics-ktx' - implementation 'org.jetbrains.kotlin:kotlin-reflect:1.4.10' + implementation 'org.jetbrains.kotlin:kotlin-reflect:1.5.31' + //---- Image ---- implementation group: 'com.github.bumptech.glide', name: 'glide', version: '4.10.0' + //---- Network ---- implementation 'com.squareup.retrofit2:retrofit:2.6.2' - implementation 'com.squareup.moshi:moshi-kotlin:1.9.2' + implementation 'com.squareup.moshi:moshi-kotlin:1.12.0' implementation 'com.squareup.retrofit2:converter-moshi:2.5.0' implementation 'com.squareup.okhttp3:logging-interceptor:4.3.1' + //---- Events ---- implementation 'com.squareup:otto:1.3.8' + //---- Linters ---- ktlint "com.pinterest:ktlint:0.35.0" + //---- Hilt ---- - implementation "com.google.dagger:hilt-android:2.28-alpha" - implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02' - kapt "com.google.dagger:hilt-android-compiler:2.28-alpha" - kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02' - androidTestImplementation 'com.google.dagger:hilt-android-testing:2.28-alpha' - kaptAndroidTest 'com.google.dagger:hilt-android-compiler:2.28-alpha' + implementation "com.google.dagger:hilt-android:$hilt_version" + kapt "com.google.dagger:hilt-android-compiler:$hilt_version" + kapt 'androidx.hilt:hilt-compiler:1.0.0' + androidTestImplementation "com.google.dagger:hilt-android-testing:$hilt_version" + kaptAndroidTest "com.google.dagger:hilt-android-compiler:$hilt_version" //security crypto implementation "androidx.security:security-crypto:1.1.0-alpha03" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b16d794..9f08fae 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,7 +17,8 @@ + android:screenOrientation="portrait" + android:exported="true"> diff --git a/app/src/main/java/com/rootstrap/android/network/managers/ManagerModule.kt b/app/src/main/java/com/rootstrap/android/network/managers/ManagerModule.kt index 6447fec..2da2571 100644 --- a/app/src/main/java/com/rootstrap/android/network/managers/ManagerModule.kt +++ b/app/src/main/java/com/rootstrap/android/network/managers/ManagerModule.kt @@ -7,11 +7,11 @@ import com.rootstrap.android.network.managers.user.UserManagerImpl import dagger.Binds import dagger.Module import dagger.hilt.InstallIn -import dagger.hilt.android.components.ApplicationComponent +import dagger.hilt.components.SingletonComponent import javax.inject.Singleton @Module -@InstallIn(ApplicationComponent::class) +@InstallIn(SingletonComponent::class) abstract class ManagerModule { @Binds diff --git a/app/src/main/java/com/rootstrap/android/network/providers/ServiceProviderModule.kt b/app/src/main/java/com/rootstrap/android/network/providers/ServiceProviderModule.kt index 8665732..c7bc33c 100644 --- a/app/src/main/java/com/rootstrap/android/network/providers/ServiceProviderModule.kt +++ b/app/src/main/java/com/rootstrap/android/network/providers/ServiceProviderModule.kt @@ -8,8 +8,8 @@ import com.squareup.moshi.Moshi import dagger.Module import dagger.Provides import dagger.hilt.InstallIn -import dagger.hilt.android.components.ApplicationComponent import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory +import dagger.hilt.components.SingletonComponent import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit @@ -17,7 +17,7 @@ import retrofit2.converter.moshi.MoshiConverterFactory import javax.inject.Singleton @Module -@InstallIn(ApplicationComponent::class) +@InstallIn(SingletonComponent::class) class ServiceProviderModule { @Provides diff --git a/app/src/main/java/com/rootstrap/android/network/services/ApiModule.kt b/app/src/main/java/com/rootstrap/android/network/services/ApiModule.kt index 53c844a..66b0593 100644 --- a/app/src/main/java/com/rootstrap/android/network/services/ApiModule.kt +++ b/app/src/main/java/com/rootstrap/android/network/services/ApiModule.kt @@ -3,11 +3,11 @@ package com.rootstrap.android.network.services import dagger.Module import dagger.Provides import dagger.hilt.InstallIn -import dagger.hilt.android.components.ApplicationComponent +import dagger.hilt.components.SingletonComponent import retrofit2.Retrofit @Module -@InstallIn(ApplicationComponent::class) +@InstallIn(SingletonComponent::class) class ApiModule { @Provides diff --git a/app/src/main/java/com/rootstrap/android/ui/activity/main/ProfileActivity.kt b/app/src/main/java/com/rootstrap/android/ui/activity/main/ProfileActivity.kt index 7c92979..3999b3b 100644 --- a/app/src/main/java/com/rootstrap/android/ui/activity/main/ProfileActivity.kt +++ b/app/src/main/java/com/rootstrap/android/ui/activity/main/ProfileActivity.kt @@ -4,6 +4,7 @@ import android.os.Bundle import androidx.activity.viewModels import androidx.lifecycle.Observer import com.rootstrap.android.R +import com.rootstrap.android.databinding.ActivityProfileBinding import com.rootstrap.android.metrics.Analytics import com.rootstrap.android.metrics.PageEvents import com.rootstrap.android.metrics.VISIT_PROFILE @@ -12,7 +13,6 @@ import com.rootstrap.android.ui.base.BaseActivity import com.rootstrap.android.ui.view.ProfileView import com.rootstrap.android.util.NetworkState import dagger.hilt.android.AndroidEntryPoint -import kotlinx.android.synthetic.main.activity_profile.* import javax.inject.Inject @AndroidEntryPoint @@ -21,15 +21,18 @@ class ProfileActivity : BaseActivity(), ProfileView { @Inject lateinit var sessionManager: SessionManager private val viewModel: ProfileActivityViewModel by viewModels() + private val binding by lazy { ActivityProfileBinding.inflate(layoutInflater) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_profile) Analytics.track(PageEvents.visit(VISIT_PROFILE)) - welcome_text_view.text = getString(R.string.welcome_message, sessionManager.user?.firstName) - sign_out_button.setOnClickListener { viewModel.signOut() } + with(binding) { + setContentView(root) + welcomeTextView.text = getString(R.string.welcome_message, sessionManager.user?.firstName) + signOutButton.setOnClickListener { viewModel.signOut() } + } lifecycle.addObserver(viewModel) setObservers() diff --git a/app/src/main/java/com/rootstrap/android/ui/activity/main/ProfileActivityViewModel.kt b/app/src/main/java/com/rootstrap/android/ui/activity/main/ProfileActivityViewModel.kt index 7fdf3ec..e8a7a04 100644 --- a/app/src/main/java/com/rootstrap/android/ui/activity/main/ProfileActivityViewModel.kt +++ b/app/src/main/java/com/rootstrap/android/ui/activity/main/ProfileActivityViewModel.kt @@ -1,6 +1,5 @@ package com.rootstrap.android.ui.activity.main -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope @@ -10,9 +9,12 @@ import com.rootstrap.android.ui.base.BaseViewModel import com.rootstrap.android.util.NetworkState import com.rootstrap.android.util.extensions.ApiErrorType import com.rootstrap.android.util.extensions.ApiException +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import javax.inject.Inject -open class ProfileActivityViewModel @ViewModelInject constructor( +@HiltViewModel +open class ProfileActivityViewModel @Inject constructor( private val sessionManager: SessionManager, private val userManager: UserManager ) : BaseViewModel() { diff --git a/app/src/main/java/com/rootstrap/android/ui/activity/main/SignInActivity.kt b/app/src/main/java/com/rootstrap/android/ui/activity/main/SignInActivity.kt index fdf09a0..964581c 100644 --- a/app/src/main/java/com/rootstrap/android/ui/activity/main/SignInActivity.kt +++ b/app/src/main/java/com/rootstrap/android/ui/activity/main/SignInActivity.kt @@ -21,11 +21,12 @@ import dagger.hilt.android.AndroidEntryPoint class SignInActivity : PermissionActivity(), AuthView { private val viewModel: SignInActivityViewModel by viewModels() - private lateinit var binding: ActivitySignInBinding + private val binding: ActivitySignInBinding by lazy { + ActivitySignInBinding.inflate(layoutInflater) + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = ActivitySignInBinding.inflate(layoutInflater) setContentView(binding.root) Analytics.track(PageEvents.visit(VISIT_SIGN_IN)) diff --git a/app/src/main/java/com/rootstrap/android/ui/activity/main/SignInActivityViewModel.kt b/app/src/main/java/com/rootstrap/android/ui/activity/main/SignInActivityViewModel.kt index c3783ac..d8b16a6 100644 --- a/app/src/main/java/com/rootstrap/android/ui/activity/main/SignInActivityViewModel.kt +++ b/app/src/main/java/com/rootstrap/android/ui/activity/main/SignInActivityViewModel.kt @@ -1,6 +1,5 @@ package com.rootstrap.android.ui.activity.main -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope @@ -11,9 +10,12 @@ import com.rootstrap.android.ui.base.BaseViewModel import com.rootstrap.android.util.NetworkState import com.rootstrap.android.util.extensions.ApiErrorType import com.rootstrap.android.util.extensions.ApiException +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import javax.inject.Inject -open class SignInActivityViewModel @ViewModelInject constructor( +@HiltViewModel +open class SignInActivityViewModel @Inject constructor( private val sessionManager: SessionManager, private val userManager: UserManager ) : BaseViewModel() { diff --git a/app/src/main/java/com/rootstrap/android/ui/activity/main/SignUpActivity.kt b/app/src/main/java/com/rootstrap/android/ui/activity/main/SignUpActivity.kt index 83ef2f4..8f75729 100644 --- a/app/src/main/java/com/rootstrap/android/ui/activity/main/SignUpActivity.kt +++ b/app/src/main/java/com/rootstrap/android/ui/activity/main/SignUpActivity.kt @@ -20,11 +20,12 @@ import dagger.hilt.android.AndroidEntryPoint class SignUpActivity : BaseActivity(), AuthView { private val viewModel: SignUpActivityViewModel by viewModels() - private lateinit var binding: ActivitySignUpBinding + private val binding: ActivitySignUpBinding by lazy { + ActivitySignUpBinding.inflate(layoutInflater) + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = ActivitySignUpBinding.inflate(layoutInflater) setContentView(binding.root) Analytics.track(PageEvents.visit(VISIT_SIGN_UP)) diff --git a/app/src/main/java/com/rootstrap/android/ui/activity/main/SignUpActivityViewModel.kt b/app/src/main/java/com/rootstrap/android/ui/activity/main/SignUpActivityViewModel.kt index 47ae75f..c571d58 100644 --- a/app/src/main/java/com/rootstrap/android/ui/activity/main/SignUpActivityViewModel.kt +++ b/app/src/main/java/com/rootstrap/android/ui/activity/main/SignUpActivityViewModel.kt @@ -1,6 +1,5 @@ package com.rootstrap.android.ui.activity.main -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope @@ -11,9 +10,12 @@ import com.rootstrap.android.ui.base.BaseViewModel import com.rootstrap.android.util.NetworkState import com.rootstrap.android.util.extensions.ApiErrorType import com.rootstrap.android.util.extensions.ApiException +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch +import javax.inject.Inject -open class SignUpActivityViewModel @ViewModelInject constructor( +@HiltViewModel +open class SignUpActivityViewModel @Inject constructor( private val sessionManager: SessionManager, private val userManager: UserManager ) : BaseViewModel() { diff --git a/app/src/main/java/com/rootstrap/android/util/UtilModule.kt b/app/src/main/java/com/rootstrap/android/util/UtilModule.kt index 3038e42..39a1245 100644 --- a/app/src/main/java/com/rootstrap/android/util/UtilModule.kt +++ b/app/src/main/java/com/rootstrap/android/util/UtilModule.kt @@ -11,12 +11,12 @@ import com.squareup.otto.Bus import dagger.Module import dagger.Provides import dagger.hilt.InstallIn -import dagger.hilt.android.components.ApplicationComponent import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent import javax.inject.Singleton @Module -@InstallIn(ApplicationComponent::class) +@InstallIn(SingletonComponent::class) class UtilModule { @Provides diff --git a/build.gradle b/build.gradle index 8f768b0..ea46473 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.72' + ext.kotlin_version = '1.5.31' + ext.hilt_version = '2.39.1' repositories { google() jcenter() @@ -11,11 +12,11 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:4.1.1' + classpath 'com.android.tools.build:gradle:4.1.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.4' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.4.1' - classpath "com.google.dagger:hilt-android-gradle-plugin:2.28-alpha" + classpath 'com.google.gms:google-services:4.3.10' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.0' + classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }