diff --git a/README.md b/README.md index 4cbe3dd..9c03f59 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ This repository contains a detailed sample app that implements MVVM architecture 7. [Android Tinder Swipe View Example](https://blog.mindorks.com/android-tinder-swipe-view-example-3eca9b0d4794#.u7i7jbbvy) 8. [Debugging Android Databases And Shared Preferences In The Easiest Way](https://blog.mindorks.com/debugging-android-databases-and-shared-preferences-in-the-easiest-way-e5f705dfc06b#.pxw0hvnws) -### Looking for Kotin MVP Architecture - [Check here](https://github.com/MindorksOpenSource/android-kotlin-mvp-architecture) +### Looking for Kotlin MVP Architecture - [Check here](https://github.com/MindorksOpenSource/android-kotlin-mvp-architecture) ### Looking for MVP Architecture - [Check here](https://github.com/MindorksOpenSource/android-mvp-architecture) diff --git a/app/build.gradle b/app/build.gradle index b4d8236..acf1d2f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,7 +26,7 @@ android { targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } buildTypes { @@ -54,19 +54,20 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) // android support libraries - implementation "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion" - implementation "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion" - implementation "com.android.support:cardview-v7:$rootProject.supportLibraryVersion" - implementation "com.android.support:design:$rootProject.supportLibraryVersion" - implementation "com.android.support:support-vector-drawable:$rootProject.supportLibraryVersion" - implementation "com.android.support:animated-vector-drawable:$rootProject.supportLibraryVersion" + implementation "androidx.appcompat:appcompat:$rootProject.supportLibraryVersion" + implementation "androidx.recyclerview:recyclerview:$rootProject.recyclerViewVersion" + implementation "androidx.cardview:cardview:$rootProject.cardViewVersion" + implementation "com.google.android.material:material:$rootProject.materialVersion" + implementation "androidx.vectordrawable:vectordrawable:$rootProject.vectorDrawableVersion" + implementation "androidx.vectordrawable:vectordrawable-animated:$rootProject.animatedVectorDrawableVersion" + implementation "androidx.constraintlayout:constraintlayout:$rootProject.constraintLayoutVersion" // network implementation "com.amitshekhar.android:rx2-android-networking:$rootProject.rx2FastAndroidNetworking" // database - implementation "android.arch.persistence.room:rxjava2:$rootProject.roomDatabase" - annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomDatabase" + implementation "androidx.room:room-rxjava2:$rootProject.roomDatabaseVersion" + annotationProcessor "androidx.room:room-compiler:$rootProject.roomDatabaseVersion" // font implementation "uk.co.chrisjenx:calligraphy:$rootProject.calligraphyVersion" @@ -102,17 +103,16 @@ dependencies { testAnnotationProcessor "com.google.dagger:dagger-compiler:$rootProject.dagger2Version" // UI Testing - androidTestImplementation "com.android.support.test.espresso:espresso-core:$rootProject.espressoVersion" - androidTestImplementation "com.android.support.test.espresso:espresso-intents:$rootProject.espressoVersion" + androidTestImplementation "androidx.test.espresso:espresso-core:$rootProject.espressoVersion" + androidTestImplementation "androidx.test.espresso:espresso-intents:$rootProject.espressoVersion" androidTestImplementation "org.mockito:mockito-core:$rootProject.mockitoVersion" androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:$rootProject.dagger2Version" // view model - implementation "android.arch.lifecycle:extensions:$rootProject.lifecycle" - annotationProcessor "android.arch.lifecycle:compiler:$rootProject.lifecycle" + implementation "androidx.lifecycle:lifecycle-extensions:$rootProject.lifecycleVersion" + annotationProcessor "androidx.lifecycle:lifecycle-compiler:$rootProject.lifecycleVersion" } configurations.all { - resolutionStrategy.force "com.android.support:support-annotations:$supportLibraryVersion" resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9' } diff --git a/app/src/androidTest/java/com/mindorks/framework/mvvm/ui/login/LoginActivityTest.java b/app/src/androidTest/java/com/mindorks/framework/mvvm/ui/login/LoginActivityTest.java index fceab88..cb6c3c5 100644 --- a/app/src/androidTest/java/com/mindorks/framework/mvvm/ui/login/LoginActivityTest.java +++ b/app/src/androidTest/java/com/mindorks/framework/mvvm/ui/login/LoginActivityTest.java @@ -16,21 +16,19 @@ package com.mindorks.framework.mvvm.ui.login; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; - +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withText; + +import androidx.test.rule.ActivityTestRule; +import androidx.test.ext.junit.runners.AndroidJUnit4; import com.mindorks.framework.mvvm.R; - import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; - /** * Created by amitshekhar on 11/07/17. */ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a2ecb20..9bf1b80 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,6 +27,7 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" + android:networkSecurityConfig="@xml/network_security_config" android:theme="@style/AppTheme"> @@ -39,8 +40,7 @@ + android:launchMode="singleTop" /> + android:parentActivityName=".ui.main.MainActivity"> - * A provider factory that persists ViewModels {@link ViewModel}. - * Used if the view model has a parameterized constructor. + * Created by jyotidubey on 22/02/19. */ -public class ViewModelProviderFactory implements ViewModelProvider.Factory { +@Singleton +public class ViewModelProviderFactory extends ViewModelProvider.NewInstanceFactory { - private V viewModel; + private final DataManager dataManager; + private final SchedulerProvider schedulerProvider; + + @Inject + public ViewModelProviderFactory(DataManager dataManager, + SchedulerProvider schedulerProvider) { + this.dataManager = dataManager; + this.schedulerProvider = schedulerProvider; + } - public ViewModelProviderFactory(V viewModel) { - this.viewModel = viewModel; - } - @Override - public T create(Class modelClass) { - if (modelClass.isAssignableFrom(viewModel.getClass())) { - return (T) viewModel; - } - throw new IllegalArgumentException("Unknown class name"); + @Override + public T create(Class modelClass) { + if (modelClass.isAssignableFrom(AboutViewModel.class)) { + //noinspection unchecked + return (T) new AboutViewModel(dataManager,schedulerProvider); + } else if (modelClass.isAssignableFrom(FeedViewModel.class)) { + //noinspection unchecked + return (T) new FeedViewModel(dataManager,schedulerProvider); + } else if (modelClass.isAssignableFrom(LoginViewModel.class)) { + //noinspection unchecked + return (T) new LoginViewModel(dataManager,schedulerProvider); + } else if (modelClass.isAssignableFrom(MainViewModel.class)) { + //noinspection unchecked + return (T) new MainViewModel(dataManager,schedulerProvider); + } + else if (modelClass.isAssignableFrom(BlogViewModel.class)) { + //noinspection unchecked + return (T) new BlogViewModel(dataManager,schedulerProvider); + } + else if (modelClass.isAssignableFrom(RateUsViewModel.class)) { + //noinspection unchecked + return (T) new RateUsViewModel(dataManager,schedulerProvider); + } + else if (modelClass.isAssignableFrom(OpenSourceViewModel.class)) { + //noinspection unchecked + return (T) new OpenSourceViewModel(dataManager,schedulerProvider); + } + else if (modelClass.isAssignableFrom(SplashViewModel.class)) { + //noinspection unchecked + return (T) new SplashViewModel(dataManager,schedulerProvider); } -} + throw new IllegalArgumentException("Unknown ViewModel class: " + modelClass.getName()); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mindorks/framework/mvvm/data/AppDataManager.java b/app/src/main/java/com/mindorks/framework/mvvm/data/AppDataManager.java index fd798f7..f73c7dd 100644 --- a/app/src/main/java/com/mindorks/framework/mvvm/data/AppDataManager.java +++ b/app/src/main/java/com/mindorks/framework/mvvm/data/AppDataManager.java @@ -17,6 +17,7 @@ package com.mindorks.framework.mvvm.data; import android.content.Context; +import android.util.Log; import com.google.gson.Gson; import com.google.gson.internal.$Gson$Types; @@ -36,22 +37,21 @@ import com.mindorks.framework.mvvm.data.remote.ApiHelper; import com.mindorks.framework.mvvm.utils.AppConstants; import com.mindorks.framework.mvvm.utils.CommonUtils; - +import io.reactivex.Observable; +import io.reactivex.Single; import java.lang.reflect.Type; import java.util.List; - import javax.inject.Inject; import javax.inject.Singleton; -import io.reactivex.Observable; -import io.reactivex.Single; - /** * Created by amitshekhar on 07/07/17. */ @Singleton public class AppDataManager implements DataManager { + private static final String TAG = "AppDataManager"; + private final ApiHelper mApiHelper; private final Context mContext; diff --git a/app/src/main/java/com/mindorks/framework/mvvm/data/DataManager.java b/app/src/main/java/com/mindorks/framework/mvvm/data/DataManager.java index 5d765fc..bd128cb 100644 --- a/app/src/main/java/com/mindorks/framework/mvvm/data/DataManager.java +++ b/app/src/main/java/com/mindorks/framework/mvvm/data/DataManager.java @@ -20,10 +20,8 @@ import com.mindorks.framework.mvvm.data.local.prefs.PreferencesHelper; import com.mindorks.framework.mvvm.data.model.others.QuestionCardData; import com.mindorks.framework.mvvm.data.remote.ApiHelper; - -import java.util.List; - import io.reactivex.Observable; +import java.util.List; /** * Created by amitshekhar on 07/07/17. diff --git a/app/src/main/java/com/mindorks/framework/mvvm/data/local/db/AppDatabase.java b/app/src/main/java/com/mindorks/framework/mvvm/data/local/db/AppDatabase.java index 7d435e8..31c2682 100644 --- a/app/src/main/java/com/mindorks/framework/mvvm/data/local/db/AppDatabase.java +++ b/app/src/main/java/com/mindorks/framework/mvvm/data/local/db/AppDatabase.java @@ -16,9 +16,8 @@ package com.mindorks.framework.mvvm.data.local.db; -import android.arch.persistence.room.Database; -import android.arch.persistence.room.RoomDatabase; - +import androidx.room.Database; +import androidx.room.RoomDatabase; import com.mindorks.framework.mvvm.data.local.db.dao.OptionDao; import com.mindorks.framework.mvvm.data.local.db.dao.QuestionDao; import com.mindorks.framework.mvvm.data.local.db.dao.UserDao; diff --git a/app/src/main/java/com/mindorks/framework/mvvm/data/local/db/AppDbHelper.java b/app/src/main/java/com/mindorks/framework/mvvm/data/local/db/AppDbHelper.java index aa078d0..e04abd4 100644 --- a/app/src/main/java/com/mindorks/framework/mvvm/data/local/db/AppDbHelper.java +++ b/app/src/main/java/com/mindorks/framework/mvvm/data/local/db/AppDbHelper.java @@ -19,15 +19,12 @@ import com.mindorks.framework.mvvm.data.model.db.Option; import com.mindorks.framework.mvvm.data.model.db.Question; import com.mindorks.framework.mvvm.data.model.db.User; - +import io.reactivex.Observable; import java.util.List; import java.util.concurrent.Callable; - import javax.inject.Inject; import javax.inject.Singleton; -import io.reactivex.Observable; - /** * Created by amitshekhar on 07/07/17. */ @@ -44,12 +41,8 @@ public AppDbHelper(AppDatabase appDatabase) { @Override public Observable> getAllQuestions() { - return Observable.fromCallable(new Callable>() { - @Override - public List call() throws Exception { - return mAppDatabase.questionDao().loadAll(); - } - }); + return mAppDatabase.questionDao().loadAll() + .toObservable(); } @Override @@ -64,12 +57,8 @@ public List call() throws Exception { @Override public Observable> getOptionsForQuestionId(final Long questionId) { - return Observable.fromCallable(new Callable>() { - @Override - public List