Skip to content

Commit 0352400

Browse files
authored
Merge pull request #80 from openimis/develop
Develop
2 parents d0a8450 + 9ae73e6 commit 0352400

57 files changed

Lines changed: 3560 additions & 1500 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ fastlane/readme.md
7777
# Visual Studio Code
7878
.vscode/
7979

80-
release/
8180

8281
# Custom product flavours
8382
*custom-flavours.gradle

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ buildscript {
77
mavenCentral()
88
}
99
dependencies {
10-
classpath 'com.android.tools.build:gradle:7.0.2'
10+
classpath 'com.android.tools.build:gradle:7.3.1'
1111

1212
// NOTE: Do not place your application dependencies here; they belong
1313
// in the individual module build.gradle files

claimManagement/build.gradle

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,32 +18,42 @@ repositories {
1818
}
1919

2020
android {
21-
compileSdkVersion 30
22-
buildToolsVersion '30.0.3'
21+
compileSdkVersion 32
22+
buildToolsVersion '33.0.0'
2323

2424
defaultConfig {
2525
applicationId "org.openimis.imisclaims"
26-
minSdkVersion 26
27-
targetSdkVersion 30
28-
versionCode 3
26+
minSdkVersion 21
27+
targetSdkVersion 32
28+
versionCode 4
2929
versionName "2.0.1"
3030
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
31-
useLibrary 'org.apache.http.legacy'
3231
}
3332
buildTypes {
3433
release {
3534
minifyEnabled false
3635
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
36+
37+
buildConfigField "boolean", "LOGGING_ENABLED", "false"
38+
39+
// Refer to https://developer.android.com/reference/android/util/Log for the log level values
40+
// Irrelevant if LOGGING_ENABLED = false
41+
buildConfigField "int", "CONSOLE_LOG_LEVEL", '8' //Assert
42+
buildConfigField "int", "FILE_LOG_LEVEL", '8' //Assert
3743
}
3844
debug {
3945
debuggable true
46+
buildConfigField "boolean", "LOGGING_ENABLED", "true"
47+
48+
// Refer to https://developer.android.com/reference/android/util/Log for the log level values
49+
buildConfigField "int", "CONSOLE_LOG_LEVEL", '2' //Verbose
50+
buildConfigField "int", "FILE_LOG_LEVEL", '2' //Verbose
4051
}
4152
}
4253

4354
flavorDimensions 'std'
4455

4556
productFlavors.all {
46-
buildConfigField "String", "APP_DIR", '"IMIS"'
4757
resValue "string", "app_name_claims", "openIMIS Claims"
4858
resValue "string", "ReleaseDateValue", getDate()
4959
buildConfigField "String", "API_BASE_URL", '"http://demo.openimis.org/rest/"'
@@ -54,80 +64,69 @@ android {
5464
productFlavors {
5565
demoProd {
5666
applicationIdSuffix ".demoProd"
57-
buildConfigField "String", "APP_DIR", '"IMIS-DEMOPROD"'
5867
resValue "string", "app_name_claims", "Claims Demo"
5968
buildConfigField "String", "API_BASE_URL", '"http://demo.openimis.org/rest/"'
6069
dimension 'std'
6170
}
6271

6372
demoRelease {
6473
applicationIdSuffix ".demoRelease"
65-
buildConfigField "String", "APP_DIR", '"IMIS-DEMORELEASE"'
6674
resValue "string", "app_name_claims", "Claims Release"
67-
buildConfigField "String", "API_BASE_URL", '"https://legacy-release.s1.openimis.org/rest/"'
75+
buildConfigField "String", "API_BASE_URL", '"https://release.openimis.org/rest/"'
6876
dimension 'std'
6977
}
7078

7179
chfDev {
7280
applicationIdSuffix ".chfDev"
7381
resValue "string", "app_name_claims", "Claims CHF"
74-
buildConfigField "String", "APP_DIR", '"IMIS-CHFDEV"'
7582
buildConfigField "String", "API_BASE_URL", '"http://chf-dev.swisstph-mis.ch/rest/"'
7683
dimension 'std'
7784
}
7885

7986
chfProd {
8087
applicationIdSuffix ".chfProd"
8188
resValue "string", "app_name_claims", "Claims CHF"
82-
buildConfigField "String", "APP_DIR", '"IMIS-CHFPROD"'
8389
buildConfigField "String", "API_BASE_URL", '"http://chf-imis.or.tz/restapi/"'
8490
dimension 'std'
8591
}
8692
mvDev {
8793
applicationIdSuffix ".mvDev"
88-
buildConfigField "String", "APP_DIR", '"IMIS-MVDEV"'
8994
resValue "string", "app_name_claims", "Claims MV"
9095
buildConfigField "String", "API_BASE_URL", '"http://imis-mv.swisstph-mis.ch/rest/"'
9196
dimension 'std'
9297
}
9398
bephaDev {
9499
applicationIdSuffix ".bephaDev"
95-
buildConfigField "String", "APP_DIR", '"IMIS-BEPHADEV"'
96100
resValue "string", "app_name_claims", "Claims BEPHA"
97101
buildConfigField "String", "API_BASE_URL", '"http://149.210.235.40/devupgrade/rest/"'
98102
dimension 'std'
99103
}
100104
niger {
101105
applicationIdSuffix ".niger"
102-
buildConfigField "String", "APP_DIR", '"IMIS-NIGER"'
103106
resValue "string", "app_name_claims", "Claims Niger"
104107
buildConfigField "String", "API_BASE_URL", '"http://oiniger.bluesquare.org/rest/"'
105108
}
106109
tchadDev {
107110
applicationIdSuffix ".tchadDev"
108111
buildConfigField "String", "API_BASE_URL", '"https://imis-tchad-dev.swisstph-mis.ch/rest/"'
109-
buildConfigField "String", "APP_DIR", '"IMIS-TCHADDEV"'
110112
resValue "string", "app_name_claims", "Claims TCHAD DEV"
111113
dimension 'std'
112114
}
113115
local {
114116
applicationIdSuffix ".local"
115-
buildConfigField "String", "APP_DIR", '"IMIS-LOCAL"'
116117
resValue "string", "app_name_claims", "Claims Local"
117118
buildConfigField "String", "API_BASE_URL", '"http://10.0.2.2:35787/"'
118119
dimension 'std'
119120
}
120121
cli {
121122
applicationIdSuffix System.getenv("APPLICATION_ID_SUFFIX") ?: ".cli"
122-
buildConfigField "String", "APP_DIR", '"' + (System.getenv("CLI_APP_DIR") ?: 'IMIS-CLI') + '"'
123123
resValue "string", "app_name_claims", System.getenv("CLI_APP_NAME") ?: "Claims CLI"
124124
buildConfigField "String", "API_BASE_URL", '"' + (System.getenv("API_BASE_URL") ?: 'http://10.0.2.2:35787/') + '"'
125125
dimension 'std'
126126
}
127127
mauritaniaTrain {
128128
applicationIdSuffix ".mauritaniaTrain"
129129
buildConfigField "String", "API_BASE_URL", '"https://formation.cnass-mauritanie.swisstph-mis.ch/rest/"'
130-
buildConfigField "String", "APP_DIR", '"IMIS-MAURITANIA-TRAIN"'
131130
resValue "string", "app_name_claims", "Claims CNASS TRAIN"
132131
dimension = 'std'
133132
}
@@ -167,14 +166,16 @@ android {
167166
cli.res.srcDir System.getenv("CLI_RES_DIR") ?: 'src/demoProd/res'
168167
}
169168

170-
packagingOptions {
171-
exclude 'META-INF/DEPENDENCIES'
172-
173-
}
174169
compileOptions {
175170
sourceCompatibility JavaVersion.VERSION_11
176171
targetCompatibility JavaVersion.VERSION_11
177172
}
173+
buildFeatures {
174+
viewBinding true
175+
}
176+
packagingOptions {
177+
exclude 'META-INF/DEPENDENCIES'
178+
}
178179
}
179180

180181
// Apply custom flavours
@@ -190,6 +191,11 @@ dependencies {
190191
implementation 'com.embarkmobile:zxing-android-minimal:1.2.1@aar'
191192
implementation 'commons-io:commons-io:2.11.0'
192193
implementation 'com.android.support:design:28.0.0'
194+
implementation 'com.android.support:appcompat-v7:28.0.0'
195+
implementation 'android.arch.lifecycle:livedata:1.1.1'
196+
implementation 'android.arch.lifecycle:viewmodel:1.1.1'
197+
implementation 'org.apache.httpcomponents:httpclient:4.5.9'
198+
implementation 'org.apache.httpcomponents:httpcore:4.4.11'
193199
testImplementation 'junit:junit:4.12'
194200
androidTestImplementation 'com.android.support.test:runner:1.0.2'
195201
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package org.openimis.imisclaims.tools;
2+
3+
import android.content.Context;
4+
import android.net.Uri;
5+
import android.support.v4.content.FileProvider;
6+
7+
import org.openimis.imisclaims.AppInformation;
8+
import org.openimis.imisclaims.BuildConfig;
9+
import org.openimis.imisclaims.Global;
10+
import org.openimis.imisclaims.util.ZipUtils;
11+
12+
import java.io.File;
13+
import java.io.FileOutputStream;
14+
import java.io.IOException;
15+
import java.io.OutputStream;
16+
import java.nio.charset.StandardCharsets;
17+
import java.util.ArrayList;
18+
import java.util.Arrays;
19+
import java.util.Date;
20+
import java.util.Locale;
21+
22+
/**
23+
* This class is a wrapper for the default android Log class, adding additional functionality while
24+
* keeping the android.util.Log api
25+
*/
26+
public class Log {
27+
public static final boolean isLoggingEnabled = BuildConfig.LOGGING_ENABLED;
28+
29+
private static final String logFilePrefix = "log-";
30+
private static final String logExportFileName = "logs.zip";
31+
private static final String[] levelMapping = {"V", "D", "I", "W", "E", "A"};
32+
private static File logFile = null;
33+
34+
public static void v(String tag, String msg) {
35+
log(tag, msg, android.util.Log.VERBOSE);
36+
}
37+
38+
public static void v(String tag, String msg, Throwable thr) {
39+
log(tag, String.format("%s\n%s", msg, android.util.Log.getStackTraceString(thr)), android.util.Log.VERBOSE);
40+
}
41+
42+
public static void d(String tag, String msg) {
43+
log(tag, msg, android.util.Log.DEBUG);
44+
}
45+
46+
public static void d(String tag, String msg, Throwable thr) {
47+
log(tag, String.format("%s\n%s", msg, android.util.Log.getStackTraceString(thr)), android.util.Log.DEBUG);
48+
}
49+
50+
public static void i(String tag, String msg) {
51+
log(tag, msg, android.util.Log.INFO);
52+
}
53+
54+
public static void i(String tag, String msg, Throwable thr) {
55+
log(tag, String.format("%s\n%s", msg, android.util.Log.getStackTraceString(thr)), android.util.Log.INFO);
56+
}
57+
58+
public static void w(String tag, String msg) {
59+
log(tag, msg, android.util.Log.WARN);
60+
}
61+
62+
public static void w(String tag, String msg, Throwable thr) {
63+
log(tag, String.format("%s\n%s", msg, android.util.Log.getStackTraceString(thr)), android.util.Log.WARN);
64+
}
65+
66+
public static void e(String tag, String msg) {
67+
log(tag, msg, android.util.Log.ERROR);
68+
}
69+
70+
public static void e(String tag, String msg, Throwable thr) {
71+
log(tag, String.format("%s\n%s", msg, android.util.Log.getStackTraceString(thr)), android.util.Log.ERROR);
72+
}
73+
74+
private static void log(String tag, String msg, int level) {
75+
if (level < 2 || level > 7) {
76+
throw new RuntimeException("Unknown log level: " + level);
77+
}
78+
79+
if (isLoggingEnabled) {
80+
new Thread(() -> {
81+
82+
if (level >= BuildConfig.CONSOLE_LOG_LEVEL) {
83+
android.util.Log.println(level, tag, msg);
84+
}
85+
86+
if (level >= BuildConfig.FILE_LOG_LEVEL) {
87+
storeLog(tag, msg, level);
88+
}
89+
}).start();
90+
}
91+
}
92+
93+
public static void zipLogFiles(Context context) {
94+
File cacheDir = Global.getContext().getExternalCacheDir();
95+
File[] logFiles = cacheDir.listFiles((dir, filename) -> filename.startsWith(logFilePrefix));
96+
File targetFile = new File(cacheDir, logExportFileName);
97+
98+
if (logFiles != null) {
99+
ArrayList<File> filesToZip = new ArrayList<>(Arrays.asList(logFiles));
100+
ZipUtils.zipFiles(filesToZip, targetFile, "");
101+
}
102+
103+
Uri logExportUri = FileProvider.getUriForFile(Global.getContext(),
104+
String.format("%s.fileprovider", BuildConfig.APPLICATION_ID),
105+
targetFile);
106+
107+
Global.getGlobal().sendFile(context, logExportUri, "application/octet-stream");
108+
}
109+
110+
public static void deleteLogFiles() {
111+
File cacheDir = Global.getContext().getExternalCacheDir();
112+
File[] logFiles = cacheDir.listFiles((dir, filename) -> filename.startsWith(logFilePrefix));
113+
if (logFiles != null) {
114+
for (File f : logFiles) {
115+
f.delete();
116+
}
117+
}
118+
}
119+
120+
private synchronized static void storeLog(String tag, String msg, int level) {
121+
Date date = new Date();
122+
initializeLogFile(date);
123+
try {
124+
OutputStream os = new FileOutputStream(logFile, true);
125+
os.write(buildLogLine(tag, msg, level, date).getBytes(StandardCharsets.UTF_8));
126+
os.close();
127+
} catch (IOException e) {
128+
throw new RuntimeException("Writing to log file failed", e);
129+
}
130+
}
131+
132+
private static void initializeLogFile(Date date) {
133+
if (logFile == null || !logFile.exists()) {
134+
File cacheDir = Global.getContext().getExternalCacheDir();
135+
136+
String filename = String.format("%s%s.txt",logFilePrefix, AppInformation.DateTimeInfo.getDefaultFileDatetimeFormatter().format(date));
137+
logFile = new File(cacheDir, filename);
138+
139+
try {
140+
if (!logFile.createNewFile())
141+
throw new RuntimeException("Log file creation failed");
142+
} catch (IOException e) {
143+
throw new RuntimeException(e);
144+
}
145+
}
146+
}
147+
148+
private static String buildLogLine(String tag, String msg, int level, Date date) {
149+
String dateString = AppInformation.DateTimeInfo.getDefaultIsoDatetimeFormatter().format(date);
150+
return String.format(Locale.US, "%s %s %s %s\n", dateString, levelMapping[level - 2], tag, msg);
151+
}
152+
}

0 commit comments

Comments
 (0)