├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ └── ic_launcher.png │ │ │ ├── values │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── styles.xml │ │ │ │ └── strings.xml │ │ │ ├── values-w820dp │ │ │ │ └── dimens.xml │ │ │ └── layout │ │ │ │ ├── activity_home.xml │ │ │ │ ├── fragment_home.xml │ │ │ │ ├── list_item_car.xml │ │ │ │ └── layout_car_form.xml │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── asy │ │ │ └── realmexample │ │ │ ├── view │ │ │ ├── home │ │ │ │ ├── adapter │ │ │ │ │ ├── OnCarClickedListener.java │ │ │ │ │ └── CarAdapter.java │ │ │ │ ├── HomeActivity.java │ │ │ │ └── HomeFragment.java │ │ │ └── RealmApplication.java │ │ │ ├── injection │ │ │ ├── annotations │ │ │ │ └── ForActivity.java │ │ │ ├── ActivityModule.java │ │ │ ├── component │ │ │ │ ├── ApplicationComponent.java │ │ │ │ └── HomeComponent.java │ │ │ ├── ApplicationModule.java │ │ │ └── HomeModule.java │ │ │ └── thread │ │ │ └── ApplicationMainThread.java │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── asy │ │ │ └── realmexample │ │ │ └── ExampleUnitTest.java │ └── androidTest │ │ └── java │ │ └── com │ │ └── asy │ │ └── realmexample │ │ └── ApplicationTest.java ├── proguard-rules.pro └── build.gradle ├── domain ├── .gitignore ├── src │ └── main │ │ └── java │ │ └── com │ │ └── asy │ │ └── realmexample │ │ ├── MyClass.java │ │ ├── threads │ │ ├── MainThread.java │ │ ├── InteractorExecutor.java │ │ └── ThreadExecutor.java │ │ ├── repository │ │ ├── CarRepository.java │ │ ├── Repository.java │ │ └── exceptions │ │ │ └── RepositoryException.java │ │ ├── interactors │ │ ├── base │ │ │ ├── Interactor.java │ │ │ └── BaseInteractor.java │ │ └── car │ │ │ ├── remove │ │ │ ├── RemoveCarInteractor.java │ │ │ └── RemoveCarInteractorImpl.java │ │ │ ├── insert │ │ │ ├── InsertCarInteractor.java │ │ │ └── InsertCarInteractorImpl.java │ │ │ └── get │ │ │ ├── GetAllCarsInteractor.java │ │ │ └── GetAllCarsInteractorImpl.java │ │ ├── util │ │ └── Mapper.java │ │ └── model │ │ └── CarDomain.java └── build.gradle ├── presenters ├── .gitignore ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── asy │ └── realexample │ ├── presenters │ ├── HomePresenter.java │ └── HomePresenterImpl.java │ ├── ui │ ├── views │ │ └── HomeView.java │ └── model │ │ └── Car.java │ └── mappers │ └── CarUiMapper.java ├── repository ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ └── values │ │ │ │ └── strings.xml │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── asy │ │ │ └── realmexample │ │ │ └── repository │ │ │ ├── providers │ │ │ ├── DbProvider.java │ │ │ └── RealmProvider.java │ │ │ ├── datasource │ │ │ ├── CarDbDatasource.java │ │ │ ├── base │ │ │ │ └── DbDatasource.java │ │ │ └── CarDbDatasourceImpl.java │ │ │ ├── util │ │ │ └── CarDomainMapper.java │ │ │ ├── CarRepositoryImpl.java │ │ │ └── model │ │ │ └── CarDb.java │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── asy │ │ │ └── realmexample │ │ │ └── repository │ │ │ └── ExampleUnitTest.java │ └── androidTest │ │ └── java │ │ └── com │ │ └── asy │ │ └── realmexample │ │ └── repository │ │ └── ApplicationTest.java ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── gradle.properties ├── README.md ├── gradlew.bat ├── gradlew └── LICENSE /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /domain/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /presenters/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /repository/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':presenters', ':domain', ':repository' 2 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/MyClass.java: -------------------------------------------------------------------------------- 1 | package com.asy.realmexample; 2 | 3 | public class MyClass { 4 | } 5 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asanchezyu/RealmExample/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /repository/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Repository 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asanchezyu/RealmExample/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asanchezyu/RealmExample/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asanchezyu/RealmExample/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asanchezyu/RealmExample/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/asanchezyu/RealmExample/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /presenters/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | 3 | dependencies { 4 | compile fileTree(dir: 'libs', include: ['*.jar']) 5 | 6 | compile project (':domain') 7 | } -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /domain/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | 3 | apply plugin: 'war' 4 | 5 | 6 | dependencies { 7 | compile fileTree(dir: 'libs', include: ['*.jar']) 8 | 9 | providedCompile parent.ext.libDaggerCompiler 10 | 11 | compile parent.ext.libDagger 12 | 13 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Dec 28 10:00:20 PST 2015 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-2.10-all.zip 7 | -------------------------------------------------------------------------------- /repository/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/test/java/com/asy/realmexample/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.asy.realmexample; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * To work on unit tests, switch the Test Artifact in the Build Variants view. 9 | */ 10 | public class ExampleUnitTest { 11 | @Test 12 | public void addition_isCorrect() throws Exception { 13 | assertEquals(4, 2 + 2); 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/asy/realmexample/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.asy.realmexample; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /repository/src/test/java/com/asy/realmexample/repository/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.asy.realmexample.repository; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.assertEquals; 6 | 7 | /** 8 | * To work on unit tests, switch the Test Artifact in the Build Variants view. 9 | */ 10 | public class ExampleUnitTest { 11 | @Test 12 | public void addition_isCorrect() throws Exception { 13 | assertEquals(4, 2 + 2); 14 | } 15 | } -------------------------------------------------------------------------------- /repository/src/androidTest/java/com/asy/realmexample/repository/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.asy.realmexample.repository; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | 15 | # Gradle files 16 | .gradle/ 17 | build/ 18 | 19 | # Local configuration file (sdk path, etc) 20 | local.properties 21 | 22 | # Proguard folder generated by Eclipse 23 | proguard/ 24 | 25 | # Log Files 26 | *.log 27 | 28 | # Android Studio Navigation editor temp files 29 | .navigation/ 30 | 31 | # Android Studio captures folder 32 | captures/ 33 | 34 | *.iml 35 | .idea/* -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Applications/adt-bundle-mac-x86_64-20130514/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /repository/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Applications/adt-bundle-mac-x86_64-20130514/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | ## Project-wide Gradle settings. 2 | # 3 | # For more details on how to configure your build environment visit 4 | # http://www.gradle.org/docs/current/userguide/build_environment.html 5 | # 6 | # Specifies the JVM arguments used for the daemon process. 7 | # The setting is particularly useful for tweaking memory settings. 8 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 9 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 10 | # 11 | # When configured, Gradle will run in incubating parallel mode. 12 | # This option should only be used with decoupled projects. More details, visit 13 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 14 | # org.gradle.parallel=true 15 | #Mon Apr 18 10:57:55 CEST 2016 -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 19 | 20 | -------------------------------------------------------------------------------- /repository/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | apply plugin: 'realm-android' 3 | 4 | android { 5 | compileSdkVersion parent.ext.COMPILE_SDK_VERSION 6 | buildToolsVersion parent.ext.BUILD_TOOLS_VERSION 7 | 8 | defaultConfig { 9 | minSdkVersion parent.ext.MIN_SDK_VERSION 10 | targetSdkVersion parent.ext.TARGET_SDK_VERSION 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | 25 | testCompile parent.ext.libJunit 26 | 27 | compile parent.ext.libAppCompat 28 | 29 | provided parent.ext.libAnnotations 30 | 31 | compile project(':domain') 32 | 33 | } 34 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/threads/MainThread.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.threads; 19 | 20 | /** 21 | * Class Description. 22 | * 23 | * @author asanchezyu@gmail.com. 24 | * @version 1.0. 25 | * @since 13/4/16. 26 | */ 27 | public interface MainThread { 28 | 29 | void post(final Runnable runnable); 30 | 31 | } 32 | -------------------------------------------------------------------------------- /repository/src/main/java/com/asy/realmexample/repository/providers/DbProvider.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.repository.providers; 19 | 20 | /** 21 | * Class Description. 22 | * 23 | * @author asanchezyu@gmail.com. 24 | * @version 1.0. 25 | * @since 13/4/16. 26 | */ 27 | public interface DbProvider { 28 | 29 | T getDatabase(); 30 | 31 | } 32 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/repository/CarRepository.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.repository; 19 | 20 | import com.asy.realmexample.model.CarDomain; 21 | 22 | /** 23 | * Class Description. 24 | * 25 | * @author asanchezyu@gmail.com. 26 | * @version 1.0. 27 | * @since 13/4/16. 28 | */ 29 | public interface CarRepository extends Repository{ 30 | 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/asy/realmexample/view/home/adapter/OnCarClickedListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.view.home.adapter; 19 | 20 | import com.asy.realexample.ui.model.Car; 21 | 22 | /** 23 | * Class Description. 24 | * 25 | * @author asanchezyu@gmail.com. 26 | * @version 1.0. 27 | * @since 13/4/16. 28 | */ 29 | public interface OnCarClickedListener { 30 | 31 | void onCarCliked(Car car); 32 | 33 | } 34 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/threads/InteractorExecutor.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.threads; 19 | 20 | import com.asy.realmexample.interactors.base.Interactor; 21 | 22 | /** 23 | * Class Description. 24 | * 25 | * @author asanchezyu@gmail.com. 26 | * @version 1.0. 27 | * @since 13/4/16. 28 | */ 29 | public interface InteractorExecutor { 30 | 31 | void executeInteractor( Interactor interactor ); 32 | 33 | } 34 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/interactors/base/Interactor.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.interactors.base; 19 | 20 | /** 21 | * Class Description. 22 | * 23 | * @author asanchezyu@gmail.com. 24 | * @version 1.0. 25 | * @since 13/4/16. 26 | */ 27 | public interface Interactor { 28 | 29 | void execute(); 30 | 31 | interface Callback{ 32 | 33 | void onSuccess(T object); 34 | 35 | void onError(Throwable throwable); 36 | 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /repository/src/main/java/com/asy/realmexample/repository/datasource/CarDbDatasource.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.repository.datasource; 19 | 20 | import com.asy.realmexample.repository.datasource.base.DbDatasource; 21 | import com.asy.realmexample.repository.model.CarDb; 22 | 23 | /** 24 | * Class Description. 25 | * 26 | * @author asanchezyu@gmail.com. 27 | * @version 1.0. 28 | * @since 13/4/16. 29 | */ 30 | public interface CarDbDatasource extends DbDatasource { 31 | 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/asy/realmexample/injection/annotations/ForActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.injection.annotations; 19 | 20 | import java.lang.annotation.Retention; 21 | import java.lang.annotation.RetentionPolicy; 22 | 23 | import javax.inject.Scope; 24 | 25 | /** 26 | * Class Description. 27 | * 28 | * @author asanchezyu@gmail.com. 29 | * @version 1.0. 30 | * @since 13/4/16. 31 | */ 32 | @Scope 33 | @Retention(RetentionPolicy.RUNTIME) 34 | public @interface ForActivity { 35 | 36 | } -------------------------------------------------------------------------------- /repository/src/main/java/com/asy/realmexample/repository/datasource/base/DbDatasource.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.repository.datasource.base; 19 | 20 | import com.asy.realmexample.repository.Repository; 21 | import com.asy.realmexample.repository.model.CarDb; 22 | 23 | import io.realm.RealmObject; 24 | 25 | /** 26 | * Class Description. 27 | * 28 | * @author asanchezyu@gmail.com. 29 | * @version 1.0. 30 | * @since 13/4/16. 31 | */ 32 | public interface DbDatasource extends Repository { 33 | 34 | } 35 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/interactors/car/remove/RemoveCarInteractor.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.interactors.car.remove; 19 | 20 | import com.asy.realmexample.interactors.base.Interactor; 21 | import com.asy.realmexample.model.CarDomain; 22 | 23 | /** 24 | * Class Description. 25 | * 26 | * @author asanchezyu@gmail.com. 27 | * @version 1.0. 28 | * @since 13/4/16. 29 | */ 30 | public interface RemoveCarInteractor extends Interactor { 31 | 32 | void run(CarDomain carDomain, Callback callback); 33 | 34 | } 35 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/interactors/car/insert/InsertCarInteractor.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.interactors.car.insert; 19 | 20 | import com.asy.realmexample.interactors.base.Interactor; 21 | import com.asy.realmexample.model.CarDomain; 22 | 23 | /** 24 | * Class Description. 25 | * 26 | * @author asanchezyu@gmail.com. 27 | * @version 1.0. 28 | * @since 13/4/16. 29 | */ 30 | public interface InsertCarInteractor extends Interactor{ 31 | 32 | void run(CarDomain carDomain, Callback callback); 33 | 34 | } 35 | -------------------------------------------------------------------------------- /presenters/src/main/java/com/asy/realexample/presenters/HomePresenter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realexample.presenters; 19 | 20 | import com.asy.realexample.ui.model.Car; 21 | import com.asy.realexample.ui.views.HomeView; 22 | 23 | /** 24 | * Class Description. 25 | * 26 | * @author asanchezyu@gmail.com. 27 | * @version 1.0. 28 | * @since 13/4/16. 29 | */ 30 | public interface HomePresenter { 31 | 32 | void setView(HomeView homeView); 33 | 34 | void getAllCars(); 35 | 36 | void insertCar(Car car); 37 | 38 | void removeCar(Car car); 39 | } 40 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/interactors/car/get/GetAllCarsInteractor.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.interactors.car.get; 19 | 20 | import com.asy.realmexample.interactors.base.Interactor; 21 | import com.asy.realmexample.model.CarDomain; 22 | 23 | import java.util.List; 24 | 25 | /** 26 | * Class Description. 27 | * 28 | * @author asanchezyu@gmail.com. 29 | * @version 1.0. 30 | * @since 13/4/16. 31 | */ 32 | public interface GetAllCarsInteractor extends Interactor { 33 | 34 | void run(Callback> callback); 35 | 36 | } 37 | -------------------------------------------------------------------------------- /presenters/src/main/java/com/asy/realexample/ui/views/HomeView.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realexample.ui.views; 19 | 20 | import com.asy.realexample.ui.model.Car; 21 | 22 | import java.util.List; 23 | 24 | /** 25 | * Class Description. 26 | * 27 | * @author asanchezyu@gmail.com 28 | * @version 1.0. 29 | * @since 13/4/16. 30 | */ 31 | public interface HomeView { 32 | 33 | void setCars( List carList ); 34 | 35 | void showGetCarsError(); 36 | 37 | void showInsertCarError(); 38 | 39 | void showRemoveCarError(); 40 | 41 | void showFieldsNeededError(); 42 | 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 18 | 19 | 24 | 25 | 26 | 27 | 28 | 29 | 33 | 34 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/repository/Repository.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.repository; 19 | 20 | import com.asy.realmexample.repository.exceptions.RepositoryException; 21 | 22 | import java.util.List; 23 | 24 | /** 25 | * Class Description. 26 | * 27 | * @author asanchezyu@gmail.com. 28 | * @version 1.0. 29 | * @since 13/4/16. 30 | */ 31 | public interface Repository { 32 | 33 | List findAll(); 34 | 35 | T insert(T element) throws RepositoryException; 36 | 37 | List insertAll(List elementList) throws RepositoryException; 38 | 39 | void remove(T element); 40 | 41 | void removeAll(); 42 | 43 | } 44 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/repository/exceptions/RepositoryException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.repository.exceptions; 19 | 20 | /** 21 | * Class Description. 22 | * 23 | * @author asanchezyu@gmail.com. 24 | * @version 1.0. 25 | * @since 13/4/16. 26 | */ 27 | public class RepositoryException extends Exception { 28 | 29 | public RepositoryException(String message, Throwable cause) { 30 | super(message, cause); 31 | } 32 | 33 | public RepositoryException(String message) { 34 | super(message); 35 | } 36 | 37 | public RepositoryException(Throwable cause) { 38 | super(cause); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/asy/realmexample/thread/ApplicationMainThread.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.thread; 19 | 20 | import android.os.Handler; 21 | import android.os.Looper; 22 | 23 | import com.asy.realmexample.threads.MainThread; 24 | 25 | import javax.inject.Inject; 26 | 27 | /** 28 | * Class Description. 29 | * 30 | * @author asanchezyu@gmail.com. 31 | * @version 1.0. 32 | * @since 13/4/16. 33 | */ 34 | public class ApplicationMainThread implements MainThread{ 35 | 36 | private Handler handler; 37 | 38 | @Inject 39 | public ApplicationMainThread() { 40 | handler = new Handler(Looper.getMainLooper()); 41 | } 42 | 43 | @Override 44 | public void post(Runnable runnable) { 45 | handler.post( runnable ); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/asy/realmexample/injection/ActivityModule.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.injection; 19 | 20 | import android.app.Activity; 21 | 22 | import com.asy.realmexample.injection.annotations.ForActivity; 23 | 24 | import dagger.Module; 25 | import dagger.Provides; 26 | 27 | /** 28 | * Class Description. 29 | * 30 | * @author asanchezyu@gmail.com. 31 | * @version 1.0. 32 | * @since 13/4/16. 33 | */ 34 | @Module 35 | public class ActivityModule { 36 | 37 | private final Activity activityContext; 38 | 39 | public ActivityModule(Activity activityContext) { 40 | this.activityContext = activityContext; 41 | } 42 | 43 | @Provides 44 | @ForActivity 45 | Activity getActivityContext() { 46 | return this.activityContext; 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | RealmExample 20 | Matrícula 21 | Modelo 22 | Marca 23 | Insertar Coche 24 | Error obteniendo los coches 25 | Acción en curso 26 | Se está realizado la petición. ¡Espera! 27 | Error al insertar 28 | Se ha producido un error eliminando el elemento. 29 | Quedan campos sin rellenar 30 | 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RealmExample 2 | Realm example with MVP pattern and clean architecture 3 | 4 | Realm is one of the most powerful databases in Android development. Nowadays is : 5 |
  • Inserts: 2x faster than SQLite
  • Queries: 7x faster than SQLite
  • Counts: 9x than SQLite
6 | 7 | Realm is under development, but, it is a good choice for been our application database. 8 | 9 | In this example, we have made one example for Realm (insertions, deletions, and queries), with **MVP pattern** and **clean architecture**. 10 | 11 | # Libraries we used on this project: 12 | 13 | 14 | The architecture we have applied in this example is based on the example "Dagger2Scopes", made by Jorge Castillo 15 | 16 | # License 17 | Copyright 2016 Alejandro Sánchez 18 | 19 | Licensed under the Apache License, Version 2.0 (the "License"); 20 | you may not use this file except in compliance with the License. 21 | You may obtain a copy of the License at 22 | 23 | http://www.apache.org/licenses/LICENSE-2.0 24 | 25 | Unless required by applicable law or agreed to in writing, software 26 | distributed under the License is distributed on an "AS IS" BASIS, 27 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 28 | See the License for the specific language governing permissions and 29 | limitations under the License. -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/interactors/base/BaseInteractor.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.interactors.base; 19 | 20 | import com.asy.realmexample.threads.InteractorExecutor; 21 | import com.asy.realmexample.threads.MainThread; 22 | 23 | /** 24 | * Class Description. 25 | * 26 | * @author asanchezyu@gmail.com. 27 | * @version 1.0. 28 | * @since 13/4/16. 29 | */ 30 | public abstract class BaseInteractor { 31 | 32 | private MainThread mainThread; 33 | 34 | private InteractorExecutor interactorExecutor; 35 | 36 | public BaseInteractor(InteractorExecutor interactorExecutor, MainThread mainThread) { 37 | this.interactorExecutor = interactorExecutor; 38 | this.mainThread = mainThread; 39 | } 40 | 41 | public InteractorExecutor getInteractorExecutor() { 42 | return interactorExecutor; 43 | } 44 | 45 | public MainThread getMainThread() { 46 | return mainThread; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/util/Mapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.util; 19 | 20 | import java.util.ArrayList; 21 | import java.util.List; 22 | 23 | /** 24 | * Class Description. 25 | * 26 | * @author asanchezyu@gmail.com. 27 | * @version 1.0. 28 | * @since 13/4/16. 29 | */ 30 | public abstract class Mapper { 31 | 32 | public abstract K map(T type); 33 | 34 | public abstract T reverseMap(K type); 35 | 36 | public List mapList(List typeList){ 37 | 38 | List list = new ArrayList<>(); 39 | 40 | for( T type : typeList ){ 41 | 42 | list.add( map( type ) ); 43 | 44 | } 45 | 46 | return list; 47 | 48 | } 49 | 50 | public List reverseMapList(List typeList){ 51 | 52 | List list = new ArrayList<>(); 53 | 54 | for( K type : typeList ){ 55 | 56 | list.add( reverseMap( type ) ); 57 | 58 | } 59 | 60 | return list; 61 | 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /app/src/main/java/com/asy/realmexample/view/RealmApplication.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.view; 19 | 20 | import android.app.Application; 21 | 22 | import com.asy.realmexample.injection.ApplicationModule; 23 | import com.asy.realmexample.injection.component.ApplicationComponent; 24 | import com.asy.realmexample.injection.component.DaggerApplicationComponent; 25 | 26 | /** 27 | * Class Description. 28 | * 29 | * @author asanchezyu@gmail.com. 30 | * @version 1.0. 31 | * @since 13/4/16. 32 | */ 33 | public class RealmApplication extends Application { 34 | 35 | private ApplicationComponent applicationComponent; 36 | 37 | @Override 38 | public void onCreate() { 39 | super.onCreate(); 40 | 41 | applicationComponent = DaggerApplicationComponent.builder() 42 | .applicationModule(new ApplicationModule(this)) 43 | .build(); 44 | 45 | } 46 | 47 | public ApplicationComponent getComponent() { 48 | return applicationComponent; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /repository/src/main/java/com/asy/realmexample/repository/providers/RealmProvider.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.repository.providers; 19 | 20 | import android.app.Application; 21 | 22 | import javax.inject.Inject; 23 | 24 | import io.realm.Realm; 25 | import io.realm.RealmConfiguration; 26 | 27 | /** 28 | * Class Description. 29 | * 30 | * @author asanchezyu@gmail.com. 31 | * @version 1.0. 32 | * @since 13/4/16. 33 | */ 34 | public class RealmProvider implements DbProvider { 35 | 36 | @Inject 37 | public RealmProvider(Application application) { 38 | RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(application) 39 | .name("cars.realm") 40 | .deleteRealmIfMigrationNeeded() 41 | .schemaVersion(1) 42 | .build(); 43 | 44 | Realm.setDefaultConfiguration(realmConfiguration); 45 | } 46 | 47 | 48 | @Override 49 | public Realm getDatabase() { 50 | 51 | return Realm.getDefaultInstance(); 52 | 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/asy/realmexample/injection/component/ApplicationComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.injection.component; 19 | 20 | import android.app.Application; 21 | 22 | import com.asy.realmexample.injection.ApplicationModule; 23 | import com.asy.realmexample.repository.providers.DbProvider; 24 | import com.asy.realmexample.threads.InteractorExecutor; 25 | import com.asy.realmexample.threads.MainThread; 26 | import com.asy.realmexample.view.RealmApplication; 27 | 28 | import javax.inject.Singleton; 29 | 30 | import dagger.Component; 31 | import io.realm.Realm; 32 | 33 | /** 34 | * Class Description. 35 | * 36 | * @author asanchezyu@gmail.com. 37 | * @version 1.0. 38 | * @since 13/4/16. 39 | */ 40 | @Singleton 41 | @Component( 42 | modules = ApplicationModule.class 43 | 44 | ) 45 | public interface ApplicationComponent { 46 | 47 | void inject(RealmApplication realmApplication); 48 | 49 | Application application(); 50 | 51 | MainThread mainThread(); 52 | 53 | InteractorExecutor interactorExecutor(); 54 | 55 | DbProvider providesDbProvider(); 56 | 57 | } 58 | -------------------------------------------------------------------------------- /repository/src/main/java/com/asy/realmexample/repository/util/CarDomainMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.repository.util; 19 | 20 | import com.asy.realmexample.model.CarDomain; 21 | import com.asy.realmexample.repository.model.CarDb; 22 | import com.asy.realmexample.util.Mapper; 23 | 24 | import javax.inject.Inject; 25 | 26 | /** 27 | * Class Description. 28 | * 29 | * @author asanchezyu@gmail.com. 30 | * @version 1.0. 31 | * @since 13/4/16. 32 | */ 33 | public class CarDomainMapper extends Mapper { 34 | 35 | @Inject 36 | public CarDomainMapper() { 37 | } 38 | 39 | @Override 40 | public CarDomain map(CarDb type) { 41 | return new CarDomain.Builder() 42 | .setRegistrationDate(type.getRegistrationDate()) 43 | .setModel(type.getModel()) 44 | .setBrand(type.getBrand()) 45 | .setPlateNumber(type.getPlateNumber()) 46 | .build(); 47 | } 48 | 49 | @Override 50 | public CarDb reverseMap(CarDomain type) { 51 | return new CarDb.Builder() 52 | .setRegistrationDate(type.getRegistrationDate()) 53 | .setModel(type.getModel()) 54 | .setBrand(type.getBrand()) 55 | .setPlateNumber(type.getPlateNumber()) 56 | .build(); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | apply plugin: 'com.android.application' 19 | 20 | apply plugin: 'com.neenbedankt.android-apt' 21 | 22 | 23 | android { 24 | compileSdkVersion parent.ext.COMPILE_SDK_VERSION 25 | buildToolsVersion parent.ext.BUILD_TOOLS_VERSION 26 | 27 | 28 | defaultConfig { 29 | applicationId "com.asy.realmexample" 30 | minSdkVersion parent.ext.MIN_SDK_VERSION 31 | targetSdkVersion parent.ext.TARGET_SDK_VERSION 32 | versionCode 1 33 | versionName "1.0" 34 | } 35 | buildTypes { 36 | release { 37 | minifyEnabled false 38 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 39 | } 40 | } 41 | packagingOptions { 42 | exclude 'META-INF/services/javax.annotation.processing.Processor' 43 | } 44 | } 45 | 46 | dependencies { 47 | compile fileTree(dir: 'libs', include: ['*.jar']) 48 | 49 | testCompile parent.ext.libJunit 50 | 51 | compile parent.ext.libAppCompat 52 | 53 | compile parent.ext.libDesign 54 | 55 | compile parent.ext.libRecyclerView 56 | 57 | compile parent.ext.libButterknife 58 | 59 | apt parent.ext.libDaggerCompiler 60 | 61 | compile parent.ext.libDagger 62 | 63 | provided parent.ext.libAnnotations 64 | 65 | compile project (':presenters') 66 | 67 | compile project (':repository') 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_item_car.xml: -------------------------------------------------------------------------------- 1 | 2 | 18 | 19 | 23 | 24 | 30 | 31 | 37 | 38 | 44 | 45 | 52 | 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/asy/realmexample/injection/ApplicationModule.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.injection; 19 | 20 | import android.app.Application; 21 | 22 | import com.asy.realmexample.repository.providers.DbProvider; 23 | import com.asy.realmexample.repository.providers.RealmProvider; 24 | import com.asy.realmexample.threads.InteractorExecutor; 25 | import com.asy.realmexample.threads.MainThread; 26 | import com.asy.realmexample.threads.ThreadExecutor; 27 | import com.asy.realmexample.thread.ApplicationMainThread; 28 | 29 | import javax.inject.Singleton; 30 | 31 | import dagger.Module; 32 | import dagger.Provides; 33 | import io.realm.Realm; 34 | 35 | /** 36 | * Class Description. 37 | * 38 | * @author asanchezyu@gmail.com. 39 | * @version 1.0. 40 | * @since 13/4/16. 41 | */ 42 | @Module 43 | public class ApplicationModule { 44 | 45 | private final Application application; 46 | 47 | public ApplicationModule(Application application) { 48 | this.application = application; 49 | } 50 | 51 | @Provides 52 | @Singleton 53 | Application getApplicationContext() { 54 | return this.application; 55 | } 56 | 57 | @Provides 58 | @Singleton 59 | public MainThread providesMainThread(ApplicationMainThread mainThread) { 60 | return mainThread; 61 | } 62 | 63 | @Provides 64 | @Singleton 65 | public InteractorExecutor provideThreadExecutor(ThreadExecutor executor) { 66 | return executor; 67 | } 68 | 69 | @Provides 70 | @Singleton 71 | public DbProvider providesDbProvider(RealmProvider realmProvider){ 72 | 73 | return realmProvider; 74 | 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main/java/com/asy/realmexample/view/home/HomeActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.view.home; 19 | 20 | import android.content.ComponentName; 21 | import android.support.v7.app.AppCompatActivity; 22 | import android.os.Bundle; 23 | import android.util.Log; 24 | 25 | import com.asy.realexample.presenters.HomePresenter; 26 | import com.asy.realexample.ui.model.Car; 27 | import com.asy.realexample.ui.views.HomeView; 28 | import com.asy.realmexample.R; 29 | import com.asy.realmexample.injection.ActivityModule; 30 | import com.asy.realmexample.injection.component.DaggerHomeComponent; 31 | import com.asy.realmexample.injection.component.HomeComponent; 32 | import com.asy.realmexample.view.RealmApplication; 33 | 34 | import java.util.List; 35 | 36 | import javax.inject.Inject; 37 | 38 | /** 39 | * Class Description. 40 | * 41 | * @author asanchezyu@gmail.com. 42 | * @version 1.0. 43 | * @since 13/4/16. 44 | */ 45 | public class HomeActivity extends AppCompatActivity{ 46 | 47 | private HomeComponent homeComponent; 48 | 49 | @Override 50 | protected void onCreate(Bundle savedInstanceState) { 51 | 52 | super.onCreate(savedInstanceState); 53 | 54 | setContentView(R.layout.activity_home); 55 | 56 | } 57 | 58 | public HomeComponent getComponent() { 59 | if (homeComponent == null ){ 60 | 61 | homeComponent = DaggerHomeComponent.builder() 62 | .applicationComponent( ((RealmApplication)getApplication()).getComponent() ) 63 | .activityModule( new ActivityModule( this ) ) 64 | .build(); 65 | 66 | } 67 | 68 | return homeComponent; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/threads/ThreadExecutor.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.threads; 19 | 20 | import com.asy.realmexample.interactors.base.Interactor; 21 | 22 | import java.util.concurrent.BlockingQueue; 23 | import java.util.concurrent.LinkedBlockingQueue; 24 | import java.util.concurrent.ThreadPoolExecutor; 25 | import java.util.concurrent.TimeUnit; 26 | 27 | import javax.inject.Inject; 28 | 29 | /** 30 | * Class Description. 31 | * 32 | * @author asanchezyu@gmail.com. 33 | * @version 1.0. 34 | * @since 13/4/16. 35 | */ 36 | public class ThreadExecutor implements InteractorExecutor{ 37 | 38 | private static final int CORE_POOL_SIZE = 3; 39 | 40 | private static final int MAX_POOL_SIZE = 5; 41 | 42 | private static final int KEEP_ALIVE_TIME = 120; 43 | 44 | private static final TimeUnit TIME_UNIT = TimeUnit.SECONDS; 45 | 46 | private static final BlockingQueue WORK_QUEUE = new LinkedBlockingQueue<>(); 47 | 48 | private ThreadPoolExecutor threadPoolExecutor; 49 | 50 | @Inject 51 | public ThreadExecutor() { 52 | threadPoolExecutor = 53 | new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TIME_UNIT, 54 | WORK_QUEUE); 55 | } 56 | 57 | @Override 58 | public void executeInteractor(final Interactor interactor) { 59 | if (interactor == null) { 60 | throw new IllegalArgumentException("Interactor must not be null"); 61 | } 62 | threadPoolExecutor.submit(new Runnable() { 63 | @Override public void run() { 64 | interactor.execute(); 65 | } 66 | }); 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/interactors/car/get/GetAllCarsInteractorImpl.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.interactors.car.get; 19 | 20 | import com.asy.realmexample.model.CarDomain; 21 | import com.asy.realmexample.repository.CarRepository; 22 | import com.asy.realmexample.threads.InteractorExecutor; 23 | import com.asy.realmexample.threads.MainThread; 24 | 25 | import java.util.List; 26 | 27 | import javax.inject.Inject; 28 | 29 | /** 30 | * Class Description. 31 | * 32 | * @author asanchezyu@gmail.com. 33 | * @version 1.0. 34 | * @since 13/4/16. 35 | */ 36 | public class GetAllCarsInteractorImpl implements GetAllCarsInteractor { 37 | 38 | private Callback> callback; 39 | 40 | private CarRepository carRepository; 41 | 42 | private MainThread mainThread; 43 | 44 | private InteractorExecutor interactorExecutor; 45 | 46 | @Inject 47 | public GetAllCarsInteractorImpl(CarRepository carRepository, MainThread mainThread, 48 | InteractorExecutor interactorExecutor) { 49 | 50 | this.carRepository = carRepository; 51 | 52 | this.mainThread = mainThread; 53 | 54 | this.interactorExecutor = interactorExecutor; 55 | 56 | } 57 | 58 | @Override 59 | public void run(Callback> callback) { 60 | 61 | this.callback = callback; 62 | 63 | interactorExecutor.executeInteractor( this ); 64 | 65 | } 66 | 67 | @Override 68 | public void execute() { 69 | 70 | mainThread.post(new Runnable() { 71 | 72 | @Override 73 | public void run() { 74 | 75 | callback.onSuccess( carRepository.findAll() ); 76 | 77 | } 78 | 79 | }); 80 | 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /repository/src/main/java/com/asy/realmexample/repository/CarRepositoryImpl.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.repository; 19 | 20 | import com.asy.realmexample.model.CarDomain; 21 | import com.asy.realmexample.repository.datasource.CarDbDatasource; 22 | import com.asy.realmexample.repository.exceptions.RepositoryException; 23 | import com.asy.realmexample.repository.util.CarDomainMapper; 24 | 25 | import java.util.List; 26 | 27 | import javax.inject.Inject; 28 | 29 | /** 30 | * Class Description. 31 | * 32 | * @author asanchezyu@gmail.com. 33 | * @version 1.0. 34 | * @since 13/4/16. 35 | */ 36 | public class CarRepositoryImpl implements CarRepository { 37 | 38 | private CarDomainMapper carDomainMapper; 39 | 40 | private CarDbDatasource carDbDatasource; 41 | 42 | @Inject 43 | public CarRepositoryImpl(CarDomainMapper carDomainMapper, CarDbDatasource carDbDatasource) { 44 | 45 | this.carDomainMapper = carDomainMapper; 46 | 47 | this.carDbDatasource = carDbDatasource; 48 | 49 | } 50 | 51 | @Override 52 | public List findAll() { 53 | return carDomainMapper.mapList(carDbDatasource.findAll()); 54 | } 55 | 56 | @Override 57 | public CarDomain insert(CarDomain element) throws RepositoryException { 58 | return carDomainMapper.map(carDbDatasource.insert(carDomainMapper.reverseMap(element))); 59 | } 60 | 61 | @Override 62 | public List insertAll(List elementList) throws RepositoryException { 63 | return carDomainMapper.mapList(carDbDatasource.insertAll(carDomainMapper.reverseMapList(elementList))); 64 | } 65 | 66 | @Override 67 | public void remove(CarDomain element) { 68 | 69 | carDbDatasource.remove(carDomainMapper.reverseMap(element)); 70 | 71 | } 72 | 73 | @Override 74 | public void removeAll() { 75 | 76 | carDbDatasource.removeAll(); 77 | 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /presenters/src/main/java/com/asy/realexample/mappers/CarUiMapper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realexample.mappers; 19 | 20 | import com.asy.realexample.ui.model.Car; 21 | import com.asy.realmexample.model.CarDomain; 22 | import com.asy.realmexample.util.Mapper; 23 | 24 | import java.text.ParseException; 25 | import java.text.SimpleDateFormat; 26 | import java.util.Date; 27 | 28 | import javax.inject.Inject; 29 | 30 | /** 31 | * Class Description. 32 | * 33 | * @author asanchezyu@gmail.com. 34 | * @version 1.0. 35 | * @since 13/4/16. 36 | */ 37 | public class CarUiMapper extends Mapper { 38 | 39 | private SimpleDateFormat sdf; 40 | 41 | @Inject 42 | public CarUiMapper() { 43 | this.sdf = new SimpleDateFormat("dd/MM/yyyy"); 44 | } 45 | 46 | @Override 47 | public Car map(CarDomain type) { 48 | return new Car.Builder() 49 | .setBrand(type.getBrand()) 50 | .setModel(type.getModel()) 51 | .setRegistrationDate(sdf.format(type.getRegistrationDate())) 52 | .setPlateNumber(type.getPlateNumber()) 53 | .build(); 54 | } 55 | 56 | @Override 57 | public CarDomain reverseMap(Car type) { 58 | 59 | CarDomain carDomain = new CarDomain.Builder() 60 | .setBrand(type.getBrand()) 61 | .setModel(type.getModel()) 62 | .setPlateNumber(type.getPlateNumber()) 63 | .build(); 64 | 65 | try { 66 | 67 | if( type.getRegistrationDate() != null ) { 68 | 69 | carDomain.setRegistrationDate(sdf.parse( type.getRegistrationDate() ) ); 70 | 71 | }else{ 72 | 73 | carDomain.setRegistrationDate( new Date() ); 74 | 75 | } 76 | 77 | } catch (ParseException e) { 78 | 79 | e.printStackTrace(); 80 | 81 | } 82 | 83 | 84 | return carDomain; 85 | 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /domain/src/main/java/com/asy/realmexample/interactors/car/remove/RemoveCarInteractorImpl.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.interactors.car.remove; 19 | 20 | import com.asy.realmexample.interactors.base.BaseInteractor; 21 | import com.asy.realmexample.model.CarDomain; 22 | import com.asy.realmexample.repository.CarRepository; 23 | import com.asy.realmexample.threads.InteractorExecutor; 24 | import com.asy.realmexample.threads.MainThread; 25 | 26 | import javax.inject.Inject; 27 | 28 | /** 29 | * Class Description. 30 | * 31 | * @author asanchezyu@gmail.com. 32 | * @version 1.0. 33 | * @since 13/4/16. 34 | */ 35 | public class RemoveCarInteractorImpl extends BaseInteractor implements RemoveCarInteractor { 36 | 37 | private CarRepository carRepository; 38 | 39 | private CarDomain carDomain; 40 | 41 | private Callback callback; 42 | 43 | 44 | @Inject 45 | public RemoveCarInteractorImpl(InteractorExecutor interactorExecutor, MainThread mainThread, CarRepository carRepository) { 46 | super(interactorExecutor, mainThread); 47 | this.carRepository = carRepository; 48 | } 49 | 50 | @Override 51 | public void execute() { 52 | 53 | try { 54 | carRepository.remove(carDomain); 55 | 56 | getMainThread().post(new Runnable() { 57 | @Override 58 | public void run() { 59 | 60 | callback.onSuccess( true ); 61 | 62 | } 63 | }); 64 | 65 | }catch (final Exception e){ 66 | 67 | getMainThread().post(new Runnable() { 68 | @Override 69 | public void run() { 70 | 71 | callback.onError( e ); 72 | 73 | } 74 | }); 75 | 76 | } 77 | 78 | 79 | } 80 | 81 | @Override 82 | public void run(CarDomain carDomain, Callback callback){ 83 | 84 | this.carDomain = carDomain; 85 | 86 | this.callback = callback; 87 | 88 | getInteractorExecutor().executeInteractor( this ); 89 | 90 | } 91 | 92 | } 93 | -------------------------------------------------------------------------------- /app/src/main/java/com/asy/realmexample/injection/component/HomeComponent.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2016. Alejandro Sánchez. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | * 16 | */ 17 | 18 | package com.asy.realmexample.injection.component; 19 | 20 | import android.app.Activity; 21 | 22 | import com.asy.realexample.presenters.HomePresenter; 23 | import com.asy.realexample.ui.model.Car; 24 | import com.asy.realmexample.interactors.car.get.GetAllCarsInteractor; 25 | import com.asy.realmexample.interactors.car.insert.InsertCarInteractor; 26 | import com.asy.realmexample.interactors.car.remove.RemoveCarInteractor; 27 | import com.asy.realmexample.model.CarDomain; 28 | import com.asy.realmexample.repository.CarRepository; 29 | import com.asy.realmexample.repository.datasource.CarDbDatasource; 30 | import com.asy.realmexample.repository.model.CarDb; 31 | import com.asy.realmexample.util.Mapper; 32 | import com.asy.realmexample.view.home.HomeActivity; 33 | import com.asy.realmexample.injection.ActivityModule; 34 | import com.asy.realmexample.injection.HomeModule; 35 | import com.asy.realmexample.injection.annotations.ForActivity; 36 | import com.asy.realmexample.view.home.HomeFragment; 37 | 38 | import dagger.Component; 39 | 40 | /** 41 | * Class Description. 42 | * 43 | * @author asanchezyu@gmail.com. 44 | * @version 1.0. 45 | * @since 13/4/16. 46 | */ 47 | @ForActivity 48 | @Component( 49 | dependencies = { 50 | ApplicationComponent.class 51 | }, 52 | modules = { 53 | ActivityModule.class, 54 | HomeModule.class, 55 | } 56 | 57 | ) 58 | public interface HomeComponent { 59 | 60 | Activity activityContext(); 61 | 62 | void inject(HomeActivity homeActivity); 63 | 64 | void inject(HomeFragment homeFragment); 65 | 66 | HomePresenter presenter(); 67 | 68 | GetAllCarsInteractor getAllCarsInteractor(); 69 | 70 | InsertCarInteractor insertCarInteractor(); 71 | 72 | RemoveCarInteractor removeCarInteractor(); 73 | 74 | CarRepository carRepository(); 75 | 76 | CarDbDatasource carDbDatasource(); 77 | 78 | Mapper carUiMapper(); 79 | 80 | Mapper carDomainMapper(); 81 | 82 | } 83 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_car_form.xml: -------------------------------------------------------------------------------- 1 | 2 | 18 | 19 | 24 | 25 | 28 | 29 | 36 | 37 | 38 | 39 | 42 | 43 | 50 | 51 | 52 | 53 | 56 | 57 | 64 | 65 | 66 | 67 |