Skip to content

Commit

Permalink
Added User Repository
Browse files Browse the repository at this point in the history
Added user repository to handle the flow of the Dao and Api model
  • Loading branch information
Jon6193 committed Jul 5, 2017
1 parent 32615d7 commit ab29b00
Show file tree
Hide file tree
Showing 20 changed files with 340 additions and 30 deletions.
9 changes: 9 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ android {
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation":
"$projectDir/schemas".toString()]
}
}
}

buildTypes {
Expand Down Expand Up @@ -60,6 +67,7 @@ dependencies {
annotationProcessor "android.arch.lifecycle:compiler:$architectureVersion"

compile "android.arch.persistence.room:runtime:$architectureVersion"
compile "android.arch.persistence.room:rxjava2:$architectureVersion"
annotationProcessor "android.arch.persistence.room:compiler:$architectureVersion"

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
Expand All @@ -72,6 +80,7 @@ dependencies {

compile "com.squareup.retrofit2:retrofit:$retrofitVersion"
compile "com.squareup.retrofit2:converter-gson:$retrofitVersion"
compile "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion"

compile "com.squareup.okhttp3:okhttp:$okHttpVersion"
compile "com.squareup.okhttp3:logging-interceptor:$okHttpVersion"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "a84beb8aa08759560623152434041143",
"entities": [
{
"tableName": "User",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`email` TEXT, `first_name` TEXT, `last_name` TEXT, PRIMARY KEY(`email`))",
"fields": [
{
"fieldPath": "email",
"columnName": "email",
"affinity": "TEXT"
},
{
"fieldPath": "firstName",
"columnName": "first_name",
"affinity": "TEXT"
},
{
"fieldPath": "lastName",
"columnName": "last_name",
"affinity": "TEXT"
}
],
"primaryKey": {
"columnNames": [
"email"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"a84beb8aa08759560623152434041143\")"
]
}
}
2 changes: 2 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jonathanpetitfrere.mvvm">

<uses-permission android:name="android.permission.INTERNET" />

<application
android:name=".MvvmApplication"
android:allowBackup="true"
Expand Down
15 changes: 15 additions & 0 deletions app/src/main/java/com/jonathanpetitfrere/mvvm/di/ApiModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,20 @@
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.jonathanpetitfrere.mvvm.BuildConfig;
import com.jonathanpetitfrere.mvvm.repository.api.UserApi;
import com.jonathanpetitfrere.mvvm.repository.api.model.User;

import java.util.List;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import io.reactivex.Flowable;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
Expand Down Expand Up @@ -51,6 +57,15 @@ Gson provideGson() {
Retrofit.Builder provideRetrofitBuilder(OkHttpClient okHttpClient, Gson gson) {
return new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient);
}

@Singleton
@Provides
UserApi provideUserApi(Retrofit.Builder retrofitBuilder) {
return retrofitBuilder.baseUrl("http://google.com")
.build()
.create(UserApi.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
@Singleton
@Component(modules = {
ApplicationModule.class,
ApiModule.class
ApiModule.class,
RepositoryModule.class
})
public interface ApplicationComponent extends AppGraph {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
import android.content.Context;

import com.jonathanpetitfrere.mvvm.MvvmApplication;
import com.jonathanpetitfrere.mvvm.persistence.MvvmDatabase;
import com.jonathanpetitfrere.mvvm.repository.persistence.MvvmDatabase;
import com.jonathanpetitfrere.mvvm.repository.persistence.dao.UserDao;

import javax.inject.Singleton;

Expand Down Expand Up @@ -36,12 +37,4 @@ Application provideApplication() {
Context provideContext() {
return this.application;
}

@Singleton
@Provides
MvvmDatabase provideMvvmDatabase(Context context) {
return Room.databaseBuilder(context.getApplicationContext(), MvvmDatabase.class, MvvmDatabase.class.getSimpleName())
.allowMainThreadQueries()
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.jonathanpetitfrere.mvvm.di;

import android.arch.persistence.room.Room;
import android.content.Context;

import com.jonathanpetitfrere.mvvm.repository.persistence.MvvmDatabase;
import com.jonathanpetitfrere.mvvm.repository.persistence.dao.UserDao;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;

/**
* @author jpetit
*/

@Module
public class RepositoryModule {

@Singleton
@Provides
MvvmDatabase provideMvvmDatabase(Context context) {
return Room.databaseBuilder(context.getApplicationContext(), MvvmDatabase.class, MvvmDatabase.class.getSimpleName())
.build();
}

@Singleton
@Provides
UserDao provideUserDao(MvvmDatabase mvvmDatabase) {
return mvvmDatabase.userDao();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.jonathanpetitfrere.mvvm.repository;

import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.MutableLiveData;

import com.jonathanpetitfrere.mvvm.repository.api.UserApi;
import com.jonathanpetitfrere.mvvm.repository.mapper.UserMapper;
import com.jonathanpetitfrere.mvvm.repository.persistence.dao.UserDao;
import com.jonathanpetitfrere.mvvm.repository.persistence.entity.User;

import java.util.List;

import javax.inject.Inject;
import javax.inject.Singleton;

import io.reactivex.Completable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import timber.log.Timber;

/**
* @author jpetit
*/

@Singleton
public class UserRepository {

@Inject
UserApi userApi;

@Inject
UserDao userDao;

@Inject
UserMapper mapper;

@Inject
UserRepository() {}

public LiveData<User> getUser(String email) {
MutableLiveData<User> liveData = new MutableLiveData<>();

userDao.loadUser(email)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(liveData::setValue, Timber::d);

userApi.getUser(email)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.map(mapper::toEntity)
.subscribe(userDao::saveUser, Timber::d);

return liveData;
}

public LiveData<List<User>> getUsers() {
MutableLiveData<List<User>> liveData = new MutableLiveData<>();

userDao.getUsers()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(liveData::setValue, Timber::d);

userApi.getUsers()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.flatMapIterable(users -> users)
.map(mapper::toEntity)
.subscribe(userDao::saveUser, Timber::d);

return liveData;
}

public LiveData<Boolean> saveUser(User user) {
MutableLiveData<Boolean> liveData = new MutableLiveData<>();

Completable.fromAction(() -> userDao.saveUser(user))
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(() -> liveData.setValue(true), throwable -> {
Timber.d(throwable);
liveData.setValue(false);
});


return liveData;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.jonathanpetitfrere.mvvm.repository.api;

import com.jonathanpetitfrere.mvvm.repository.api.model.User;

import java.util.List;

import io.reactivex.Flowable;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;

/**
* @author jpetit
*/

public interface UserApi {

@GET("user/{email}")
Flowable<User> getUser(@Path("email") String email);

@GET("users")
Flowable<List<User>> getUsers();

@POST("user")
void createUser(User user);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.jonathanpetitfrere.mvvm.repository.api.model;

import com.google.gson.annotations.SerializedName;

/**
* @author jpetit
*/

public class User {

@SerializedName("email")
private String email;

@SerializedName("first_name")
private String firstName;

@SerializedName("last_name")
private String lastName;

public User(String email, String firstName, String lastName) {
this.email = email;
this.firstName = firstName;
this.lastName = lastName;
}

public String getEmail() {
return email;
}

public String getFirstName() {
return firstName;
}

public String getLastName() {
return lastName;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.jonathanpetitfrere.mvvm.repository.mapper;

import com.jonathanpetitfrere.mvvm.repository.api.model.User;

import javax.inject.Inject;
import javax.inject.Singleton;

/**
* @author jpetit
*/

@Singleton
public class UserMapper {

@Inject
UserMapper() {}

public User toModel(com.jonathanpetitfrere.mvvm.repository.persistence.entity.User userEntity) {
return new User(userEntity.getEmail(), userEntity.getFirstName(), userEntity.getLastName());
}

public com.jonathanpetitfrere.mvvm.repository.persistence.entity.User toEntity(User userModel) {
return new com.jonathanpetitfrere.mvvm.repository.persistence.entity.User(userModel.getEmail(), userModel.getFirstName(), userModel.getLastName());
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.jonathanpetitfrere.mvvm.persistence;
package com.jonathanpetitfrere.mvvm.repository.persistence;

import android.arch.persistence.room.Database;
import android.arch.persistence.room.RoomDatabase;

import com.jonathanpetitfrere.mvvm.persistence.dao.UserDao;
import com.jonathanpetitfrere.mvvm.persistence.entity.User;
import com.jonathanpetitfrere.mvvm.repository.persistence.dao.UserDao;
import com.jonathanpetitfrere.mvvm.repository.persistence.entity.User;

/**
* @author jpetit
Expand Down
Loading

0 comments on commit ab29b00

Please sign in to comment.