This is an automated email from the ASF dual-hosted git repository.

rajanmaurya154 pushed a commit to branch development
in repository https://gitbox.apache.org/repos/asf/fineract-cn-mobile.git


The following commit(s) were added to refs/heads/development by this push:
     new 738da55  feat: Sync feature for customer and customer details
738da55 is described below

commit 738da55d5b8ac986a63ceb5692ed04c15b1dc864
Author: dilpreet96 <dilpreet2...@gmail.com>
AuthorDate: Fri May 25 22:16:59 2018 +0530

    feat: Sync feature for customer and customer details
---
 app/build.gradle                                   |  55 ++++++----
 app/src/main/AndroidManifest.xml                   |   6 ++
 .../org/apache/fineract/FineractApplication.java   |  11 ++
 .../{ => api}/DataManagerAnonymous.java            |   2 +-
 .../datamanager/{ => api}/DataManagerAuth.java     |   2 +-
 .../datamanager/{ => api}/DataManagerCustomer.java |  25 +++--
 .../datamanager/{ => api}/DataManagerDeposit.java  |   5 +-
 .../{ => api}/DataManagerIndividualLending.java    |   2 +-
 .../datamanager/{ => api}/DataManagerLoans.java    |   2 +-
 .../datamanager/{ => api}/DataManagerRoles.java    |   2 +-
 .../{ => api}/FineractBaseDataManager.java         |   2 +-
 .../datamanager/contracts/ManagerCustomer.java     |  53 ++++++++++
 .../datamanager/database/DbManagerCustomer.java    | 115 +++++++++++++++++++++
 .../apache/fineract/data/local/PreferenceKey.java  |   2 +
 .../fineract/data/local/PreferencesHelper.java     |  16 +++
 .../fineract/data/local/database/AppDatabase.kt    |  11 ++
 .../database/helpers/DatabaseHelperCustomer.java   | 110 ++++++++++++++++++++
 .../syncmodels/customer/CustomerPayload.kt         |  14 +++
 .../fineract/data/models/customer/Address.kt       |  12 ++-
 .../fineract/data/models/customer/ContactDetail.kt |  13 ++-
 .../fineract/data/models/customer/Customer.kt      |  68 ++++++++----
 .../fineract/data/models/customer/DateOfBirth.kt   |  11 +-
 .../injection/component/ActivityComponent.java     |   4 +
 .../injection/component/ApplicationComponent.java  |  26 +++--
 .../fineract/injection/module/JobsModule.java      |  47 +++++++++
 .../fineract/jobs/CreationUpdationCustomerJob.java |  90 ++++++++++++++++
 .../apache/fineract/jobs/FineractJobCreator.java   |  33 ++++++
 .../org/apache/fineract/jobs/JobsReceiver.java     |  59 +++++++++++
 .../org/apache/fineract/jobs/StartSyncJob.java     |  95 +++++++++++++++++
 .../adapters/BeneficiaryAutoCompleteAdapter.java   |   2 +-
 .../fineract/ui/adapters/CustomerAdapter.java      |  15 ++-
 .../ui/offline/CustomerPayloadContract.java        |  22 ++++
 .../ui/offline/CustomerPayloadFragment.java        |  95 +++++++++++++++++
 .../ui/offline/CustomerPayloadPresenter.java       |  70 +++++++++++++
 .../fineract/ui/online/DashboardActivity.java      |  11 ++
 .../customeractivity/CreateCustomerPresenter.java  |  13 +--
 .../FormCustomerAddressPresenter.java              |   2 +-
 .../CustomerActivitiesPresenter.java               |   2 +-
 .../customerdetails/CustomerDetailsContract.java   |   2 +-
 .../customerdetails/CustomerDetailsFragment.java   |  48 +--------
 .../customerdetails/CustomerDetailsPresenter.java  |   9 +-
 .../customers/customerlist/CustomersFragment.java  |  23 +++--
 .../customers/customerlist/CustomersPresenter.java |  11 +-
 .../EditCustomerProfilePresenter.java              |   2 +-
 .../CustomerTasksBottomSheetPresenter.java         |   2 +-
 .../CreateDepositPresenter.java                    |   2 +-
 .../FormDepositAssignProductPresenter.java         |   2 +-
 .../DepositAccountDetailsPresenter.java            |   2 +-
 .../DepositAccountsPresenter.java                  |   2 +-
 .../CreateIdentificationPresenter.java             |   2 +-
 .../IdentificationDetailsPresenter.java            |   2 +-
 .../IdentificationsPresenter.java                  |   2 +-
 .../UploadIdentificationCardPresenter.java         |   2 +-
 .../ui/online/launcher/LauncherPresenter.java      |   2 +-
 .../loanaccountlist/LoanAccountsPresenter.java     |   2 +-
 .../loanactivity/LoanApplicationPresenter.java     |   2 +-
 .../loancosigner/LoanCoSignerPresenter.java        |   2 +-
 .../loandetails/LoanDetailsPresenter.java          |   2 +-
 .../loandetails/CustomerLoanDetailsPresenter.java  |   2 +-
 .../plannedpayment/PlannedPaymentPresenter.java    |   2 +-
 .../fineract/ui/online/login/LoginPresenter.java   |   2 +-
 .../ui/online/roles/roleslist/RolesPresenter.java  |   2 +-
 app/src/main/res/layout/fragment_customer_list.xml |   2 +-
 ...omer_list.xml => fragment_customer_payload.xml} |  15 +--
 app/src/main/res/menu/menu_navigation_drawer.xml   |   6 ++
 app/src/main/res/values/strings.xml                |   5 +
 build.gradle                                       |   9 +-
 gradle.properties                                  |   2 +-
 68 files changed, 1115 insertions(+), 180 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 884ac3a..bc98fd0 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,4 +1,5 @@
 apply plugin: 'com.android.application'
+apply plugin: 'kotlin-kapt'
 apply plugin: 'kotlin-android'
 apply plugin: 'kotlin-android-extensions'
 apply plugin: 'io.fabric'
@@ -82,6 +83,17 @@ dependencies {
 
     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"
 
+    //android-job
+    implementation "com.evernote:android-job:$androidJobVersion"
+
+    implementation 'com.github.therajanmaurya:Sweet-Error:1.0.0'
+
+    implementation 'com.android.support:support-v4:26.1.0'
+    kapt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflowVersion}"
+    implementation "com.github.Raizlabs.DBFlow:dbflow-core:${dbflowVersion}"
+    implementation "com.github.Raizlabs.DBFlow:dbflow:${dbflowVersion}"
+    implementation "com.github.Raizlabs.DBFlow:dbflow-rx2:${dbflowVersion}"
+
     // Rx Dependencies
     implementation "io.reactivex.rxjava2:rxjava:$rootProject.rxjavaVersion"
     implementation 
"io.reactivex.rxjava2:rxandroid:$rootProject.rxandroidVersion"
@@ -101,13 +113,13 @@ dependencies {
     // Dagger 2 Dependencies
     implementation "com.google.dagger:dagger:$rootProject.daggerVersion"
     provided 'org.glassfish:javax.annotation:10.0-b28' //Required by Dagger2
-    annotationProcessor daggerCompiler
-    testAnnotationProcessor daggerCompiler
-    androidTestAnnotationProcessor daggerCompiler
+    kapt daggerCompiler
+//    testkapt daggerCompiler
+//    androidTestkapt daggerCompiler
 
     // ButterKnife Dependencies
     implementation 
"com.jakewharton:butterknife:$rootProject.butterKnifeVersion"
-    annotationProcessor 
"com.jakewharton:butterknife-compiler:$rootProject.butterKnifeVersion"
+    kapt "com.jakewharton:butterknife-compiler:$rootProject.butterKnifeVersion"
 
     // Fabric Crashlytics Dependencies
     implementation('com.crashlytics.sdk.android:crashlytics:2.6.8@aar') {
@@ -147,35 +159,34 @@ dependencies {
 
 }
 
-    // Log out test results to console
-    tasks.matching { it instanceof Test }.all {
-        testLogging.events = ["failed", "passed", "skipped"]
-    }
+// Log out test results to console
+tasks.matching { it instanceof Test }.all {
+    testLogging.events = ["failed", "passed", "skipped"]
+}
 
-    /*
+/*
     Resolves dependency versions across test and production APKs, 
specifically, transitive
     dependencies. This is required since Espresso internally has a dependency 
on support-annotations.
     */
-    configurations.all {
-        resolutionStrategy {
-            force 'com.android.support:support-annotations:23.1.1'
-            force 'com.google.code.findbugs:jsr305:1.3.9'
-        }
+configurations.all {
+    resolutionStrategy {
+        force 'com.android.support:support-annotations:23.1.1'
+        force 'com.google.code.findbugs:jsr305:1.3.9'
     }
+}
 
-
-    /*
+/*
     All direct/transitive dependencies shared between your test and production 
APKs need to be
     excluded from the test APK! This is necessary because both APKs will 
contain the same classes. Not
     excluding these dependencies from your test configuration will result in 
an dex pre-verifier error
     at runtime. More info in this tools bug: 
(https://code.google.com/p/android/issues/detail?id=192497)
     */
-    configurations.compile.dependencies.each { compileDependency ->
-        println "Excluding compile dependency: ${compileDependency.getName()}"
-        configurations.androidTestCompile.dependencies.each { 
androidTestCompileDependency ->
-            configurations.androidTestCompile.exclude module: 
"${compileDependency.getName()}"
-        }
+configurations.compile.dependencies.each { compileDependency ->
+    println "Excluding compile dependency: ${compileDependency.getName()}"
+    configurations.androidTestCompile.dependencies.each { 
androidTestCompileDependency ->
+        configurations.androidTestCompile.exclude module: 
"${compileDependency.getName()}"
     }
+}
 repositories {
     mavenCentral()
-}
\ No newline at end of file
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5320f26..abbc4f0 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -72,6 +72,12 @@
 
         <activity 
android:name=".ui.online.customers.customeractivities.CustomerActivitiesActivity"
 />
 
+        <receiver android:name=".jobs.JobsReceiver"
+            android:exported="false">
+            <intent-filter>
+                <action android:name="org.apache.fineract.JobsReceiver"/>
+            </intent-filter>
+        </receiver>
     </application>
 
 </manifest>
\ No newline at end of file
diff --git a/app/src/main/java/org/apache/fineract/FineractApplication.java 
b/app/src/main/java/org/apache/fineract/FineractApplication.java
index dfc4e3b..f639213 100644
--- a/app/src/main/java/org/apache/fineract/FineractApplication.java
+++ b/app/src/main/java/org/apache/fineract/FineractApplication.java
@@ -4,10 +4,16 @@ import android.app.Application;
 import android.content.Context;
 
 import com.crashlytics.android.Crashlytics;
+import com.evernote.android.job.JobManager;
+import com.raizlabs.android.dbflow.config.FlowManager;
 
 import org.apache.fineract.injection.component.ApplicationComponent;
 import org.apache.fineract.injection.component.DaggerApplicationComponent;
 import org.apache.fineract.injection.module.ApplicationModule;
+import org.apache.fineract.jobs.StartSyncJob;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
 
 import io.fabric.sdk.android.Fabric;
 
@@ -22,11 +28,15 @@ public class FineractApplication extends Application {
 
     private static FineractApplication instance;
 
+    @Inject
+    JobManager jobManager;
+
     @Override
     public void onCreate() {
         super.onCreate();
         instance = this;
         Fabric.with(this, new Crashlytics());
+        FlowManager.init(this);
     }
 
     public static Context getContext() {
@@ -42,6 +52,7 @@ public class FineractApplication extends Application {
             applicationComponent = DaggerApplicationComponent.builder()
                     .applicationModule(new ApplicationModule(this))
                     .build();
+            applicationComponent.inject(this);
         }
         return applicationComponent;
     }
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerAnonymous.java
 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerAnonymous.java
similarity index 94%
rename from 
app/src/main/java/org/apache/fineract/data/datamanager/DataManagerAnonymous.java
rename to 
app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerAnonymous.java
index 8f3f383..cf08719 100644
--- 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerAnonymous.java
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerAnonymous.java
@@ -1,4 +1,4 @@
-package org.apache.fineract.data.datamanager;
+package org.apache.fineract.data.datamanager.api;
 
 import org.apache.fineract.data.local.PreferencesHelper;
 import org.apache.fineract.data.models.customer.Country;
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerAuth.java 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerAuth.java
similarity index 97%
rename from 
app/src/main/java/org/apache/fineract/data/datamanager/DataManagerAuth.java
rename to 
app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerAuth.java
index 68e43a0..1d2aab9 100644
--- 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerAuth.java
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerAuth.java
@@ -1,4 +1,4 @@
-package org.apache.fineract.data.datamanager;
+package org.apache.fineract.data.datamanager.api;
 
 import android.util.Base64;
 
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerCustomer.java
 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerCustomer.java
similarity index 90%
rename from 
app/src/main/java/org/apache/fineract/data/datamanager/DataManagerCustomer.java
rename to 
app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerCustomer.java
index 9b9665a..ac50ed7 100644
--- 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerCustomer.java
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerCustomer.java
@@ -1,7 +1,9 @@
-package org.apache.fineract.data.datamanager;
+package org.apache.fineract.data.datamanager.api;
 
 import org.apache.fineract.FakeRemoteDataSource;
+import org.apache.fineract.data.datamanager.contracts.ManagerCustomer;
 import org.apache.fineract.data.local.PreferencesHelper;
+import org.apache.fineract.data.local.database.helpers.DatabaseHelperCustomer;
 import org.apache.fineract.data.models.customer.Command;
 import org.apache.fineract.data.models.customer.Customer;
 import org.apache.fineract.data.models.customer.CustomerPage;
@@ -15,6 +17,7 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import io.reactivex.Completable;
+import io.reactivex.CompletableObserver;
 import io.reactivex.Observable;
 import io.reactivex.ObservableSource;
 import io.reactivex.functions.Function;
@@ -25,17 +28,19 @@ import okhttp3.MultipartBody;
  *         On 20/06/17.
  */
 @Singleton
-public class DataManagerCustomer extends FineractBaseDataManager {
+public class DataManagerCustomer extends FineractBaseDataManager implements 
ManagerCustomer {
 
     private final BaseApiManager baseApiManager;
     private final PreferencesHelper preferencesHelper;
+    private final DatabaseHelperCustomer databaseHelper;
 
     @Inject
     public DataManagerCustomer(BaseApiManager baseApiManager, 
PreferencesHelper preferencesHelper,
-            DataManagerAuth dataManagerAuth) {
+                           DataManagerAuth dataManagerAuth, 
DatabaseHelperCustomer databaseHelper) {
         super(dataManagerAuth, preferencesHelper);
         this.baseApiManager = baseApiManager;
         this.preferencesHelper = preferencesHelper;
+        this.databaseHelper = databaseHelper;
     }
 
     public Observable<CustomerPage> fetchCustomers(Integer pageIndex, Integer 
size) {
@@ -48,7 +53,7 @@ public class DataManagerCustomer extends 
FineractBaseDataManager {
                                     Throwable throwable) throws Exception {
                                 return 
Observable.just(FakeRemoteDataSource.getCustomerPage());
                             }
-                        });
+                });
     }
 
     public Observable<Customer> fetchCustomer(String identifier) {
@@ -61,7 +66,7 @@ public class DataManagerCustomer extends 
FineractBaseDataManager {
                                     Throwable throwable) throws Exception {
                                 return 
Observable.just(FakeRemoteDataSource.getCustomer());
                             }
-                        });
+                });
     }
 
     public Completable updateCustomer(String customerIdentifier, Customer 
customer) {
@@ -74,9 +79,15 @@ public class DataManagerCustomer extends 
FineractBaseDataManager {
                 .searchCustomer(pageIndex, size, term));
     }
 
