diff --git a/.gitmodules b/.gitmodules index aa04fdc825..8d5201a763 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,6 +5,9 @@ [submodule "EyeSeeTea-sdk"] path = EyeSeeTea-sdk url = https://github.com/EyeSeeTea/sdk.git +[submodule "DBFlow"] + path = DBFlow + url = https://github.com/EyeSeeTea/DBFlow.git [submodule "bugshaker-android"] path = bugshaker-android url = https://github.com/EyeSeeTea/bugshaker-android.git diff --git a/DBFlow b/DBFlow new file mode 160000 index 0000000000..6f11f46475 --- /dev/null +++ b/DBFlow @@ -0,0 +1 @@ +Subproject commit 6f11f464753ee2711628fb4cb677a8558173332d diff --git a/app/build.gradle b/app/build.gradle index bb3c11f431..cd452e3e81 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -75,21 +75,13 @@ android { } buildTypes { - testBuildType "staging" - release { - buildConfigField "boolean", "databaseInMemory", "false" minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { - buildConfigField "boolean", "databaseInMemory", "false" debuggable true } - staging { - initWith(buildTypes.debug) - buildConfigField "boolean", "databaseInMemory", "true" - } } //TODO This config is related to a known issue: http://stackoverflow.com/questions/20827885/android-studio-0-4-duplicate-files-copied-in-apk-meta-inf-license-txt @@ -380,7 +372,8 @@ dependencies { compile "com.squareup:javapoet:${libs.javapoetVersion}" //DBFlow - apt "com.github.Raizlabs.DBFlow:dbflow-processor:${libs.dbFlowVersion}" + apt project(":dbflow-processor") + compile "com.github.Raizlabs.DBFlow:dbflow:${libs.dbFlowVersion}" compile "com.github.Raizlabs.DBFlow:dbflow-core:${libs.dbFlowVersion}" compile "com.github.Raizlabs.DBFlow:dbflow-sqlcipher:${libs.dbFlowVersion}" diff --git a/app/src/androidTest/java/org/eyeseetea/malariacare/DatabaseHolderProviderStrategy.java b/app/src/androidTest/java/org/eyeseetea/malariacare/DatabaseHolderProviderStrategy.java new file mode 100644 index 0000000000..89fa88abb5 --- /dev/null +++ b/app/src/androidTest/java/org/eyeseetea/malariacare/DatabaseHolderProviderStrategy.java @@ -0,0 +1,13 @@ +package org.eyeseetea.malariacare; + + +import com.raizlabs.android.dbflow.config.DatabaseHolder; +import com.raizlabs.android.dbflow.config.EyeSeeTeaInMemoryGeneratedDatabaseHolder; + +public class DatabaseHolderProviderStrategy implements + EyeSeeTeaApplication.IDatabaseHolderProviderStrategy { + @Override + public Class provide() { + return EyeSeeTeaInMemoryGeneratedDatabaseHolder.class; + } +} diff --git a/app/src/androidTest/java/org/eyeseetea/malariacare/InMemoryDBFlowDataBase.java b/app/src/androidTest/java/org/eyeseetea/malariacare/InMemoryDBFlowDataBase.java new file mode 100644 index 0000000000..3250eaec67 --- /dev/null +++ b/app/src/androidTest/java/org/eyeseetea/malariacare/InMemoryDBFlowDataBase.java @@ -0,0 +1,51 @@ +package org.eyeseetea.malariacare; + +import android.support.test.InstrumentationRegistry; + +import com.raizlabs.android.dbflow.config.FlowConfig; +import com.raizlabs.android.dbflow.config.FlowManager; + +import org.eyeseetea.malariacare.data.database.AppDatabase; +import org.junit.rules.ExternalResource; + +/*This test Rules creates a new clean instance of the DBFlow database per each @Test method + that you have, if you change anything in database(insert,delete and update), + it will be clean up when the next @Test methods runs. + For instance, if you have the following: + + @Test + public void test1(){ + QuestionDB question1 = new QuestionDB(); + question1.save(); //After this line id_question + // It's going to be equals to 1 + } + + @Test + public void test2(){ + QuestionDB question2 = new QuestionDB(); + question2.save(); //After this line id_question + // it's still equals to 1 + // The InMemoryDBFlowDataBase cleans up for you. + } + */ +public class InMemoryDBFlowDataBase extends ExternalResource { + + public InMemoryDBFlowDataBase(){ + before(); + } + + @Override + protected void before() { + FlowManager.destroy(); + initDBFlowDB(); + } + + private void initDBFlowDB() { + DatabaseHolderProviderStrategy databaseStrategy = new DatabaseHolderProviderStrategy(); + FlowConfig flowConfig = new FlowConfig + .Builder(InstrumentationRegistry.getContext()) + .addDatabaseHolder(databaseStrategy.provide()) + .build(); + FlowManager.init(flowConfig); + } +} diff --git a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/BaseActivityShould.java b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/BaseActivityShould.java index b08d9e71d3..4804ff14c9 100644 --- a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/BaseActivityShould.java +++ b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/BaseActivityShould.java @@ -3,6 +3,8 @@ import static android.content.Context.ACTIVITY_SERVICE; import static android.support.test.InstrumentationRegistry.getInstrumentation; +import static android.support.test.InstrumentationRegistry.getContext; +import static android.support.test.InstrumentationRegistry.getInstrumentation; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -13,6 +15,7 @@ import android.content.SharedPreferences; import android.os.Build; import android.preference.PreferenceManager; +import android.support.test.InstrumentationRegistry; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; @@ -33,7 +36,7 @@ import java.util.List; -public class BaseActivityShould { +public class BaseActivityShould extends CommonActivityTestCode{ private Credentials previousOrganisationCredentials; private Credentials previousCredentials; @@ -42,7 +45,6 @@ public class BaseActivityShould { private UserAccount previousUserAccount; private final Object syncObject = new Object(); - @Test public void onLoginIntentShowLoginActivity() throws InterruptedException { synchronized (syncObject) { @@ -66,12 +68,15 @@ private void isLoginActivityShowing() { ComponentName componentInfo = taskInfo.get(0).topActivity; String activityName = componentInfo.getClassName(); - assertThat(activityName, is(LoginActivity.class.getName())); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + assertThat(activityName, is(LoginActivity.class.getName())); + } else { + assertThat(activityName, is(LoginActivity.class.getName())); + } } @Before public void cleanUp() { - grantPermission(); savePreviousPreferences(); saveTestCredentialsAndProgram(); Intent intent = new Intent(PreferencesState.getInstance().getContext(), @@ -91,25 +96,6 @@ public void cleanUp() { @After public void tearDown() { restorePreferences(); - - } - - public void grantPermission(){ - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - getInstrumentation().getUiAutomation().executeShellCommand( - "pm grant " + PreferencesState.getInstance().getContext().getPackageName() - + " android.permission.READ_PHONE_STATE"); - synchronized (syncObject) { - try { - syncObject.wait(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - getInstrumentation().getUiAutomation().executeShellCommand( - "pm grant " + PreferencesState.getInstance().getContext().getPackageName() - + " android.permission.ACCESS_FINE_LOCATION"); - } } @@ -139,15 +125,18 @@ private void savePreviousPreferences() { } private void saveTestCredentialsAndProgram() { - Context context = PreferencesState.getInstance().getContext(); + //used to avoid override the real app preferences + Context context = InstrumentationRegistry.getContext(); + //real app context, it is necessary to use getString() method + Context realAppContext = InstrumentationRegistry.getTargetContext(); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences( context); SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(context.getString(R.string.web_service_url), - context.getString(R.string.ws_base_url)); + editor.putString(realAppContext.getString(R.string.web_service_url), + realAppContext.getString(R.string.ws_base_url)); editor.commit(); - Credentials credentials = new Credentials(context.getString(R.string.ws_base_url), + Credentials credentials = new Credentials(realAppContext.getString(R.string.ws_base_url), "test", "test"); CredentialsLocalDataSource credentialsLocalDataSource = new CredentialsLocalDataSource(); credentialsLocalDataSource.saveLastValidCredentials(credentials); diff --git a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/CommonActivityTestCode.java b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/CommonActivityTestCode.java new file mode 100644 index 0000000000..a1048440d5 --- /dev/null +++ b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/CommonActivityTestCode.java @@ -0,0 +1,30 @@ +package org.eyeseetea.malariacare; + +import android.os.Build; + +import org.junit.Before; + +import static android.support.test.InstrumentationRegistry.getInstrumentation; +import static android.support.test.InstrumentationRegistry.getTargetContext; + +class CommonActivityTestCode { + + @Before + public void grantPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + getInstrumentation().getUiAutomation().executeShellCommand( + "pm grant " + getTargetContext().getPackageName() + + " android.permission.READ_PHONE_STATE"); + getInstrumentation().getUiAutomation().executeShellCommand( + "pm grant " + getTargetContext().getPackageName() + + " android.permission.ACCESS_FINE_LOCATION"); + getInstrumentation().getUiAutomation().executeShellCommand( + "pm grant " + getTargetContext().getPackageName() + + " android.permission.INTERNET"); + getInstrumentation().getUiAutomation().executeShellCommand( + "pm grant " + getTargetContext().getPackageName() + + " android.permission.ACCESS_NETWORK_STATE"); + } + } + +} diff --git a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/MetadataConfigurationDBImporterShould.java b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/MetadataConfigurationDBImporterShould.java index 26bc879744..b9632a8b15 100644 --- a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/MetadataConfigurationDBImporterShould.java +++ b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/MetadataConfigurationDBImporterShould.java @@ -3,12 +3,9 @@ import static junit.framework.Assert.assertEquals; -import static org.eyeseetea.malariacare.configurationimporter - .ConstantsMetadataConfigurationImporterTest.COUNTRIES_VERSION; -import static org.eyeseetea.malariacare.configurationimporter - .ConstantsMetadataConfigurationImporterTest.COUNTRIES_VERSION_V2; -import static org.eyeseetea.malariacare.configurationimporter - .ConstantsMetadataConfigurationImporterTest.TZ_CONFIG_ANDROID_2_0_JSON; +import static org.eyeseetea.malariacare.configurationimporter.ConstantsMetadataConfigurationImporterTest.COUNTRIES_VERSION; +import static org.eyeseetea.malariacare.configurationimporter.ConstantsMetadataConfigurationImporterTest.COUNTRIES_VERSION_V2; +import static org.eyeseetea.malariacare.configurationimporter.ConstantsMetadataConfigurationImporterTest.TZ_CONFIG_ANDROID_2_0_JSON; import static org.junit.Assert.assertTrue; @@ -23,18 +20,16 @@ import org.eyeseetea.malariacare.data.database.model.QuestionOptionDB; import org.eyeseetea.malariacare.data.database.utils.PreferencesState; import org.eyeseetea.malariacare.data.database.utils.Session; -import org.eyeseetea.malariacare.data.database.utils.populatedb.PopulateDB; import org.eyeseetea.malariacare.data.server.CustomMockServer; import org.eyeseetea.malariacare.data.sync.factory.ConverterFactory; -import org.eyeseetea.malariacare.data.sync.importer.metadata.configuration - .MetadataConfigurationApiClient; -import org.eyeseetea.malariacare.data.sync.importer.metadata.configuration - .MetadataConfigurationDBImporter; +import org.eyeseetea.malariacare.data.sync.importer.metadata.configuration.MetadataConfigurationApiClient; +import org.eyeseetea.malariacare.data.sync.importer.metadata.configuration.MetadataConfigurationDBImporter; import org.eyeseetea.malariacare.domain.entity.Credentials; import org.eyeseetea.malariacare.domain.entity.Program; import org.eyeseetea.malariacare.network.retrofit.BasicAuthInterceptor; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import java.io.IOException; @@ -47,9 +42,11 @@ public class MetadataConfigurationDBImporterShould { private final Program program = new Program("T_TZ", "low6qUS2wc9"); + @Rule + public InMemoryDBFlowDataBase mInMemoryDBFlowDataBase = new InMemoryDBFlowDataBase(); + @Before public void setUp() throws Exception { - PopulateDB.wipeDataBase(); CredentialsReader credentialsReader = CredentialsReader.getInstance(); Context context = PreferencesState.getInstance().getContext(); Session.setCredentials( @@ -129,7 +126,7 @@ private void whenConfigFilesAreParsed() throws Exception { MetadataConfigurationDBImporter importer = new MetadataConfigurationDBImporter( apiClient, ConverterFactory.getQuestionConverter() ); - + importer.hasToUpdateMetadata(program); importer.importMetadata(program); } diff --git a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/RealMetadataConfigurationDBImporterShould.java b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/RealMetadataConfigurationDBImporterShould.java index 46c0469e6f..3ada5c5bd9 100644 --- a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/RealMetadataConfigurationDBImporterShould.java +++ b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/RealMetadataConfigurationDBImporterShould.java @@ -16,6 +16,7 @@ .MetadataConfigurationDataSourceFactory; import org.eyeseetea.malariacare.domain.entity.Program; import org.junit.Before; +import org.junit.Test; public class RealMetadataConfigurationDBImporterShould { @@ -29,7 +30,7 @@ public void setUp() throws Exception { MetadataConfigurationDataSourceFactory metadataConfigurationDataSourceFactory = new MetadataConfigurationDataSourceFactory( - InstrumentationRegistry.getTargetContext()); + InstrumentationRegistry.getContext()); IMetadataConfigurationDataSource apiClient = metadataConfigurationDataSourceFactory.getMetadataConfigurationDataSource(); importer = new MetadataConfigurationDBImporter( diff --git a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/SettingsActivityShould.java b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/SettingsActivityShould.java new file mode 100644 index 0000000000..31717e757a --- /dev/null +++ b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/SettingsActivityShould.java @@ -0,0 +1,74 @@ +package org.eyeseetea.malariacare; + +import static android.content.Context.ACTIVITY_SERVICE; + +import static android.support.test.InstrumentationRegistry.getContext; +import static android.support.test.InstrumentationRegistry.getInstrumentation; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +import android.app.ActivityManager; +import android.content.ComponentName; +import android.content.Intent; +import android.os.Build; +import android.support.test.InstrumentationRegistry; +import android.support.v4.content.LocalBroadcastManager; +import android.util.Log; + +import org.eyeseetea.malariacare.data.database.utils.PreferencesState; +import org.eyeseetea.malariacare.services.PushService; +import org.eyeseetea.malariacare.services.strategies.PushServiceStrategy; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +public class SettingsActivityShould extends CommonActivityTestCode{ + + private final Object syncObject = new Object(); + @Test + public void onLoginIntentShowLoginActivity() throws InterruptedException { + synchronized (syncObject) { + syncObject.wait(2000); + } + sendIntentShowLogin(); + synchronized (syncObject) { + syncObject.wait(1000); + } + isLoginActivityShowing(); + } + + private void isLoginActivityShowing() { + ActivityManager am = + (ActivityManager) PreferencesState.getInstance().getContext().getSystemService( + ACTIVITY_SERVICE); + // get the info from the currently running task + List taskInfo = am.getRunningTasks(1); + + Log.d("topActivity", BuildConfig.FLAVOR+ " " + BuildConfig.APPLICATION_ID +"CURRENT Activity ::" + taskInfo.get(0).topActivity.getClassName()); + + ComponentName componentInfo = taskInfo.get(0).topActivity; + String activityName = componentInfo.getClassName(); + assertThat(activityName, is(LoginActivity.class.getName())); + } + + @Before + public void cleanUp() { + Intent intent = new Intent(PreferencesState.getInstance().getContext(), + SettingsActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + EyeSeeTeaApplication.getInstance().startActivity(intent); + } + + + private void sendIntentShowLogin() { + Intent surveysIntent = new Intent(PushService.class.getName()); + surveysIntent.putExtra(PushServiceStrategy.SERVICE_METHOD, + PushServiceStrategy.PUSH_MESSAGE); + surveysIntent.putExtra(PushServiceStrategy.SHOW_LOGIN, true); + LocalBroadcastManager.getInstance( + InstrumentationRegistry.getContext()).sendBroadcast(surveysIntent); + } + + +} diff --git a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/data/sync/exporter/PushUseCaseShould.java b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/data/sync/exporter/PushUseCaseShould.java index 931961a96d..fff86ef4ab 100644 --- a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/data/sync/exporter/PushUseCaseShould.java +++ b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/data/sync/exporter/PushUseCaseShould.java @@ -14,6 +14,7 @@ import org.eyeseetea.malariacare.BuildConfig; import org.eyeseetea.malariacare.R; import org.eyeseetea.malariacare.data.database.CredentialsLocalDataSource; +import org.eyeseetea.malariacare.data.database.datasources.AppInfoDataSource; import org.eyeseetea.malariacare.data.database.datasources.ProgramLocalDataSource; import org.eyeseetea.malariacare.data.database.datasources.SurveyLocalDataSource; import org.eyeseetea.malariacare.data.database.datasources.UserAccountDataSource; @@ -30,6 +31,7 @@ import org.eyeseetea.malariacare.domain.boundary.executors.IMainExecutor; import org.eyeseetea.malariacare.domain.boundary.repositories.IOrganisationUnitRepository; import org.eyeseetea.malariacare.domain.boundary.repositories.ISurveyRepository; +import org.eyeseetea.malariacare.domain.entity.AppInfo; import org.eyeseetea.malariacare.domain.entity.Credentials; import org.eyeseetea.malariacare.domain.entity.Device; import org.eyeseetea.malariacare.domain.entity.Program; @@ -59,6 +61,7 @@ public class PushUseCaseShould { private Credentials previousCredentials; private Program previousProgram; private boolean previousPushInProgress; + private long updatedTimePreference = 0l; private Context mContext; @@ -210,6 +213,12 @@ private void savePreviousPreferences() { previousProgram = programRepository.getUserProgram(); } previousPushInProgress = PreferencesState.getInstance().isPushInProgress(); + AppInfoDataSource appInfoDataSource = new AppInfoDataSource(mContext); + AppInfo appInfo = appInfoDataSource.getAppInfo(); + if(appInfo.getUpdateMetadataDate() != null) + { + updatedTimePreference = appInfo.getUpdateMetadataDate().getTime(); + } } private void saveTestCredentialsAndProgram() { @@ -219,6 +228,8 @@ private void saveTestCredentialsAndProgram() { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(context.getString(R.string.web_service_url), context.getString(R.string.ws_base_url)); + editor.putLong(context.getString(R.string.metadata_update_date), + 1545047483); editor.commit(); Credentials credentials = new Credentials(context.getString(R.string.ws_base_url), "test", "test"); @@ -238,12 +249,14 @@ private void restorePreferences() { Context context = PreferencesState.getInstance().getContext(); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences( context); + SharedPreferences.Editor editor = sharedPreferences.edit(); if (previousCredentials != null) { - SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(context.getString(R.string.web_service_url), previousCredentials.getServerURL()); - editor.commit(); } + editor.putLong(context.getString(R.string.metadata_update_date), + updatedTimePreference); + editor.commit(); CredentialsLocalDataSource credentialsLocalDataSource = new CredentialsLocalDataSource(); credentialsLocalDataSource.saveLastValidCredentials(previousCredentials); ProgramLocalDataSource programLocalDataSource = new ProgramLocalDataSource(); @@ -253,6 +266,7 @@ private void restorePreferences() { PreferencesEReferral.saveUserProgramId(-1l); } PreferencesState.getInstance().setPushInProgress(previousPushInProgress); + } } diff --git a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/data/sync/exporter/WSPushControllerShould.java b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/data/sync/exporter/WSPushControllerShould.java index 7e3e2e3427..1c85a0e9b4 100644 --- a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/data/sync/exporter/WSPushControllerShould.java +++ b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/data/sync/exporter/WSPushControllerShould.java @@ -13,6 +13,7 @@ import org.eyeseetea.malariacare.AssetsFileReader; import org.eyeseetea.malariacare.R; import org.eyeseetea.malariacare.data.database.CredentialsLocalDataSource; +import org.eyeseetea.malariacare.data.database.datasources.AppInfoDataSource; import org.eyeseetea.malariacare.data.database.datasources.SurveyLocalDataSource; import org.eyeseetea.malariacare.data.database.model.OrgUnitDB; import org.eyeseetea.malariacare.data.database.model.ProgramDB; @@ -22,6 +23,7 @@ import org.eyeseetea.malariacare.data.repositories.ProgramRepository; import org.eyeseetea.malariacare.domain.boundary.IPushController; import org.eyeseetea.malariacare.domain.boundary.repositories.ISurveyRepository; +import org.eyeseetea.malariacare.domain.entity.AppInfo; import org.eyeseetea.malariacare.domain.entity.Credentials; import org.eyeseetea.malariacare.domain.entity.Device; import org.eyeseetea.malariacare.domain.entity.Program; @@ -51,6 +53,7 @@ public class WSPushControllerShould { private String serverPreference=""; private String userPreference =""; private String pinPreference =""; + private long updatedTimePreference = 0l; private long programPreference =-1; private Context mContext; @@ -82,6 +85,12 @@ private void savePreferences() { context)).getString(context.getString(R.string.logged_user_pin),""); programPreference = (PreferenceManager.getDefaultSharedPreferences( context)).getLong(context.getString(R.string.logged_user_program),-1); + AppInfoDataSource appInfoDataSource = new AppInfoDataSource(mContext); + AppInfo appInfo = appInfoDataSource.getAppInfo(); + if(appInfo.getUpdateMetadataDate() != null) + { + updatedTimePreference = appInfo.getUpdateMetadataDate().getTime(); + } } private void restorePreferences() { @@ -94,6 +103,7 @@ private void restorePreferences() { editor.putString(context.getString(R.string.logged_user_username), userPreference); editor.putString(context.getString(R.string.logged_user_pin), pinPreference); editor.putLong(context.getString(R.string.logged_user_program), programPreference); + editor.putLong(context.getString(R.string.metadata_update_date), updatedTimePreference); editor.commit(); } @@ -106,6 +116,8 @@ private void saveTestCredentialsAndProgram() { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(context.getString(R.string.web_service_url), context.getString(R.string.ws_base_url)); + editor.putLong(context.getString(R.string.metadata_update_date), 1545047483); + editor.commit(); Credentials credentials = new Credentials(context.getString(R.string.ws_base_url), "test", diff --git a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/services/PushServiceShould.java b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/services/PushServiceShould.java index a7eeb5f25b..094f792d80 100644 --- a/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/services/PushServiceShould.java +++ b/app/src/androidTestEreferrals/java/org/eyeseetea/malariacare/services/PushServiceShould.java @@ -21,6 +21,7 @@ import org.eyeseetea.malariacare.BuildConfig; import org.eyeseetea.malariacare.R; import org.eyeseetea.malariacare.data.database.CredentialsLocalDataSource; +import org.eyeseetea.malariacare.data.database.datasources.AppInfoDataSource; import org.eyeseetea.malariacare.data.database.datasources.SurveyLocalDataSource; import org.eyeseetea.malariacare.data.database.datasources.UserAccountDataSource; import org.eyeseetea.malariacare.data.database.model.OrgUnitDB; @@ -39,6 +40,7 @@ import org.eyeseetea.malariacare.domain.boundary.executors.IMainExecutor; import org.eyeseetea.malariacare.domain.boundary.repositories.IOrganisationUnitRepository; import org.eyeseetea.malariacare.domain.boundary.repositories.ISurveyRepository; +import org.eyeseetea.malariacare.domain.entity.AppInfo; import org.eyeseetea.malariacare.domain.entity.Credentials; import org.eyeseetea.malariacare.domain.entity.Device; import org.eyeseetea.malariacare.domain.entity.Program; @@ -69,6 +71,7 @@ public class PushServiceShould { private Program previousProgram; private boolean previousPushInProgress; private UserAccount previousUserAccount; + private Long updatedTimePreference = 0l; private Context mContext; @@ -148,6 +151,12 @@ private void savePreviousPreferences() { previousPushInProgress = PreferencesState.getInstance().isPushInProgress(); UserAccountDataSource userAccountDataSource = new UserAccountDataSource(); previousUserAccount = userAccountDataSource.getLoggedUser(); + AppInfoDataSource appInfoDataSource = new AppInfoDataSource(mContext); + AppInfo appInfo = appInfoDataSource.getAppInfo(); + if(appInfo.getUpdateMetadataDate() != null) + { + updatedTimePreference = appInfo.getUpdateMetadataDate().getTime(); + } } private void saveTestCredentialsAndProgram() { @@ -157,6 +166,8 @@ private void saveTestCredentialsAndProgram() { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(context.getString(R.string.web_service_url), context.getString(R.string.ws_base_url)); + editor.putLong(context.getString(R.string.metadata_update_date), + 1545047483); editor.commit(); Credentials credentials = new Credentials(context.getString(R.string.ws_base_url), "test", "test"); @@ -176,12 +187,14 @@ private void restorePreferences() { Context context = PreferencesState.getInstance().getContext(); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences( context); + SharedPreferences.Editor editor = sharedPreferences.edit(); if (previousCredentials != null) { - SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(context.getString(R.string.web_service_url), previousCredentials.getServerURL()); - editor.commit(); } + editor.putLong(context.getString(R.string.metadata_update_date), + updatedTimePreference); + editor.commit(); CredentialsLocalDataSource credentialsLocalDataSource = new CredentialsLocalDataSource(); credentialsLocalDataSource.saveLastValidCredentials(previousCredentials); ProgramRepository programRepository = new ProgramRepository(); diff --git a/app/src/ereferrals/java/org/eyeseetea/malariacare/data/database/datasources/AppInfoDataSource.java b/app/src/ereferrals/java/org/eyeseetea/malariacare/data/database/datasources/AppInfoDataSource.java index 77f6f3e63a..0da5c2d77b 100644 --- a/app/src/ereferrals/java/org/eyeseetea/malariacare/data/database/datasources/AppInfoDataSource.java +++ b/app/src/ereferrals/java/org/eyeseetea/malariacare/data/database/datasources/AppInfoDataSource.java @@ -7,6 +7,7 @@ import android.preference.PreferenceManager; import android.util.Log; +import org.eyeseetea.malariacare.BuildConfig; import org.eyeseetea.malariacare.R; import org.eyeseetea.malariacare.data.IDataSourceCallback; import org.eyeseetea.malariacare.data.database.model.CountryVersionDB; @@ -60,14 +61,7 @@ public String getConfigFileVersion() { } private String getAppVersion() { - PackageInfo pInfo = null; - try { - pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - Log.e(TAG, "Error getting app version" + e.getMessage()); - } - return String.valueOf(pInfo.versionCode); + return String.valueOf(BuildConfig.VERSION_CODE); } private void saveMetadataUpdateDate(Date updateMetadataName) { diff --git a/app/src/ereferrals/java/org/eyeseetea/malariacare/data/sync/exporter/ConvertToWSVisitor.java b/app/src/ereferrals/java/org/eyeseetea/malariacare/data/sync/exporter/ConvertToWSVisitor.java index 3c7f2fbea5..05f6ee64f2 100644 --- a/app/src/ereferrals/java/org/eyeseetea/malariacare/data/sync/exporter/ConvertToWSVisitor.java +++ b/app/src/ereferrals/java/org/eyeseetea/malariacare/data/sync/exporter/ConvertToWSVisitor.java @@ -49,9 +49,9 @@ public class ConvertToWSVisitor implements IConvertToSDKVisitor { private Context mContext; public ConvertToWSVisitor(Context context) { + mContext = context; IDeviceRepository deviceDataSource = new DeviceDataSource(); Device device = deviceDataSource.getDevice(); - mContext = context; init(device); } diff --git a/app/src/main/java/org/eyeseetea/malariacare/DatabaseHolderProviderStrategy.java b/app/src/main/java/org/eyeseetea/malariacare/DatabaseHolderProviderStrategy.java new file mode 100644 index 0000000000..68c3a459ab --- /dev/null +++ b/app/src/main/java/org/eyeseetea/malariacare/DatabaseHolderProviderStrategy.java @@ -0,0 +1,13 @@ +package org.eyeseetea.malariacare; + + +import com.raizlabs.android.dbflow.config.DatabaseHolder; +import com.raizlabs.android.dbflow.config.EyeSeeTeaGeneratedDatabaseHolder; + +public class DatabaseHolderProviderStrategy implements + EyeSeeTeaApplication.IDatabaseHolderProviderStrategy { + @Override + public Class provide() { + return EyeSeeTeaGeneratedDatabaseHolder.class; + } +} diff --git a/app/src/main/java/org/eyeseetea/malariacare/EyeSeeTeaApplication.java b/app/src/main/java/org/eyeseetea/malariacare/EyeSeeTeaApplication.java index c5d0b28d3c..3bb6fa5b01 100644 --- a/app/src/main/java/org/eyeseetea/malariacare/EyeSeeTeaApplication.java +++ b/app/src/main/java/org/eyeseetea/malariacare/EyeSeeTeaApplication.java @@ -30,6 +30,7 @@ import com.github.stkent.bugshaker.flow.dialog.AlertDialogType; import com.github.stkent.bugshaker.github.GitHubConfiguration; import com.raizlabs.android.dbflow.config.EyeSeeTeaGeneratedDatabaseHolder; +import com.raizlabs.android.dbflow.config.DatabaseHolder; import com.raizlabs.android.dbflow.config.FlowConfig; import com.raizlabs.android.dbflow.config.FlowLog; import com.raizlabs.android.dbflow.config.FlowManager; @@ -75,10 +76,12 @@ public void onCreate() { FlowLog.setMinimumLoggingLevel(FlowLog.Level.V); } + DatabaseHolderProviderStrategy databaseStrategy = new DatabaseHolderProviderStrategy(); + PreferencesState.getInstance().init(getApplicationContext()); FlowConfig flowConfig = new FlowConfig .Builder(this) - .addDatabaseHolder(EyeSeeTeaGeneratedDatabaseHolder.class) + .addDatabaseHolder(databaseStrategy.provide()) .build(); FlowManager.init(flowConfig); initBugShaker(); @@ -144,4 +147,8 @@ private void initBugShaker() { .assemble() .start(); } + + public static interface IDatabaseHolderProviderStrategy { + Class provide(); + } } diff --git a/app/src/main/java/org/eyeseetea/malariacare/data/database/AppDatabase.java b/app/src/main/java/org/eyeseetea/malariacare/data/database/AppDatabase.java index f6eb6fa2d3..c982ea0987 100644 --- a/app/src/main/java/org/eyeseetea/malariacare/data/database/AppDatabase.java +++ b/app/src/main/java/org/eyeseetea/malariacare/data/database/AppDatabase.java @@ -22,11 +22,8 @@ import com.raizlabs.android.dbflow.annotation.Database; import com.raizlabs.android.dbflow.sql.language.NameAlias; -import org.eyeseetea.malariacare.BuildConfig; - @Database( - name = AppDatabase.NAME, version = AppDatabase.VERSION, - inMemory = BuildConfig.databaseInMemory + name = AppDatabase.NAME, version = AppDatabase.VERSION ) public class AppDatabase { diff --git a/build.gradle b/build.gradle index 88e8a2c3b8..8c770b8d61 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,10 @@ buildscript { repositories { maven { url "https://raw.github.com/Raizlabs/maven-releases/master/releases" } jcenter() + maven { + url 'https://maven.google.com/' + name 'Google' + } } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' @@ -19,7 +23,8 @@ allprojects { jcenter() maven { url "https://www.jitpack.io" } maven { - url "https://maven.google.com" + url 'https://maven.google.com/' + name 'Google' } } diff --git a/settings.gradle b/settings.gradle index 855df55fa0..438b81a89b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,5 @@ -include ':app', ':core', ':core-android', ':core-rules', ':models', ':ui', ':ui-bindings', ':utils', ':EyeSeeTea-sdk', 'bugshaker', ':orbitlite' +include ':app', ':core', ':dbflow-processor', ':core-android', ':core-rules', ':models', ':ui', ':ui-bindings', ':utils', ':EyeSeeTea-sdk', 'bugshaker', ':orbitlite' +project(':dbflow-processor').projectDir = new File(settingsDir, 'DBFlow/dbflow-processor') project(':core').projectDir = new File(settingsDir, 'sdk/core') project(':core-android').projectDir = new File(settingsDir, 'sdk/core-android') project(':core-rules').projectDir = new File(settingsDir, 'sdk/core-rules')