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