-    public Completable createCustomer(Customer customer) {
+    public Completable createCustomer(final Customer customer) {
         return authenticatedCompletableApi(
-                baseApiManager.getCustomerApi().createCustomer(customer));
+                baseApiManager.getCustomerApi().createCustomer(customer))
+                .andThen(new Completable() {
+                    @Override
+                    protected void subscribeActual(CompletableObserver s) {
+                        databaseHelper.deleteCustomerPayload(customer);
+                    }
+                });
     }
 
     public Completable customerCommand(String identifier, Command command) {
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerDeposit.java
 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerDeposit.java
similarity index 96%
rename from 
app/src/main/java/org/apache/fineract/data/datamanager/DataManagerDeposit.java
rename to 
app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerDeposit.java
index 8e13597..beecc0f 100644
--- 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerDeposit.java
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerDeposit.java
@@ -1,4 +1,4 @@
-package org.apache.fineract.data.datamanager;
+package org.apache.fineract.data.datamanager.api;
 
 import org.apache.fineract.FakeRemoteDataSource;
 import org.apache.fineract.data.local.PreferencesHelper;
@@ -39,8 +39,7 @@ public class DataManagerDeposit extends 
FineractBaseDataManager {
         return authenticatedObservableApi(baseApiManager.getDepositApi()
                 .fetchCustomersDeposits(customerIdentifier))
                 .onErrorResumeNext(
-                        new Function<Throwable, 
ObservableSource<List<DepositAccount>>>
-                                () {
+                        new Function<Throwable, 
ObservableSource<List<DepositAccount>>>() {
                             @Override
                             public ObservableSource<List<DepositAccount>> 
apply(
                                     Throwable throwable)
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerIndividualLending.java
 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerIndividualLending.java
similarity index 97%
rename from 
app/src/main/java/org/apache/fineract/data/datamanager/DataManagerIndividualLending.java
rename to 
app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerIndividualLending.java
index a3ba78e..5c29e29 100644
--- 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerIndividualLending.java
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerIndividualLending.java
@@ -1,4 +1,4 @@
-package org.apache.fineract.data.datamanager;
+package org.apache.fineract.data.datamanager.api;
 
 import org.apache.fineract.FakeRemoteDataSource;
 import org.apache.fineract.data.local.PreferencesHelper;
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerLoans.java 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerLoans.java
similarity index 98%
rename from 
app/src/main/java/org/apache/fineract/data/datamanager/DataManagerLoans.java
rename to 
app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerLoans.java
index e315d80..7225fd9 100644
--- 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerLoans.java
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerLoans.java
@@ -1,4 +1,4 @@
-package org.apache.fineract.data.datamanager;
+package org.apache.fineract.data.datamanager.api;
 
 import org.apache.fineract.FakeRemoteDataSource;
 import org.apache.fineract.data.local.PreferencesHelper;
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerRoles.java 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerRoles.java
similarity index 96%
rename from 
app/src/main/java/org/apache/fineract/data/datamanager/DataManagerRoles.java
rename to 
app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerRoles.java
index 60df5c0..116bde1 100644
--- 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerRoles.java
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerRoles.java
@@ -1,4 +1,4 @@
-package org.apache.fineract.data.datamanager;
+package org.apache.fineract.data.datamanager.api;
 
 import org.apache.fineract.FakeRemoteDataSource;
 import org.apache.fineract.data.local.PreferencesHelper;
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/FineractBaseDataManager.java
 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/FineractBaseDataManager.java
similarity index 98%
rename from 
app/src/main/java/org/apache/fineract/data/datamanager/FineractBaseDataManager.java
rename to 
app/src/main/java/org/apache/fineract/data/datamanager/api/FineractBaseDataManager.java
index 11cdbf6..b6958ac 100644
--- 
a/app/src/main/java/org/apache/fineract/data/datamanager/FineractBaseDataManager.java
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/FineractBaseDataManager.java
@@ -1,4 +1,4 @@
-package org.apache.fineract.data.datamanager;
+package org.apache.fineract.data.datamanager.api;
 
 import org.apache.fineract.data.local.PreferenceKey;
 import org.apache.fineract.data.local.PreferencesHelper;
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/contracts/ManagerCustomer.java
 
b/app/src/main/java/org/apache/fineract/data/datamanager/contracts/ManagerCustomer.java
new file mode 100644
index 0000000..a992c56
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/contracts/ManagerCustomer.java
@@ -0,0 +1,53 @@
+package org.apache.fineract.data.datamanager.contracts;
+
+import org.apache.fineract.data.models.customer.Command;
+import org.apache.fineract.data.models.customer.Customer;
+import org.apache.fineract.data.models.customer.CustomerPage;
+import org.apache.fineract.data.models.customer.identification.Identification;
+import org.apache.fineract.data.models.customer.identification.ScanCard;
+
+import java.util.List;
+
+import io.reactivex.Completable;
+import io.reactivex.Observable;
+import okhttp3.MultipartBody;
+
+public interface ManagerCustomer {
+
+    Observable<CustomerPage> fetchCustomers(Integer pageIndex, Integer size);
+
+    Observable<Customer> fetchCustomer(String identifier);
+
+    Completable updateCustomer(String customerIdentifier, Customer customer);
+
+    Observable<CustomerPage> searchCustomer(Integer pageIndex, Integer size, 
String term);
+
+    Completable createCustomer(Customer customer);
+
+    Completable customerCommand(String identifier, Command command);
+
+    Observable<List<Command>> fetchCustomerCommands(String customerIdentifier);
+
+    Observable<List<Identification>> fetchIdentifications(String 
customerIdentifier);
+
+    Completable createIdentificationCard(String identifier, Identification 
identification);
+
+    Completable updateIdentificationCard(String customerIdentifier, String 
identificationNumber,
+                                         Identification identification);
+
+    Observable<List<ScanCard>> fetchIdentificationScanCards(String 
customerIdentifier,
+                                                                   String 
identificationNumber);
+
+    Completable uploadIdentificationCardScan(String customerIdentifier, String 
identificationNumber,
+                                             String scanIdentifier, String 
description,
+                                             MultipartBody.Part file);
+
+    Completable deleteIdentificationCardScan(String customerIdentifier, String 
identificationNumber,
+                                             String scanIdentifier);
+
+    Completable deleteIdentificationCard(String customerIdentifier, String 
identificationnumber);
+
+    Completable uploadCustomerPortrait(String customerIdentifier, 
MultipartBody.Part file);
+
+    Completable deleteCustomerPortrait(String customerIdentifier);
+}
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/database/DbManagerCustomer.java
 
b/app/src/main/java/org/apache/fineract/data/datamanager/database/DbManagerCustomer.java
new file mode 100644
index 0000000..ee22935
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/database/DbManagerCustomer.java
@@ -0,0 +1,115 @@
+package org.apache.fineract.data.datamanager.database;
+
+import org.apache.fineract.data.datamanager.contracts.ManagerCustomer;
+import org.apache.fineract.data.local.database.helpers.DatabaseHelperCustomer;
+import org.apache.fineract.data.models.customer.Command;
+import org.apache.fineract.data.models.customer.Customer;
+import org.apache.fineract.data.models.customer.CustomerPage;
+import org.apache.fineract.data.models.customer.identification.Identification;
+import org.apache.fineract.data.models.customer.identification.ScanCard;
+
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import io.reactivex.Completable;
+import io.reactivex.Observable;
+import okhttp3.MultipartBody;
+
+@Singleton
+public class DbManagerCustomer implements ManagerCustomer {
+
+    private DatabaseHelperCustomer databaseHelperCustomer;
+
+    @Inject
+    public DbManagerCustomer(DatabaseHelperCustomer databaseHelperCustomer) {
+        this.databaseHelperCustomer = databaseHelperCustomer;
+    }
+
+    @Override
+    public Observable<CustomerPage> fetchCustomers(Integer pageIndex, Integer 
size) {
+        return databaseHelperCustomer.readAllCustomers();
+    }
+
+    @Override
+    public Observable<Customer> fetchCustomer(final String identifier) {
+        return databaseHelperCustomer.fetchCustomer(identifier);
+    }
+
+    @Override
+    public Completable updateCustomer(String customerIdentifier, Customer 
customer) {
+        return null;
+    }
+
+    @Override
+    public Observable<CustomerPage> searchCustomer(Integer pageIndex, Integer 
size, String term) {
+        return null;
+    }
+
+    @Override
+    public Completable createCustomer(Customer customer) {
+        return databaseHelperCustomer.saveCustomerPayload(customer);
+    }
+
+    @Override
+    public Completable customerCommand(String identifier, Command command) {
+        return null;
+    }
+
+    @Override
+    public Observable<List<Command>> fetchCustomerCommands(String 
customerIdentifier) {
+        return null;
+    }
+
+    @Override
+    public Observable<List<Identification>> fetchIdentifications(String 
customerIdentifier) {
+        return null;
+    }
+
+    @Override
+    public Completable createIdentificationCard(String identifier, 
Identification identification) {
+        return null;
+    }
+
+    @Override
+    public Completable updateIdentificationCard(String customerIdentifier,
+            String identificationNumber, Identification identification) {
+        return null;
+    }
+
+    @Override
+    public Observable<List<ScanCard>> fetchIdentificationScanCards(String 
customerIdentifier,
+            String identificationNumber) {
+        return null;
+    }
+
+    @Override
+    public Completable uploadIdentificationCardScan(String customerIdentifier, 
String
+            identificationNumber, String scanIdentifier, String description, 
MultipartBody.Part
+            file) {
+        return null;
+    }
+
+    @Override
+    public Completable deleteIdentificationCardScan(String customerIdentifier, 
String
+            identificationNumber, String scanIdentifier) {
+        return null;
+    }
+
+    @Override
+    public Completable deleteIdentificationCard(String customerIdentifier, 
String
+            identificationnumber) {
+        return null;
+    }
+
+    @Override
+    public Completable uploadCustomerPortrait(String customerIdentifier, 
MultipartBody.Part file) {
+        return null;
+    }
+
+    @Override
+    public Completable deleteCustomerPortrait(String customerIdentifier) {
+        return null;
+    }
+}
diff --git 
a/app/src/main/java/org/apache/fineract/data/local/PreferenceKey.java 
b/app/src/main/java/org/apache/fineract/data/local/PreferenceKey.java
index 662d476..265f91d 100644
--- a/app/src/main/java/org/apache/fineract/data/local/PreferenceKey.java
+++ b/app/src/main/java/org/apache/fineract/data/local/PreferenceKey.java
@@ -14,4 +14,6 @@ public class PreferenceKey {
     public static final String PREF_KEY_USER_NAME = "PREF_KEY_USER_NAME";
     public static final String PREF_KEY_REFRESH_ACCESS_TOKEN = 
"PREF_KEY_REFRESH_ACCESS_TOKEN";
     public static final String PREF_KEY_COOKIES = "PREF_KEY_COOKIES";
+    public static final String PREF_IS_FETCHING = "PREF_IS_FETCHING";
+    public static final String PREF_IS_FIRST_TIME = "PREF_IS_FIRST_TIME";
 }
diff --git 
a/app/src/main/java/org/apache/fineract/data/local/PreferencesHelper.java 
b/app/src/main/java/org/apache/fineract/data/local/PreferencesHelper.java
index 3ab9593..e7f766e 100644
--- a/app/src/main/java/org/apache/fineract/data/local/PreferencesHelper.java
+++ b/app/src/main/java/org/apache/fineract/data/local/PreferencesHelper.java
@@ -120,4 +120,20 @@ public class PreferencesHelper {
     public String getUserName() {
         return getPreferences().getString(PreferenceKey.PREF_KEY_USER_NAME, 
null);
     }
+
+    public void setFetching(boolean isFetching) {
+        getPreferences().edit().putBoolean(PreferenceKey.PREF_IS_FETCHING, 
isFetching).apply();
+    }
+
+    public boolean isFetching() {
+        return getPreferences().getBoolean(PreferenceKey.PREF_IS_FETCHING, 
true);
+    }
+
+    public void setFirstTime(boolean isFirstTime) {
+        getPreferences().edit().putBoolean(PreferenceKey.PREF_IS_FIRST_TIME, 
isFirstTime).apply();
+    }
+
+    public boolean isFirstTime() {
+        return getPreferences().getBoolean(PreferenceKey.PREF_IS_FIRST_TIME, 
true);
+    }
 }
diff --git 
a/app/src/main/java/org/apache/fineract/data/local/database/AppDatabase.kt 
b/app/src/main/java/org/apache/fineract/data/local/database/AppDatabase.kt
new file mode 100644
index 0000000..ab6ffcf
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/data/local/database/AppDatabase.kt
@@ -0,0 +1,11 @@
+package org.apache.fineract.data.local.database
+
+import com.raizlabs.android.dbflow.annotation.Database
+
+@Database(name = AppDatabase.NAME, version = AppDatabase.VERSION)
+class AppDatabase {
+    companion object {
+        const val NAME = "AppDatabase"
+        const val VERSION = 1
+    }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/data/local/database/helpers/DatabaseHelperCustomer.java
 
b/app/src/main/java/org/apache/fineract/data/local/database/helpers/DatabaseHelperCustomer.java
new file mode 100644
index 0000000..09a79ed
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/data/local/database/helpers/DatabaseHelperCustomer.java
@@ -0,0 +1,110 @@
+package org.apache.fineract.data.local.database.helpers;
+
+import com.google.gson.Gson;
+
+import 
org.apache.fineract.data.local.database.syncmodels.customer.CustomerPayload;
+import 
org.apache.fineract.data.local.database.syncmodels.customer.CustomerPayload_Table;
+import org.apache.fineract.data.models.customer.Customer;
+import org.apache.fineract.data.models.customer.CustomerPage;
+import org.apache.fineract.data.models.customer.Customer_Table;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import io.reactivex.Completable;
+import io.reactivex.Observable;
+import io.reactivex.ObservableEmitter;
+import io.reactivex.ObservableOnSubscribe;
+import io.reactivex.ObservableSource;
+
+import static com.raizlabs.android.dbflow.sql.language.SQLite.select;
+
+@Singleton
+public class DatabaseHelperCustomer {
+
+    @Inject
+    public DatabaseHelperCustomer() {
+    }
+
+    public void saveCustomers(final CustomerPage customerPage) {
+        for (Customer customer : customerPage.getCustomers()) {
+            customer.save();
+        }
+    }
+
+    public Observable<CustomerPage> readAllCustomers() {
+        return Observable.defer(new Callable<ObservableSource<? extends 
CustomerPage>>() {
+            @Override
+            public ObservableSource<? extends CustomerPage> call() throws 
Exception {
+                CustomerPage customerPage = new CustomerPage();
+                List<Customer> customerList = select()
+                        .from(Customer.class)
+                        .queryList();
+                customerPage.setCustomers(customerList);
+                customerPage.setTotalPages(customerPage.getCustomers().size());
+                return Observable.just(customerPage);
+            }
+        });
+    }
+
+    public Observable<Customer> fetchCustomer(final String identifier) {
+        return Observable.defer(new Callable<ObservableSource<? extends 
Customer>>() {
+            @Override
+            public ObservableSource<? extends Customer> call() throws 
Exception {
+
+                Customer customer = select()
+                        .from(Customer.class)
+                        .where(Customer_Table.identifier.eq(identifier))
+                        .querySingle();
+                if (customer == null)
+                    customer = new Customer();
+                    //else it will throw exception and will not go in the 
flatMap
+                return Observable.just(customer);
+            }
+        });
+
+    }
+
+    public void deleteCustomerPayload(final Customer customer) {
+        CustomerPayload payload = select()
+                .from(CustomerPayload.class)
+                .where(CustomerPayload_Table.customerPayload.eq(new 
Gson().toJson(customer)))
+                .querySingle();
+        if (payload != null) {
+            payload.delete();
+        }
+    }
+
+    public Completable saveCustomerPayload(final Customer customer) {
+        return Observable.defer(new Callable<ObservableSource<?>>() {
+            @Override
+            public ObservableSource<?> call() throws Exception {
+                CustomerPayload customerPayload = new CustomerPayload(new 
Gson().toJson(customer));
+                customerPayload.save();
+                return Observable.empty();
+            }
+        }).ignoreElements();
+    }
+
+    public Observable<List<Customer>> fetchCustomerPayload() {
+        return Observable.defer(new Callable<ObservableSource<? extends 
List<Customer>>>() {
+            @Override
+            public ObservableSource<? extends List<Customer>> call() throws 
Exception {
+                List<CustomerPayload> customerPayloads = select()
+                        .from(CustomerPayload.class)
+                        .queryList();
+
+                List<Customer> customerList = new ArrayList<>();
+                Gson gson = new Gson();
+                for (CustomerPayload payload: customerPayloads) {
+                    
customerList.add(gson.fromJson(payload.getCustomerPayload(), Customer.class));
+                }
+                return Observable.just(customerList);
+            }
+        });
+    }
+}
diff --git 
a/app/src/main/java/org/apache/fineract/data/local/database/syncmodels/customer/CustomerPayload.kt
 
b/app/src/main/java/org/apache/fineract/data/local/database/syncmodels/customer/CustomerPayload.kt
new file mode 100644
index 0000000..9893614
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/data/local/database/syncmodels/customer/CustomerPayload.kt
@@ -0,0 +1,14 @@
+package org.apache.fineract.data.local.database.syncmodels.customer
+
+import android.os.Parcelable
+import com.raizlabs.android.dbflow.annotation.*
+import com.raizlabs.android.dbflow.structure.BaseModel
+import kotlinx.android.parcel.Parcelize
+import org.apache.fineract.data.local.database.AppDatabase
+
+@Parcelize
+@Table(database = AppDatabase::class, useBooleanGetterSetters = false)
+data class CustomerPayload(
+    @PrimaryKey
+    @Column var customerPayload: String? = null
+) : BaseModel(), Parcelable
diff --git 
a/app/src/main/java/org/apache/fineract/data/models/customer/Address.kt 
b/app/src/main/java/org/apache/fineract/data/models/customer/Address.kt
index f7ec279..357c8fc 100644
--- a/app/src/main/java/org/apache/fineract/data/models/customer/Address.kt
+++ b/app/src/main/java/org/apache/fineract/data/models/customer/Address.kt
@@ -2,14 +2,24 @@ package org.apache.fineract.data.models.customer
 
 import android.os.Parcelable
 import com.google.gson.annotations.SerializedName
+import com.raizlabs.android.dbflow.annotation.ConflictAction
+import com.raizlabs.android.dbflow.annotation.PrimaryKey
+import com.raizlabs.android.dbflow.annotation.Table
+import com.raizlabs.android.dbflow.structure.BaseModel
 import kotlinx.android.parcel.Parcelize
+import org.apache.fineract.data.local.database.AppDatabase
 
 @Parcelize
+@Table(name = "Address", database = AppDatabase::class, allFields = true, 
insertConflict =
+ConflictAction.REPLACE)
 data class Address(
+    @PrimaryKey
     @SerializedName("street") var street: String? = null,
+    @PrimaryKey
     @SerializedName("city") var city: String? = null,
+    @PrimaryKey
     @SerializedName("region") var region: String? = null,
     @SerializedName("postalCode") var postalCode: String? = null,
     @SerializedName("countryCode") var countryCode: String? = null,
     @SerializedName("country") var country: String? = null
-) : Parcelable
\ No newline at end of file
+) : BaseModel(), Parcelable
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/data/models/customer/ContactDetail.kt 
b/app/src/main/java/org/apache/fineract/data/models/customer/ContactDetail.kt
index ad1b597..b87a5a1 100644
--- 
a/app/src/main/java/org/apache/fineract/data/models/customer/ContactDetail.kt
+++ 
b/app/src/main/java/org/apache/fineract/data/models/customer/ContactDetail.kt
@@ -3,16 +3,27 @@ package org.apache.fineract.data.models.customer
 import android.os.Parcelable
 
 import com.google.gson.annotations.SerializedName
+import com.raizlabs.android.dbflow.annotation.ConflictAction
+import com.raizlabs.android.dbflow.annotation.ForeignKey
+import com.raizlabs.android.dbflow.annotation.PrimaryKey
+import com.raizlabs.android.dbflow.annotation.Table
+import com.raizlabs.android.dbflow.structure.BaseModel
 import kotlinx.android.parcel.Parcelize
+import org.apache.fineract.data.local.database.AppDatabase
 
 @Parcelize
+@Table(name = "ContactDetail", database = AppDatabase::class, allFields = 
true, insertConflict =
+ConflictAction.REPLACE, useBooleanGetterSetters = false)
 data class ContactDetail(
     @SerializedName("type") var type: Type? = null,
     @SerializedName("value") var value: String? = null,
     @SerializedName("preferenceLevel") var preferenceLevel: Int? = null,
     @SerializedName("validated") var validated: Boolean? = null,
     @SerializedName("group") var group: Group? = null
-) : Parcelable {
+) : BaseModel(), Parcelable {
+
+    @PrimaryKey
+    @ForeignKey(stubbedRelationship = true) var customer: Customer? = null
 
     enum class Type {
         @SerializedName("EMAIL")
diff --git 
a/app/src/main/java/org/apache/fineract/data/models/customer/Customer.kt 
b/app/src/main/java/org/apache/fineract/data/models/customer/Customer.kt
index f4637c7..8fe5dd3 100644
--- a/app/src/main/java/org/apache/fineract/data/models/customer/Customer.kt
+++ b/app/src/main/java/org/apache/fineract/data/models/customer/Customer.kt
@@ -3,29 +3,48 @@ package org.apache.fineract.data.models.customer
 import android.os.Parcelable
 
 import com.google.gson.annotations.SerializedName
+import com.raizlabs.android.dbflow.annotation.*
+import com.raizlabs.android.dbflow.sql.language.SQLite.select
+import com.raizlabs.android.dbflow.structure.BaseModel
 import kotlinx.android.parcel.Parcelize
+import org.apache.fineract.data.local.database.AppDatabase
 
 @Parcelize
+@Table(database = AppDatabase::class, useBooleanGetterSetters = false)
 data class Customer(
-    @SerializedName("identifier") var identifier: String? = null,
-    @SerializedName("type") var type: String? = null,
-    @SerializedName("givenName") var givenName: String? = null,
-    @SerializedName("middleName") var middleName: String? = null,
-    @SerializedName("surname") var surname: String? = null,
-    @SerializedName("dateOfBirth") var dateOfBirth: DateOfBirth? = null,
-    @SerializedName("member") var member: Boolean? = null,
-    @SerializedName("accountBeneficiary") var accountBeneficiary: String? = 
null,
-    @SerializedName("referenceCustomer") var referenceCustomer: String? = null,
-    @SerializedName("assignedOffice") var assignedOffice: String? = null,
-    @SerializedName("assignedEmployee") var assignedEmployee: String? = null,
-    @SerializedName("address") var address: Address? = null,
-    @SerializedName("contactDetails") var contactDetails: List<ContactDetail>? 
= null,
-    @SerializedName("currentState") var currentState: State? = null,
-    @SerializedName("createdBy") var createdBy: String? = null,
-    @SerializedName("createdOn") var createdOn: String? = null,
-    @SerializedName("lastModifiedBy") var lastModifiedBy: String? = null,
-    @SerializedName("lastModifiedOn") var lastModifiedOn: String? = null
-) : Parcelable {
+    @PrimaryKey
+    @Column var identifier: String? = null,
+    @Column var type: String? = null,
+    @Column var givenName: String? = null,
+    @Column var middleName: String? = null,
+    @Column var surname: String? = null,
+    @ForeignKey(saveForeignKeyModel = true)
+    @Column var dateOfBirth: DateOfBirth? = null,
+    @Column var member: Boolean? = null,
+    @Column var accountBeneficiary: String? = null,
+    @Column var referenceCustomer: String? = null,
+    @Column var assignedOffice: String? = null,
+    @Column var assignedEmployee: String? = null,
+    @ForeignKey(saveForeignKeyModel = true)
+    @Column var address: Address? = null,
+    var contactDetails: List<ContactDetail>? = null,
+    @Column var currentState: State? = null,
+    @Column var createdBy: String? = null,
+    @Column var createdOn: String? = null,
+    @Column var lastModifiedBy: String? = null,
+    @Column var lastModifiedOn: String? = null
+) : BaseModel(), Parcelable {
+
+    var isUpdate: Boolean? = null
+
+    @OneToMany(methods = arrayOf(OneToMany.Method.ALL), variableName = 
"contactDetails")
+    fun getContactDetail() : List<ContactDetail>? {
+        contactDetails = select()
+                .from(ContactDetail::class.java)
+                .where(ContactDetail_Table.customer_identifier.eq(identifier))
+                .queryList()
+        return contactDetails
+    }
 
     enum class Type {
 
@@ -50,4 +69,15 @@ data class Customer(
         @SerializedName("CLOSED")
         CLOSED
     }
+
+    override fun save(): Boolean {
+        val res = super.save()
+        if (contactDetails != null) {
+            contactDetails!!.forEach {
+                it.customer = this
+                it.save()
+            }
+        }
+        return res
+    }
 }
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/data/models/customer/DateOfBirth.kt 
b/app/src/main/java/org/apache/fineract/data/models/customer/DateOfBirth.kt
index 767c2bd..ee5fa14 100644
--- a/app/src/main/java/org/apache/fineract/data/models/customer/DateOfBirth.kt
+++ b/app/src/main/java/org/apache/fineract/data/models/customer/DateOfBirth.kt
@@ -2,11 +2,20 @@ package org.apache.fineract.data.models.customer
 
 import android.os.Parcelable
 import com.google.gson.annotations.SerializedName
+import com.raizlabs.android.dbflow.annotation.ConflictAction
+import com.raizlabs.android.dbflow.annotation.PrimaryKey
+import com.raizlabs.android.dbflow.annotation.Table
+import com.raizlabs.android.dbflow.structure.BaseModel
 import kotlinx.android.parcel.Parcelize
+import org.apache.fineract.data.local.database.AppDatabase
 
 @Parcelize
+@Table(database = AppDatabase::class, allFields = true)
 data class DateOfBirth(
     @SerializedName("year") var year: Int? = null,
     @SerializedName("month")  var month: Int? = null,
     @SerializedName("day") var day: Int? = null
-) : Parcelable
\ No newline at end of file
+) : BaseModel(), Parcelable {
+    @PrimaryKey(autoincrement = true)
+    var id: Long? = null
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/injection/component/ActivityComponent.java
 
b/app/src/main/java/org/apache/fineract/injection/component/ActivityComponent.java
index b906e9b..a4dfd00 100644
--- 
a/app/src/main/java/org/apache/fineract/injection/component/ActivityComponent.java
+++ 
b/app/src/main/java/org/apache/fineract/injection/component/ActivityComponent.java
@@ -2,6 +2,7 @@ package org.apache.fineract.injection.component;
 
 import org.apache.fineract.injection.PerActivity;
 import org.apache.fineract.injection.module.ActivityModule;
+import org.apache.fineract.ui.offline.CustomerPayloadFragment;
 import org.apache.fineract.ui.online.DashboardActivity;
 import 
org.apache.fineract.ui.online.customers.createcustomer.customeractivity.CreateCustomerActivity;
 import 
org.apache.fineract.ui.online.customers.createcustomer.formcustomeraddress.FormCustomerAddressFragment;
@@ -97,4 +98,7 @@ public interface ActivityComponent {
     void inject(DashboardActivity dashboardActivity);
 
     void inject(RolesFragment rolesFragment);
+
+    void inject(CustomerPayloadFragment customerPayloadFragment);
+
 }
diff --git 
a/app/src/main/java/org/apache/fineract/injection/component/ApplicationComponent.java
 
b/app/src/main/java/org/apache/fineract/injection/component/ApplicationComponent.java
index e130ed4..7a22b6e 100644
--- 
a/app/src/main/java/org/apache/fineract/injection/component/ApplicationComponent.java
+++ 
b/app/src/main/java/org/apache/fineract/injection/component/ApplicationComponent.java
@@ -3,34 +3,42 @@ package org.apache.fineract.injection.component;
 import android.app.Application;
 import android.content.Context;
 
+import com.evernote.android.job.JobManager;
+
 import org.apache.fineract.FineractApplication;
-import org.apache.fineract.data.datamanager.DataManagerAnonymous;
-import org.apache.fineract.data.datamanager.DataManagerAuth;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
-import org.apache.fineract.data.datamanager.DataManagerDeposit;
-import org.apache.fineract.data.datamanager.DataManagerIndividualLending;
-import org.apache.fineract.data.datamanager.DataManagerLoans;
-import org.apache.fineract.data.datamanager.DataManagerRoles;
+import org.apache.fineract.data.datamanager.api.DataManagerAnonymous;
+import org.apache.fineract.data.datamanager.api.DataManagerAuth;
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.api.DataManagerDeposit;
+import org.apache.fineract.data.datamanager.api.DataManagerIndividualLending;
+import org.apache.fineract.data.datamanager.api.DataManagerLoans;
+import org.apache.fineract.data.datamanager.api.DataManagerRoles;
+import org.apache.fineract.data.datamanager.database.DbManagerCustomer;
 import org.apache.fineract.data.local.PreferencesHelper;
+import org.apache.fineract.data.local.database.helpers.DatabaseHelperCustomer;
 import org.apache.fineract.data.remote.BaseApiManager;
 import org.apache.fineract.data.remote.FineractInterceptor;
 import org.apache.fineract.data.remote.ReceivedCookiesInterceptor;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.module.ApplicationModule;
+import org.apache.fineract.injection.module.JobsModule;
 
 import javax.inject.Singleton;
 
 import dagger.Component;
 
 @Singleton
-@Component(modules = ApplicationModule.class)
+@Component(modules = {ApplicationModule.class, JobsModule.class})
 public interface ApplicationComponent {
 
     @ApplicationContext
     Context context();
     Application application();
+    JobManager jobManager();
     DataManagerAuth dataManager();
     DataManagerCustomer dataManagerCustomer();
+    DbManagerCustomer bbManagerCustomer();
+    DatabaseHelperCustomer customerDatabaseHelper();
     DataManagerDeposit dataManagerDeposit();
     DataManagerLoans dataManagerLoans();
     DataManagerIndividualLending dataManagerIndividualLending();
@@ -43,5 +51,5 @@ public interface ApplicationComponent {
     void inject(FineractApplication mifosApplication);
 
     void inject(ReceivedCookiesInterceptor receivedCookiesInterceptor);
-
+    void inject(JobManager jobManager);
 }
diff --git 
a/app/src/main/java/org/apache/fineract/injection/module/JobsModule.java 
b/app/src/main/java/org/apache/fineract/injection/module/JobsModule.java
new file mode 100644
index 0000000..d40ad84
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/injection/module/JobsModule.java
@@ -0,0 +1,47 @@
+package org.apache.fineract.injection.module;
+
+import android.app.Application;
+
+import com.evernote.android.job.Job;
+import com.evernote.android.job.JobManager;
+
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
+import org.apache.fineract.data.local.database.helpers.DatabaseHelperCustomer;
+import org.apache.fineract.jobs.CreationUpdationCustomerJob;
+import org.apache.fineract.jobs.StartSyncJob;
+import org.apache.fineract.jobs.FineractJobCreator;
+
+import javax.inject.Singleton;
+
+import dagger.Module;
+import dagger.Provides;
+import dagger.multibindings.IntoMap;
+import dagger.multibindings.StringKey;
+
+@Module
+public class JobsModule {
+
+    @Provides
+    @Singleton
+    public JobManager provideJobManager(Application application, 
FineractJobCreator
+            fineractJobCreator) {
+        JobManager.create(application).addJobCreator(fineractJobCreator);
+        return JobManager.instance();
+    }
+
+    @Provides
+    @IntoMap
+    @StringKey(CreationUpdationCustomerJob.TAG)
+    public Job provideSyncCustomerCreationUpdationJob(DataManagerCustomer 
dataManagerCustomer,
+                                      DatabaseHelperCustomer databaseHelper) {
+        return new CreationUpdationCustomerJob(dataManagerCustomer, 
databaseHelper);
+    }
+
+    @Provides
+    @IntoMap
+    @StringKey(StartSyncJob.TAG)
+    public Job provideSyncCustomerJob(DataManagerCustomer dataManagerCustomer,
+                                      DatabaseHelperCustomer databaseHelper) {
+        return new StartSyncJob(dataManagerCustomer, databaseHelper);
+    }
+}
diff --git 
a/app/src/main/java/org/apache/fineract/jobs/CreationUpdationCustomerJob.java 
b/app/src/main/java/org/apache/fineract/jobs/CreationUpdationCustomerJob.java
new file mode 100644
index 0000000..4828992
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/jobs/CreationUpdationCustomerJob.java
@@ -0,0 +1,90 @@
+package org.apache.fineract.jobs;
+
+import android.annotation.SuppressLint;
+import android.support.annotation.NonNull;
+import android.util.Log;
+
+import com.evernote.android.job.Job;
+import com.evernote.android.job.JobRequest;
+
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.contracts.ManagerCustomer;
+import org.apache.fineract.data.local.database.helpers.DatabaseHelperCustomer;
+import org.apache.fineract.data.models.customer.Customer;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import io.reactivex.CompletableSource;
+import io.reactivex.Observable;
+import io.reactivex.ObservableSource;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.functions.Function;
+import io.reactivex.observers.DisposableCompletableObserver;
+import io.reactivex.schedulers.Schedulers;
+
+@Singleton
+public class CreationUpdationCustomerJob extends Job {
+
+    private ManagerCustomer dataManagerCustomer;
+    private DatabaseHelperCustomer databaseHelper;
+    public static final String TAG = "CUSTOMERS_CREATION_UPDATION";
+
+    @Inject
+    public CreationUpdationCustomerJob(DataManagerCustomer dataManagerCustomer,
+                                       DatabaseHelperCustomer databaseHelper) {
+        this.dataManagerCustomer = dataManagerCustomer;
+        this.databaseHelper = databaseHelper;
+    }
+
+    @NonNull
+    @Override
+    protected Result onRunJob(@NonNull Params params) {
+        syncCustomer();
+        return Result.SUCCESS;
+    }
+
+    @SuppressLint("CheckResult")
+    private void syncCustomer() {
+        databaseHelper.fetchCustomerPayload()
+                .flatMap(new Function<List<Customer>, 
ObservableSource<Customer>>() {
+                    @Override
+                    public ObservableSource<Customer> apply(List<Customer> 
customers) throws Exception {
+                        return Observable.fromIterable(customers);
+                    }
+                })
+                .flatMapCompletable(new Function<Customer, 
CompletableSource>() {
+                    @Override
+                    public CompletableSource apply(Customer customer) throws 
Exception {
+                        return dataManagerCustomer.createCustomer(customer);
+                    }
+                })
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribeWith(new DisposableCompletableObserver() {
+                    @Override
+                    public void onComplete() {
+                        // getting the updates once the data is synced to the 
server.
+                        StartSyncJob.scheduleItNow();
+                    }
+
+                    @Override
+                    public void onError(Throwable e) {
+                        Log.d(StartSyncJob.class.getSimpleName(), 
e.toString());
+                    }
+                });
+
+    }
+
+    public static void schedulePeriodic() {
+        new JobRequest.Builder(CreationUpdationCustomerJob.TAG)
+                .setPeriodic(TimeUnit.MINUTES.toMillis(15),
+                        TimeUnit.MINUTES.toMillis(10))
+                .setUpdateCurrent(true)
+                .build()
+                .schedule();
+    }
+}
diff --git a/app/src/main/java/org/apache/fineract/jobs/FineractJobCreator.java 
b/app/src/main/java/org/apache/fineract/jobs/FineractJobCreator.java
new file mode 100644
index 0000000..04741b8
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/jobs/FineractJobCreator.java
@@ -0,0 +1,33 @@
+package org.apache.fineract.jobs;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import com.evernote.android.job.Job;
+import com.evernote.android.job.JobCreator;
+
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Provider;
+import javax.inject.Singleton;
+
+@Singleton
+public class FineractJobCreator implements JobCreator {
+
+    private Map<String, Provider<Job>> jobProvider;
+
+    @Inject
+    public FineractJobCreator(Map<String, Provider<Job>> jobProvider) {
+        this.jobProvider = jobProvider;
+    }
+
+    @Nullable
+    @Override
+    public Job create(@NonNull String tag) {
+        if (jobProvider.containsKey(tag)) {
+            return jobProvider.get(tag).get();
+        }
+        return null;
+    }
+}
diff --git a/app/src/main/java/org/apache/fineract/jobs/JobsReceiver.java 
b/app/src/main/java/org/apache/fineract/jobs/JobsReceiver.java
new file mode 100644
index 0000000..a025687
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/jobs/JobsReceiver.java
@@ -0,0 +1,59 @@
+package org.apache.fineract.jobs;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.content.LocalBroadcastManager;
+
+import org.apache.fineract.R;
+import org.apache.fineract.data.local.PreferencesHelper;
+import org.apache.fineract.ui.online.DashboardActivity;
+
+public class JobsReceiver extends BroadcastReceiver {
+
+    private PreferencesHelper preferencesHelper;
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        preferencesHelper = new PreferencesHelper(context);
+        StartSyncJob.JobStatus jobStatus = (StartSyncJob.JobStatus) intent.
+                getSerializableExtra(StartSyncJob.STATUS);
+        String msg;
+        if (jobStatus == StartSyncJob.JobStatus.STARTED) {
+            msg = "Fetching data from server, we will notify you once its 
done.";
+            preferencesHelper.setFetching(true);
+        } else {
+            msg = "Fetching data complete.";
+            preferencesHelper.setFetching(false);
+        }
+        showNotification(context, msg);
+
+    }
+
+    private void showNotification(Context context, String msg) {
+        NotificationManager mNotificationManager =
+                (NotificationManager) 
context.getSystemService(Context.NOTIFICATION_SERVICE);
+        if (android.os.Build.VERSION.SDK_INT >= 
android.os.Build.VERSION_CODES.O) {
+            NotificationChannel channel = new NotificationChannel("default",
+                    "YOUR_CHANNEL_NAME",
+                    NotificationManager.IMPORTANCE_DEFAULT);
+            channel.setDescription("NOTIFICATION_CHANNEL");
+            mNotificationManager.createNotificationChannel(channel);
+        }
+        NotificationCompat.Builder mBuilder = new 
NotificationCompat.Builder(context, "default")
+                .setSmallIcon(R.drawable.launcher_image)
+                .setContentTitle(context.getString(R.string.app_name))
+                .setContentText(msg)
+                .setAutoCancel(true);
+        Intent intent = new Intent(context, DashboardActivity.class);
+        PendingIntent pi = PendingIntent.getActivity(context, 0, intent,
+                PendingIntent.FLAG_UPDATE_CURRENT);
+        mBuilder.setContentIntent(pi);
+        mNotificationManager.notify(123, mBuilder.build());
+    }
+
+}
diff --git a/app/src/main/java/org/apache/fineract/jobs/StartSyncJob.java 
b/app/src/main/java/org/apache/fineract/jobs/StartSyncJob.java
new file mode 100644
index 0000000..a511793
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/jobs/StartSyncJob.java
@@ -0,0 +1,95 @@
+package org.apache.fineract.jobs;
+
+import android.annotation.SuppressLint;
+import android.content.Intent;
+import android.support.annotation.NonNull;
+
+import com.evernote.android.job.Job;
+import com.evernote.android.job.JobRequest;
+
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.contracts.ManagerCustomer;
+import org.apache.fineract.data.local.database.helpers.DatabaseHelperCustomer;
+import org.apache.fineract.data.models.customer.CustomerPage;
+
+import java.util.concurrent.TimeUnit;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import io.reactivex.observers.DisposableObserver;
+import io.reactivex.schedulers.Schedulers;
+
+@Singleton
+public class StartSyncJob extends Job {
+
+    public static final String TAG = "CUSTOMERS_SYNC";
+    public static final String STATUS = "status";
+    private ManagerCustomer dataManagerCustomer;
+    private DatabaseHelperCustomer dbHelper;
+
+    @Inject
+    public StartSyncJob(DataManagerCustomer dataManagerCustomer, 
DatabaseHelperCustomer
+            dbHelper) {
+        this.dataManagerCustomer = dataManagerCustomer;
+        this.dbHelper = dbHelper;
+    }
+
+    @SuppressLint("CheckResult")
+    @NonNull
+    @Override
+    protected Result onRunJob(@NonNull Params params) {
+        updateStatus(JobStatus.STARTED);
+        dataManagerCustomer.fetchCustomers(0, 50)
+                .subscribeOn(Schedulers.io())
+                .subscribeWith(new DisposableObserver<CustomerPage>() {
+                    @Override
+                    public void onNext(CustomerPage customerPage) {
+                        dbHelper.saveCustomers(customerPage);
+                        updateStatus(JobStatus.ENDED);
+                        //starting other jobs once it finishes the StartSyncJob
+                        StartSyncJob.schedulePeriodic();
+                        CreationUpdationCustomerJob.schedulePeriodic();
+                    }
+
+                    @Override
+                    public void onError(Throwable e) {
+
+                    }
+
+                    @Override
+                    public void onComplete() {
+
+                    }
+                });
+
+        return Result.SUCCESS;
+    }
+
+    private void updateStatus(JobStatus status) {
+        Intent intent = new Intent("org.apache.fineract.JobsReceiver");
+        intent.putExtra(STATUS, status);
+        getContext().sendBroadcast(intent);
+    }
+
+    public static void schedulePeriodic() {
+        new JobRequest.Builder(StartSyncJob.TAG)
+                .setPeriodic(TimeUnit.DAYS.toMillis(1),
+                        TimeUnit.MINUTES.toMillis(10))
+                .setUpdateCurrent(true)
+                .build()
+                .schedule();
+    }
+
+    public static void scheduleItNow() {
+        new JobRequest.Builder(StartSyncJob.TAG)
+                .startNow()
+                .build()
+                .schedule();
+    }
+
+    public enum JobStatus {
+        STARTED,
+        ENDED
+    }
+}
diff --git 
a/app/src/main/java/org/apache/fineract/ui/adapters/BeneficiaryAutoCompleteAdapter.java
 
b/app/src/main/java/org/apache/fineract/ui/adapters/BeneficiaryAutoCompleteAdapter.java
index 521c917..5b82b2b 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/adapters/BeneficiaryAutoCompleteAdapter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/adapters/BeneficiaryAutoCompleteAdapter.java
@@ -11,7 +11,7 @@ import android.widget.Filterable;
 import android.widget.TextView;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
 import org.apache.fineract.data.models.customer.Customer;
 import org.apache.fineract.data.models.customer.CustomerPage;
 import org.apache.fineract.injection.ApplicationContext;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/adapters/CustomerAdapter.java 
b/app/src/main/java/org/apache/fineract/ui/adapters/CustomerAdapter.java
index 772f313..33a6383 100644
--- a/app/src/main/java/org/apache/fineract/ui/adapters/CustomerAdapter.java
+++ b/app/src/main/java/org/apache/fineract/ui/adapters/CustomerAdapter.java
@@ -67,7 +67,12 @@ public class CustomerAdapter extends 
RecyclerView.Adapter<CustomerAdapter.ViewHo
                 customer.getIdentifier()), holder.ivCustomerImage,
                 R.drawable.ic_account_circle_black_24dp);
 
-        StatusUtils.setCustomerStatus(customer.getCurrentState(), 
holder.ivStausIndicator, context);
+        if (customer.getCurrentState() != null) {
+            StatusUtils.setCustomerStatus(customer.getCurrentState(), 
holder.ivStausIndicator,
+                    context);
+        } else {
+            holder.ivStausIndicator.setVisibility(View.GONE);
+        }
     }
 
     @Override
@@ -115,12 +120,16 @@ public class CustomerAdapter extends 
RecyclerView.Adapter<CustomerAdapter.ViewHo
 
         @Override
         public void onClick(View v) {
-            onItemClickListener.onItemClick(v, getAdapterPosition());
+            if (onItemClickListener != null) {
+                onItemClickListener.onItemClick(v, getAdapterPosition());
+            }
         }
 
         @Override
         public boolean onLongClick(View v) {
-            onItemClickListener.onItemLongPress(v, getAdapterPosition());
+            if (onItemClickListener != null) {
+                onItemClickListener.onItemLongPress(v, getAdapterPosition());
+            }
             return true;
         }
     }
diff --git 
a/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadContract.java 
b/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadContract.java
new file mode 100644
index 0000000..3e4c3fc
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadContract.java
@@ -0,0 +1,22 @@
+package org.apache.fineract.ui.offline;
+
+import org.apache.fineract.data.models.customer.Customer;
+import org.apache.fineract.ui.base.MvpView;
+
+import java.util.List;
+
+public interface CustomerPayloadContract {
+    interface View extends MvpView {
+
+        void showCustomers(List<Customer> customers);
+
+        void showEmptyCustomers();
+
+    }
+
+    interface Presenter {
+
+        void fetchCustomers();
+
+    }
+}
diff --git 
a/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadFragment.java 
b/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadFragment.java
new file mode 100644
index 0000000..77adaf4
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadFragment.java
@@ -0,0 +1,95 @@
+package org.apache.fineract.ui.offline;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.github.therajanmaurya.sweeterror.SweetUIErrorHandler;
+
+import org.apache.fineract.R;
+import org.apache.fineract.data.models.customer.Customer;
+import org.apache.fineract.ui.adapters.CustomerAdapter;
+import org.apache.fineract.ui.base.FineractBaseActivity;
+import org.apache.fineract.ui.base.FineractBaseFragment;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+public class CustomerPayloadFragment extends FineractBaseFragment implements
+        CustomerPayloadContract.View{
+
+    public static CustomerPayloadFragment newInstance() {
+        CustomerPayloadFragment fragment = new CustomerPayloadFragment();
+        Bundle args = new Bundle();
+        fragment.setArguments(args);
+        return fragment;
+    }
+    @BindView(R.id.rv_customers)
+    RecyclerView rvCustomers;
+
+    @BindView(R.id.swipe_container)
+    SwipeRefreshLayout swipeRefreshLayout;
+
+    @BindView(R.id.layout_error)
+    View layoutError;
+
+    @Inject
+    CustomerAdapter customerAdapter;
+
+    @Inject
+    CustomerPayloadPresenter customerPayloadPresenter;
+
+    private View rootView;
+    private SweetUIErrorHandler sweetUIErrorHandler;
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
ViewGroup container,
+                             @Nullable Bundle savedInstanceState) {
+        rootView = inflater.inflate(R.layout.fragment_customer_payload, 
container, false);
+        ((FineractBaseActivity) 
getActivity()).getActivityComponent().inject(this);
+        ButterKnife.bind(this, rootView);
+        sweetUIErrorHandler = new SweetUIErrorHandler(getActivity(), rootView);
+
+        LinearLayoutManager layoutManager = new 
LinearLayoutManager(getActivity());
+        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
+        rvCustomers.setLayoutManager(layoutManager);
+        rvCustomers.setHasFixedSize(true);
+        rvCustomers.setAdapter(customerAdapter);
+
+        customerPayloadPresenter.attachView(this);
+        customerPayloadPresenter.fetchCustomers();
+        return rootView;
+    }
+
+    @Override
+    public void showCustomers(List<Customer> customers) {
+        customerAdapter.setCustomers(customers);
+    }
+
+    @Override
+    public void showEmptyCustomers() {
+        
sweetUIErrorHandler.showSweetCustomErrorUI(getString(R.string.no_customer_sync),
+                R.drawable.ic_error_black_24dp, swipeRefreshLayout, 
layoutError);
+    }
+
+    @Override
+    public void showNoInternetConnection() {
+
+    }
+
+    @Override
+    public void showError(String message) {
+
+    }
+}
diff --git 
a/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadPresenter.java
new file mode 100644
index 0000000..c0f7bf7
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadPresenter.java
@@ -0,0 +1,70 @@
+package org.apache.fineract.ui.offline;
+
+import android.content.Context;
+
+import org.apache.fineract.data.local.database.helpers.DatabaseHelperCustomer;
+import org.apache.fineract.data.models.customer.Customer;
+import org.apache.fineract.injection.ApplicationContext;
+import org.apache.fineract.ui.base.BasePresenter;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.observers.DisposableObserver;
+import io.reactivex.schedulers.Schedulers;
+
+public class CustomerPayloadPresenter extends 
BasePresenter<CustomerPayloadContract.View>
+        implements CustomerPayloadContract.Presenter {
+
+    private DatabaseHelperCustomer databaseHelperCustomer;
+    private CompositeDisposable compositeDisposable;
+
+    @Inject
+    protected CustomerPayloadPresenter(@ApplicationContext Context context,
+                                       DatabaseHelperCustomer 
databaseHelperCustomer) {
+        super(context);
+        this.databaseHelperCustomer = databaseHelperCustomer;
+        compositeDisposable = new CompositeDisposable();
+    }
+
+    @Override
+    public void fetchCustomers() {
+        compositeDisposable.add(databaseHelperCustomer.fetchCustomerPayload()
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribeWith(new DisposableObserver<List<Customer>>() {
+                    @Override
+                    public void onNext(List<Customer> customers) {
+                        if (customers.size() > 0) {
+                            getMvpView().showCustomers(customers);
+                        } else {
+                            getMvpView().showEmptyCustomers();
+                        }
+                    }
+
+                    @Override
+                    public void onError(Throwable e) {
+
+                    }
+
+                    @Override
+                    public void onComplete() {
+
+                    }
+                }));
+    }
+
+    @Override
+    public void attachView(CustomerPayloadContract.View mvpView) {
+        super.attachView(mvpView);
+    }
+
+    @Override
+    public void detachView() {
+        super.detachView();
+        compositeDisposable.dispose();
+    }
+}
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/DashboardActivity.java 
b/app/src/main/java/org/apache/fineract/ui/online/DashboardActivity.java
index 7e0e053..f053318 100644
--- a/app/src/main/java/org/apache/fineract/ui/online/DashboardActivity.java
+++ b/app/src/main/java/org/apache/fineract/ui/online/DashboardActivity.java
@@ -14,7 +14,9 @@ import android.view.View;
 
 import org.apache.fineract.R;
 import org.apache.fineract.data.local.PreferencesHelper;
+import org.apache.fineract.jobs.StartSyncJob;
 import org.apache.fineract.ui.base.FineractBaseActivity;
+import org.apache.fineract.ui.offline.CustomerPayloadFragment;
 import org.apache.fineract.ui.online.customers.customerlist.CustomersFragment;
 import org.apache.fineract.ui.online.dashboard.DashboardFragment;
 import org.apache.fineract.ui.online.launcher.LauncherActivity;
@@ -54,6 +56,11 @@ public class DashboardActivity extends FineractBaseActivity 
implements
         replaceFragment(DashboardFragment.newInstance(), false, 
R.id.container);
 
         setupNavigationBar();
+
+        if (preferencesHelper.isFirstTime()) {
+            StartSyncJob.scheduleItNow();
+            preferencesHelper.setFetching(false);
+        }
     }
 
     public void setupNavigationBar() {
@@ -99,6 +106,10 @@ public class DashboardActivity extends FineractBaseActivity 
implements
             case R.id.item_customer:
                 replaceFragment(CustomersFragment.newInstance(), true, 
R.id.container);
                 break;
+            case R.id.item_customer_payload:
+                replaceFragment(CustomerPayloadFragment.newInstance(), true,
+                        R.id.container);
+                break;
             case R.id.item_logout:
                 logout();
                 break;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/createcustomer/customeractivity/CreateCustomerPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/createcustomer/customeractivity/CreateCustomerPresenter.java
index 7b33045..251a6e1 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/createcustomer/customeractivity/CreateCustomerPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/createcustomer/customeractivity/CreateCustomerPresenter.java
@@ -3,7 +3,8 @@ package 
org.apache.fineract.ui.online.customers.createcustomer.customeractivity;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.contracts.ManagerCustomer;
+import org.apache.fineract.data.datamanager.database.DbManagerCustomer;
 import org.apache.fineract.data.models.customer.Customer;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
@@ -24,14 +25,14 @@ import io.reactivex.schedulers.Schedulers;
 public class CreateCustomerPresenter extends 
BasePresenter<CreateCustomerContract.View>
         implements CreateCustomerContract.Presenter {
 
-    private DataManagerCustomer dataManagerCustomer;
+    private ManagerCustomer dbManagerCustomer;
     private final CompositeDisposable compositeDisposable;
 
     @Inject
     public CreateCustomerPresenter(@ApplicationContext Context context,
-            DataManagerCustomer dataManagerCustomer) {
+            DbManagerCustomer dataManagerCustomer) {
         super(context);
-        this.dataManagerCustomer = dataManagerCustomer;
+        this.dbManagerCustomer = dataManagerCustomer;
         compositeDisposable = new CompositeDisposable();
     }
 
@@ -39,7 +40,7 @@ public class CreateCustomerPresenter extends 
BasePresenter<CreateCustomerContrac
     public void createCustomer(final Customer customer) {
         checkViewAttached();
         getMvpView().showProgressbar();
-        compositeDisposable.add(dataManagerCustomer.createCustomer(customer)
+        compositeDisposable.add(dbManagerCustomer.createCustomer(customer)
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribeWith(new DisposableCompletableObserver() {
@@ -64,7 +65,7 @@ public class CreateCustomerPresenter extends 
BasePresenter<CreateCustomerContrac
     public void updateCustomer(String customerIdentifier, Customer customer) {
         checkViewAttached();
         getMvpView().showProgressbar();
-        
compositeDisposable.add(dataManagerCustomer.updateCustomer(customerIdentifier, 
customer)
+        
compositeDisposable.add(dbManagerCustomer.updateCustomer(customerIdentifier, 
customer)
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribeWith(new DisposableCompletableObserver() {
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/createcustomer/formcustomeraddress/FormCustomerAddressPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/createcustomer/formcustomeraddress/FormCustomerAddressPresenter.java
index 0ef358a..cc2cee8 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/createcustomer/formcustomeraddress/FormCustomerAddressPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/createcustomer/formcustomeraddress/FormCustomerAddressPresenter.java
@@ -5,7 +5,7 @@ import android.content.Context;
 import com.google.gson.Gson;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerAnonymous;
+import org.apache.fineract.data.datamanager.api.DataManagerAnonymous;
 import org.apache.fineract.data.models.customer.Country;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customeractivities/CustomerActivitiesPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customeractivities/CustomerActivitiesPresenter.java
index 9a0513a..90a7334 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customeractivities/CustomerActivitiesPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customeractivities/CustomerActivitiesPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.customers.customeractivities;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
 import org.apache.fineract.data.models.customer.Command;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerdetails/CustomerDetailsContract.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerdetails/CustomerDetailsContract.java
index 7da80c0..43076ee 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerdetails/CustomerDetailsContract.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerdetails/CustomerDetailsContract.java
@@ -14,7 +14,7 @@ public interface CustomerDetailsContract {
 
         void showUserInterface();
 
-        void showCustomerDetails(Customer customer);
+        void savedCustomerDataForSyncing();
 
         void showContactDetails(ContactDetail contactDetail);
 
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerdetails/CustomerDetailsFragment.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerdetails/CustomerDetailsFragment.java
index 9336e5f..97d6c9c 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerdetails/CustomerDetailsFragment.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerdetails/CustomerDetailsFragment.java
@@ -224,52 +224,8 @@ public class CustomerDetailsFragment extends 
FineractBaseFragment
     }
 
     @Override
-    public void showCustomerDetails(Customer customer) {
-        this.customer = customer;
-        clCustomerDetails.setVisibility(View.VISIBLE);
-        layoutError.setVisibility(View.GONE);
-
-        loadCustomerPortrait();
-
-        tvCurrentStatus.setText(customer.getCurrentState().name());
-        StatusUtils.setCustomerStatusIcon(customer.getCurrentState(),
-                ivCurrentStatus, getActivity());
-
-        Address address = customer.getAddress();
-        StringBuilder addressBuilder = new StringBuilder();
-        addressBuilder
-                .append(address.getStreet()).append(", ")
-                .append(address.getCity()).append(", ");
-        if (address.getPostalCode() != null) {
-            addressBuilder.append(address.getPostalCode());
-            addressBuilder.append(", ");
-        }
-        addressBuilder.append(address.getCountry());
-        tvAddress.setText(addressBuilder);
-
-        if (customer.getContactDetails().size() == 0) {
-            tvNoContactDetailsAvailable.setVisibility(View.VISIBLE);
-            tvEmail.setVisibility(View.GONE);
-            tvPhoneNo.setVisibility(View.GONE);
-            tvMobileNo.setVisibility(View.GONE);
-        } else {
-            for (ContactDetail contactDetail : customer.getContactDetails()) {
-                showContactDetails(contactDetail);
-            }
-        }
-
-        tvBirthDay.setText(customer.getDateOfBirth().getYear() + "-" +
-                customer.getDateOfBirth().getMonth() + "-" + 
customer.getDateOfBirth().getDay());
-
-        String title = customer.getGivenName() + " " + customer.getSurname();
-        String subtitle;
-        if (customer.getAssignedEmployee() == null) {
-            subtitle = getString(R.string.assigned_employee) + " " +
-                    getString(R.string.not_assigned);
-        } else {
-            subtitle = getString(R.string.assigned_employee) + " " + 
customer.getAssignedEmployee();
-        }
-        showToolbarTitleSubtitle(title, subtitle);
+    public void savedCustomerDataForSyncing() {
+        getActivity().finish();
     }
 
     @Override
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerdetails/CustomerDetailsPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerdetails/CustomerDetailsPresenter.java
index 1f1b052..82c95b1 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerdetails/CustomerDetailsPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerdetails/CustomerDetailsPresenter.java
@@ -3,7 +3,8 @@ package org.apache.fineract.ui.online.customers.customerdetails;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.contracts.ManagerCustomer;
+import org.apache.fineract.data.datamanager.database.DbManagerCustomer;
 import org.apache.fineract.data.models.customer.Customer;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
@@ -24,12 +25,12 @@ import io.reactivex.schedulers.Schedulers;
 public class CustomerDetailsPresenter extends 
BasePresenter<CustomerDetailsContract.View>
         implements CustomerDetailsContract.Presenter {
 
-    private DataManagerCustomer dataManagerCustomer;
+    private ManagerCustomer dataManagerCustomer;
     private final CompositeDisposable compositeDisposable;
 
     @Inject
     public CustomerDetailsPresenter(@ApplicationContext Context context,
-            DataManagerCustomer dataManager) {
+            DbManagerCustomer dataManager) {
         super(context);
         dataManagerCustomer = dataManager;
         compositeDisposable = new CompositeDisposable();
@@ -57,7 +58,7 @@ public class CustomerDetailsPresenter extends 
BasePresenter<CustomerDetailsContr
                     @Override
                     public void onNext(Customer customer) {
                         getMvpView().hideProgressbar();
-                        getMvpView().showCustomerDetails(customer);
+                        getMvpView().savedCustomerDataForSyncing();
                     }
 
                     @Override
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersFragment.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersFragment.java
index 6fb9592..bdff0c1 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersFragment.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersFragment.java
@@ -12,7 +12,10 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.github.therajanmaurya.sweeterror.SweetUIErrorHandler;
+
 import org.apache.fineract.R;
+import org.apache.fineract.data.local.PreferencesHelper;
 import org.apache.fineract.data.models.customer.Customer;
 import org.apache.fineract.ui.adapters.CustomerAdapter;
 import org.apache.fineract.ui.base.EndlessRecyclerViewScrollListener;
@@ -60,9 +63,13 @@ public class CustomersFragment extends FineractBaseFragment 
implements Customers
     @Inject
     CustomerAdapter customerAdapter;
 
+    @Inject
+    PreferencesHelper preferencesHelper;
+
     private List<Customer> customers;
     private Integer detailsCustomerPosition;
     private boolean isNewCustomer = false;
+    private SweetUIErrorHandler sweetUIErrorHandler;
 
     public static CustomersFragment newInstance() {
         CustomersFragment fragment = new CustomersFragment();
@@ -88,9 +95,13 @@ public class CustomersFragment extends FineractBaseFragment 
implements Customers
         setToolbarTitle(getString(R.string.customers));
 
         showUserInterface();
-
-        customerPresenter.fetchCustomers(0, false);
-
+        sweetUIErrorHandler = new SweetUIErrorHandler(getActivity(), rootView);
+        if (preferencesHelper.isFetching()) {
+            
sweetUIErrorHandler.showSweetCustomErrorUI(getString(R.string.syncing_please_wait),
+                    R.drawable.ic_error_black_24dp, swipeRefreshLayout, 
layoutError);
+        } else {
+            customerPresenter.fetchCustomers(0, false);
+        }
         return rootView;
     }
 
@@ -125,12 +136,6 @@ public class CustomersFragment extends 
FineractBaseFragment implements Customers
                 .getResources().getIntArray(R.array.swipeRefreshColors));
         swipeRefreshLayout.setOnRefreshListener(this);
 
-        rvCustomers.addOnScrollListener(new 
EndlessRecyclerViewScrollListener(layoutManager) {
-            @Override
-            public void onLoadMore(int page, int totalItemsCount) {
-                customerPresenter.fetchCustomers(page, true);
-            }
-        });
     }
 
     @OnClick(R.id.fab_add_customer)
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersPresenter.java
index 720660e..3fa1415 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersPresenter.java
@@ -1,9 +1,11 @@
 package org.apache.fineract.ui.online.customers.customerlist;
 
 import android.content.Context;
+import android.util.Log;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.contracts.ManagerCustomer;
+import org.apache.fineract.data.datamanager.database.DbManagerCustomer;
 import org.apache.fineract.data.models.customer.Customer;
 import org.apache.fineract.data.models.customer.CustomerPage;
 import org.apache.fineract.injection.ApplicationContext;
@@ -27,7 +29,7 @@ import io.reactivex.schedulers.Schedulers;
 public class CustomersPresenter extends BasePresenter<CustomersContract.View>
         implements CustomersContract.Presenter {
 
-    private final DataManagerCustomer dataManagerCustomer;
+    private final ManagerCustomer dataManagerCustomer;
     private CompositeDisposable compositeDisposable;
 
     private int customerListSize = 50;
@@ -35,7 +37,7 @@ public class CustomersPresenter extends 
BasePresenter<CustomersContract.View>
 
     @Inject
     public CustomersPresenter(@ApplicationContext Context context,
-            DataManagerCustomer dataManager) {
+            DbManagerCustomer dataManager) {
         super(context);
         dataManagerCustomer = dataManager;
         compositeDisposable = new CompositeDisposable();
@@ -70,7 +72,7 @@ public class CustomersPresenter extends 
BasePresenter<CustomersContract.View>
                     public void onNext(CustomerPage customerPage) {
                         getMvpView().hideProgressbar();
 
-                        if (!loadmore && customerPage.getTotalElements() == 0) 
{
+                        if (!loadmore && customerPage.getTotalPages() == 0) {
                             getMvpView().showEmptyCustomers(
                                     
context.getString(R.string.empty_customer_list));
                         } else if (loadmore && 
customerPage.getCustomers().size() == 0) {
@@ -83,6 +85,7 @@ public class CustomersPresenter extends 
BasePresenter<CustomersContract.View>
 
                     @Override
                     public void onError(Throwable throwable) {
+                        Log.d("mytag", throwable.toString());
                         getMvpView().hideProgressbar();
                         if (loadmore) {
                             getMvpView().showMessage(
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerprofile/editcustomerprofilebottomsheet/EditCustomerProfilePresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerprofile/editcustomerprofilebottomsheet/EditCustomerProfilePresenter.java
index 056b64f..2d424da 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerprofile/editcustomerprofilebottomsheet/EditCustomerProfilePresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerprofile/editcustomerprofilebottomsheet/EditCustomerProfilePresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.customers.customerprofile.editcustomerprof
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
 import org.apache.fineract.ui.base.BasePresenter;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customertasks/CustomerTasksBottomSheetPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customertasks/CustomerTasksBottomSheetPresenter.java
index 526ecc9..5d3f6a7 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customertasks/CustomerTasksBottomSheetPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customertasks/CustomerTasksBottomSheetPresenter.java
@@ -3,7 +3,7 @@ package org.apache.fineract.ui.online.customers.customertasks;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
 import org.apache.fineract.data.models.customer.Command;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/createdepositaccount/createdepositactivity/CreateDepositPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/createdepositaccount/createdepositactivity/CreateDepositPresenter.java
index 95c796f..e695353 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/createdepositaccount/createdepositactivity/CreateDepositPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/createdepositaccount/createdepositactivity/CreateDepositPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.depositaccounts.createdepositaccount.creat
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerDeposit;
+import org.apache.fineract.data.datamanager.api.DataManagerDeposit;
 import org.apache.fineract.data.models.deposit.DepositAccount;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/createdepositaccount/formdepositassignproduct/FormDepositAssignProductPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/createdepositaccount/formdepositassignproduct/FormDepositAssignProductPresenter.java
index 2890234..7976eaf 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/createdepositaccount/formdepositassignproduct/FormDepositAssignProductPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/createdepositaccount/formdepositassignproduct/FormDepositAssignProductPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.depositaccounts.createdepositaccount.formd
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerDeposit;
+import org.apache.fineract.data.datamanager.api.DataManagerDeposit;
 import org.apache.fineract.data.models.deposit.ProductDefinition;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/depositaccountdetails/DepositAccountDetailsPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/depositaccountdetails/DepositAccountDetailsPresenter.java
index d1025b9..eee84c7 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/depositaccountdetails/DepositAccountDetailsPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/depositaccountdetails/DepositAccountDetailsPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.depositaccounts.depositaccountdetails;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerDeposit;
+import org.apache.fineract.data.datamanager.api.DataManagerDeposit;
 import org.apache.fineract.data.models.deposit.DepositAccount;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/depositaccountslist/DepositAccountsPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/depositaccountslist/DepositAccountsPresenter.java
index a117c5a..181d786 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/depositaccountslist/DepositAccountsPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/depositaccounts/depositaccountslist/DepositAccountsPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.depositaccounts.depositaccountslist;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerDeposit;
+import org.apache.fineract.data.datamanager.api.DataManagerDeposit;
 import org.apache.fineract.data.models.deposit.DepositAccount;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/identification/createidentification/identificationactivity/CreateIdentificationPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/identification/createidentification/identificationactivity/CreateIdentificationPresenter.java
index bcb86f5..d9743f0 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/identification/createidentification/identificationactivity/CreateIdentificationPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/identification/createidentification/identificationactivity/CreateIdentificationPresenter.java
@@ -4,7 +4,7 @@ package 
org.apache.fineract.ui.online.identification.createidentification.identi
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
 import org.apache.fineract.data.models.customer.identification.Identification;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/identification/identificationdetails/IdentificationDetailsPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/identification/identificationdetails/IdentificationDetailsPresenter.java
index d8dacbe..87fb0bc 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/identification/identificationdetails/IdentificationDetailsPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/identification/identificationdetails/IdentificationDetailsPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.identification.identificationdetails;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
 import org.apache.fineract.data.models.customer.identification.ScanCard;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/identification/identificationlist/IdentificationsPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/identification/identificationlist/IdentificationsPresenter.java
index dcee0a5..ed7d8e2 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/identification/identificationlist/IdentificationsPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/identification/identificationlist/IdentificationsPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.identification.identificationlist;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
 import org.apache.fineract.data.models.customer.identification.Identification;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/identification/uploadidentificationscan/UploadIdentificationCardPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/identification/uploadidentificationscan/UploadIdentificationCardPresenter.java
index 93b4157..5614f11 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/identification/uploadidentificationscan/UploadIdentificationCardPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/identification/uploadidentificationscan/UploadIdentificationCardPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.identification.uploadidentificationscan;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
 import org.apache.fineract.ui.base.BasePresenter;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/launcher/LauncherPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/launcher/LauncherPresenter.java
index c473b0e..72582f8 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/launcher/LauncherPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/launcher/LauncherPresenter.java
@@ -2,7 +2,7 @@ package org.apache.fineract.ui.online.launcher;
 
 import android.content.Context;
 
-import org.apache.fineract.data.datamanager.DataManagerAuth;
+import org.apache.fineract.data.datamanager.api.DataManagerAuth;
 import org.apache.fineract.data.models.Authentication;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanaccountlist/LoanAccountsPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanaccountlist/LoanAccountsPresenter.java
index 64addd0..7135ff7 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanaccountlist/LoanAccountsPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanaccountlist/LoanAccountsPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.loanaccounts.loanaccountlist;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerLoans;
+import org.apache.fineract.data.datamanager.api.DataManagerLoans;
 import org.apache.fineract.data.models.loan.LoanAccount;
 import org.apache.fineract.data.models.loan.LoanAccountPage;
 import org.apache.fineract.exceptions.NoConnectivityException;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanapplication/loanactivity/LoanApplicationPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanapplication/loanactivity/LoanApplicationPresenter.java
index b4e7bac..8bcf87b 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanapplication/loanactivity/LoanApplicationPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanapplication/loanactivity/LoanApplicationPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.loanaccounts.loanapplication.loanactivity;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerLoans;
+import org.apache.fineract.data.datamanager.api.DataManagerLoans;
 import org.apache.fineract.data.models.loan.LoanAccount;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanapplication/loancosigner/LoanCoSignerPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanapplication/loancosigner/LoanCoSignerPresenter.java
index 7d0ded2..ee34cd2 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanapplication/loancosigner/LoanCoSignerPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanapplication/loancosigner/LoanCoSignerPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.loanaccounts.loanapplication.loancosigner;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerCustomer;
+import org.apache.fineract.data.datamanager.api.DataManagerCustomer;
 import org.apache.fineract.data.models.customer.Customer;
 import org.apache.fineract.data.models.customer.CustomerPage;
 import org.apache.fineract.injection.ApplicationContext;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanapplication/loandetails/LoanDetailsPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanapplication/loandetails/LoanDetailsPresenter.java
index f293c20..67fc9ea 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanapplication/loandetails/LoanDetailsPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loanapplication/loandetails/LoanDetailsPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.loanaccounts.loanapplication.loandetails;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerLoans;
+import org.apache.fineract.data.datamanager.api.DataManagerLoans;
 import org.apache.fineract.data.models.product.Product;
 import org.apache.fineract.data.models.product.ProductPage;
 import org.apache.fineract.injection.ApplicationContext;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loandetails/CustomerLoanDetailsPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loandetails/CustomerLoanDetailsPresenter.java
index a24d421..c577c7f 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loandetails/CustomerLoanDetailsPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/loandetails/CustomerLoanDetailsPresenter.java
@@ -3,7 +3,7 @@ package org.apache.fineract.ui.online.loanaccounts.loandetails;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerLoans;
+import org.apache.fineract.data.datamanager.api.DataManagerLoans;
 import org.apache.fineract.data.models.loan.LoanAccount;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/plannedpayment/PlannedPaymentPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/plannedpayment/PlannedPaymentPresenter.java
index 1e7c2e9..d8e4a82 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/plannedpayment/PlannedPaymentPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/loanaccounts/plannedpayment/PlannedPaymentPresenter.java
@@ -3,7 +3,7 @@ package 
org.apache.fineract.ui.online.loanaccounts.plannedpayment;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerIndividualLending;
+import org.apache.fineract.data.datamanager.api.DataManagerIndividualLending;
 import org.apache.fineract.data.models.payment.PlannedPayment;
 import org.apache.fineract.data.models.payment.PlannedPaymentPage;
 import org.apache.fineract.exceptions.NoConnectivityException;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/login/LoginPresenter.java 
b/app/src/main/java/org/apache/fineract/ui/online/login/LoginPresenter.java
index 5e5de54..44f1c11 100644
--- a/app/src/main/java/org/apache/fineract/ui/online/login/LoginPresenter.java
+++ b/app/src/main/java/org/apache/fineract/ui/online/login/LoginPresenter.java
@@ -6,7 +6,7 @@ import android.content.Context;
 import android.util.Log;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerAuth;
+import org.apache.fineract.data.datamanager.api.DataManagerAuth;
 import org.apache.fineract.data.models.Authentication;
 import org.apache.fineract.data.models.error.MifosError;
 import org.apache.fineract.exceptions.NoConnectivityException;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/roles/roleslist/RolesPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/roles/roleslist/RolesPresenter.java
index 7e56287..feb7591 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/roles/roleslist/RolesPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/roles/roleslist/RolesPresenter.java
@@ -3,7 +3,7 @@ package org.apache.fineract.ui.online.roles.roleslist;
 import android.content.Context;
 
 import org.apache.fineract.R;
-import org.apache.fineract.data.datamanager.DataManagerRoles;
+import org.apache.fineract.data.datamanager.api.DataManagerRoles;
 import org.apache.fineract.data.models.rolesandpermission.Role;
 import org.apache.fineract.injection.ApplicationContext;
 import org.apache.fineract.injection.ConfigPersistent;
diff --git a/app/src/main/res/layout/fragment_customer_list.xml 
b/app/src/main/res/layout/fragment_customer_list.xml
index 7ebae36..c91f325 100644
--- a/app/src/main/res/layout/fragment_customer_list.xml
+++ b/app/src/main/res/layout/fragment_customer_list.xml
@@ -20,7 +20,7 @@
     </android.support.v4.widget.SwipeRefreshLayout>
 
     <include
-        layout="@layout/layout_exception_handler"
+        layout="@layout/layout_sweet_exception_handler"
         android:id="@+id/layout_error"
         android:visibility="gone"/>
 
diff --git a/app/src/main/res/layout/fragment_customer_list.xml 
b/app/src/main/res/layout/fragment_customer_payload.xml
similarity index 55%
copy from app/src/main/res/layout/fragment_customer_list.xml
copy to app/src/main/res/layout/fragment_customer_payload.xml
index 7ebae36..57a0e48 100644
--- a/app/src/main/res/layout/fragment_customer_list.xml
+++ b/app/src/main/res/layout/fragment_customer_payload.xml
@@ -1,7 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
+
 <android.support.design.widget.CoordinatorLayout
     xmlns:android="http://schemas.android.com/apk/res/android";
-    xmlns:app="http://schemas.android.com/apk/res-auto";
     android:layout_height="match_parent"
     android:layout_width="match_parent">
 
@@ -20,19 +19,9 @@
     </android.support.v4.widget.SwipeRefreshLayout>
 
     <include
-        layout="@layout/layout_exception_handler"
+        layout="@layout/layout_sweet_exception_handler"
         android:id="@+id/layout_error"
         android:visibility="gone"/>
 
-    <android.support.design.widget.FloatingActionButton
-        android:clickable="true"
-        android:focusable="true"
-        android:id="@+id/fab_add_customer"
-        android:layout_gravity="bottom|end"
-        android:layout_height="wrap_content"
-        android:layout_margin="@dimen/layout_padding_16dp"
-        android:layout_width="wrap_content"
-        app:layout_behavior="org.apache.fineract.utils.ScrollFabBehavior"
-        app:srcCompat="@drawable/ic_add_black_24dp"/>
 
 </android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_navigation_drawer.xml 
b/app/src/main/res/menu/menu_navigation_drawer.xml
index ac89428..0e289df 100644
--- a/app/src/main/res/menu/menu_navigation_drawer.xml
+++ b/app/src/main/res/menu/menu_navigation_drawer.xml
@@ -23,6 +23,12 @@
             android:id="@+id/item_customer"
             android:title="@string/customer"/>
 
+        <item
+            android:checked="true"
+            android:icon="@drawable/ic_customer_black_24dp"
+            android:id="@+id/item_customer_payload"
+            android:title="Customer Payloads"/>
+
     </group>
 
     <group
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index d4c6784..7b01082 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -67,6 +67,8 @@
     <string name="payment_cycle_week">Repay every %1$d %2$s on %3$s</string>
     <string name="payment_cycle_year_day">Repay every %1$d %2$s on the %3$s 
day in %4$s</string>
     <string name="payment_cycle_year_day_week">Repay every %1$d %2$s on the 
%3$s %4$s in %5$s</string>
+    <string name="syncing_please_wait">Please wait while we fetch data from 
server, will update you once its done</string>
+    <string name="no_customer_sync">No Customers to Sync</string>
 
     <string name="account">Account</string>
     <string name="balance">Balance</string>
@@ -444,4 +446,7 @@
         <item>29.</item>
         <item>30.</item>
     </string-array>
+
+    <!-- TODO: Remove or change this placeholder text -->
+    <string name="hello_blank_fragment">Hello blank fragment</string>
 </resources>
diff --git a/build.gradle b/build.gradle
index e306801..6c67ab7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -21,6 +21,7 @@ allprojects {
         jcenter()
         google()
         maven { url 'https://maven.fabric.io/public' }
+        maven { url "https://www.jitpack.io"; }
     }
 }
 
@@ -30,7 +31,7 @@ task clean(type: Delete) {
 
 ext {
     // Sdk and tools
-    minSdkVersion = 14
+    minSdkVersion = 15
     targetSdkVersion = 26
     compileSdkVersion = 26
     buildToolsVersion = '26.0.2'
@@ -46,6 +47,12 @@ ext {
     rxjavaVersion = '2.0.1'
     rxandroidVersion = '2.0.1'
 
+    //android-job
+    androidJobVersion = '1.2.5'
+
+    //db-flow
+    dbflowVersion = "4.2.4"
+
     junitVersion = '4.12'
     mockitoVersion = '2.6.2'
     powerMockito = '1.6.2'
diff --git a/gradle.properties b/gradle.properties
index d8895df..37b8455 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -21,5 +21,5 @@ org.gradle.jvmargs=-XX:MaxPermSize=2048m 
-XX:+CMSClassUnloadingEnabled -XX:+Heap
 # This option should only be used with decoupled projects. More details, visit
 org.gradle.parallel=true
 # When set to true the Gradle daemon is used to run the build. For local 
developer builds this is our favorite property.
-# The developer environment is optimized for speed and feedback so we nearly 
always run Gradle jobs with the daemon.
+# The developer environment is optimized for speed and feedback so we nearly 
always run Gradle jobProvider with the daemon.
 org.gradle.daemon=true
\ No newline at end of file

Reply via email to