Skip to content

Commit 72f5f35

Browse files
authored
Finish release/2.2.0
Release/2.2.0
2 parents 71ffbe1 + 0352400 commit 72f5f35

63 files changed

Lines changed: 3624 additions & 1529 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: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ buildscript {
44

55
repositories {
66
google()
7-
jcenter()
7+
mavenCentral()
88
}
99
dependencies {
10-
classpath 'com.android.tools.build:gradle:4.1.3'
11-
10+
classpath 'com.android.tools.build:gradle:7.3.1'
1211

1312
// NOTE: Do not place your application dependencies here; they belong
1413
// in the individual module build.gradle files
@@ -18,7 +17,7 @@ buildscript {
1817
allprojects {
1918
repositories {
2019
google()
21-
jcenter()
20+
mavenCentral()
2221
}
2322
}
2423

claimManagement/build.gradle

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import java.time.format.DateTimeFormatter
33

44
apply plugin: 'com.android.application'
55

6-
// Apply custom flavours
7-
86
static def getDate() {
97
LocalDateTime date = LocalDateTime.now()
108
DateTimeFormatter formatter = DateTimeFormatter.ofPattern('dd MMMM yyyy HH:mm').withLocale(Locale.UK)
@@ -20,32 +18,42 @@ repositories {
2018
}
2119

2220
android {
23-
compileSdkVersion 30
24-
buildToolsVersion '30.0.3'
21+
compileSdkVersion 32
22+
buildToolsVersion '33.0.0'
2523

2624
defaultConfig {
2725
applicationId "org.openimis.imisclaims"
28-
minSdkVersion 26
29-
targetSdkVersion 30
30-
versionCode 3
26+
minSdkVersion 21
27+
targetSdkVersion 32
28+
versionCode 4
3129
versionName "2.0.1"
3230
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
33-
useLibrary 'org.apache.http.legacy'
3431
}
3532
buildTypes {
3633
release {
3734
minifyEnabled false
3835
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
3943
}
4044
debug {
4145
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
4251
}
4352
}
4453

4554
flavorDimensions 'std'
4655

4756
productFlavors.all {
48-
buildConfigField "String", "APP_DIR", '"IMIS"'
4957
resValue "string", "app_name_claims", "openIMIS Claims"
5058
resValue "string", "ReleaseDateValue", getDate()
5159
buildConfigField "String", "API_BASE_URL", '"http://demo.openimis.org/rest/"'
@@ -56,15 +64,13 @@ android {
5664
productFlavors {
5765
demoProd {
5866
applicationIdSuffix ".demoProd"
59-
buildConfigField "String", "APP_DIR", '"IMIS-DEMOPROD"'
6067
resValue "string", "app_name_claims", "Claims Demo"
6168
buildConfigField "String", "API_BASE_URL", '"http://demo.openimis.org/rest/"'
6269
dimension 'std'
6370
}
6471

6572
demoRelease {
6673
applicationIdSuffix ".demoRelease"
67-
buildConfigField "String", "APP_DIR", '"IMIS-DEMORELEASE"'
6874
resValue "string", "app_name_claims", "Claims Release"
6975
buildConfigField "String", "API_BASE_URL", '"https://release.openimis.org/rest/"'
7076
dimension 'std'
@@ -73,63 +79,54 @@ android {
7379
chfDev {
7480
applicationIdSuffix ".chfDev"
7581
resValue "string", "app_name_claims", "Claims CHF"
76-
buildConfigField "String", "APP_DIR", '"IMIS-CHFDEV"'
7782
buildConfigField "String", "API_BASE_URL", '"http://chf-dev.swisstph-mis.ch/rest/"'
7883
dimension 'std'
7984
}
8085

8186
chfProd {
8287
applicationIdSuffix ".chfProd"
8388
resValue "string", "app_name_claims", "Claims CHF"
84-
buildConfigField "String", "APP_DIR", '"IMIS-CHFPROD"'
8589
buildConfigField "String", "API_BASE_URL", '"http://chf-imis.or.tz/restapi/"'
8690
dimension 'std'
8791
}
8892
mvDev {
8993
applicationIdSuffix ".mvDev"
90-
buildConfigField "String", "APP_DIR", '"IMIS-MVDEV"'
9194
resValue "string", "app_name_claims", "Claims MV"
9295
buildConfigField "String", "API_BASE_URL", '"http://imis-mv.swisstph-mis.ch/rest/"'
9396
dimension 'std'
9497
}
9598
bephaDev {
9699
applicationIdSuffix ".bephaDev"
97-
buildConfigField "String", "APP_DIR", '"IMIS-BEPHADEV"'
98100
resValue "string", "app_name_claims", "Claims BEPHA"
99101
buildConfigField "String", "API_BASE_URL", '"http://149.210.235.40/devupgrade/rest/"'
100102
dimension 'std'
101103
}
102104
niger {
103105
applicationIdSuffix ".niger"
104-
buildConfigField "String", "APP_DIR", '"IMIS-NIGER"'
105106
resValue "string", "app_name_claims", "Claims Niger"
106107
buildConfigField "String", "API_BASE_URL", '"http://oiniger.bluesquare.org/rest/"'
107108
}
108109
tchadDev {
109110
applicationIdSuffix ".tchadDev"
110111
buildConfigField "String", "API_BASE_URL", '"https://imis-tchad-dev.swisstph-mis.ch/rest/"'
111-
buildConfigField "String", "APP_DIR", '"IMIS-TCHADDEV"'
112112
resValue "string", "app_name_claims", "Claims TCHAD DEV"
113113
dimension 'std'
114114
}
115115
local {
116116
applicationIdSuffix ".local"
117-
buildConfigField "String", "APP_DIR", '"IMIS-LOCAL"'
118117
resValue "string", "app_name_claims", "Claims Local"
119118
buildConfigField "String", "API_BASE_URL", '"http://10.0.2.2:35787/"'
120119
dimension 'std'
121120
}
122121
cli {
123122
applicationIdSuffix System.getenv("APPLICATION_ID_SUFFIX") ?: ".cli"
124-
buildConfigField "String", "APP_DIR", '"' + (System.getenv("CLI_APP_DIR") ?: 'IMIS-CLI') + '"'
125123
resValue "string", "app_name_claims", System.getenv("CLI_APP_NAME") ?: "Claims CLI"
126124
buildConfigField "String", "API_BASE_URL", '"' + (System.getenv("API_BASE_URL") ?: 'http://10.0.2.2:35787/') + '"'
127125
dimension 'std'
128126
}
129127
mauritaniaTrain {
130128
applicationIdSuffix ".mauritaniaTrain"
131129
buildConfigField "String", "API_BASE_URL", '"https://formation.cnass-mauritanie.swisstph-mis.ch/rest/"'
132-
buildConfigField "String", "APP_DIR", '"IMIS-MAURITANIA-TRAIN"'
133130
resValue "string", "app_name_claims", "Claims CNASS TRAIN"
134131
dimension = 'std'
135132
}
@@ -143,17 +140,17 @@ android {
143140
demoRelease.java.srcDir 'src/demoRelease/java'
144141
demoRelease.res.srcDir 'src/demoRelease/res'
145142

146-
chfDev.java.srcDir 'src/chfDev/java'
147-
chfDev.res.srcDir 'src/chfDev/res'
143+
chfDev.java.srcDir 'src/chf/java'
144+
chfDev.res.srcDir 'src/chf/res'
148145

149-
chfProd.java.srcDir 'src/chfDev/java'
150-
chfProd.res.srcDir 'src/chfProd/res'
146+
chfProd.java.srcDir 'src/chf/java'
147+
chfProd.res.srcDir 'src/chf/res'
151148

152-
mvDev.java.srcDir 'src/mvDev/java'
153-
mvDev.res.srcDir 'src/mvDev/res'
149+
mvDev.java.srcDir 'src/mv/java'
150+
mvDev.res.srcDir 'src/mv/res'
154151

155-
bephaDev.java.srcDir 'src/bephaDev/java'
156-
bephaDev.res.srcDir 'src/bephaDev/res'
152+
bephaDev.java.srcDir 'src/bepha/java'
153+
bephaDev.res.srcDir 'src/bepha/res'
157154

158155
niger.java.srcDir 'src/niger/java'
159156
niger.res.srcDir 'src/niger/res'
@@ -169,16 +166,19 @@ android {
169166
cli.res.srcDir System.getenv("CLI_RES_DIR") ?: 'src/demoProd/res'
170167
}
171168

169+
compileOptions {
170+
sourceCompatibility JavaVersion.VERSION_11
171+
targetCompatibility JavaVersion.VERSION_11
172+
}
173+
buildFeatures {
174+
viewBinding true
175+
}
172176
packagingOptions {
173177
exclude 'META-INF/DEPENDENCIES'
174-
175-
}
176-
compileOptions {
177-
sourceCompatibility JavaVersion.VERSION_1_8
178-
targetCompatibility JavaVersion.VERSION_1_8
179178
}
180179
}
181180

181+
// Apply custom flavours
182182
if(file('custom-flavours.gradle').exists()){
183183
apply from: 'custom-flavours.gradle'
184184
}
@@ -191,10 +191,15 @@ dependencies {
191191
implementation 'com.embarkmobile:zxing-android-minimal:1.2.1@aar'
192192
implementation 'commons-io:commons-io:2.11.0'
193193
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'
194199
testImplementation 'junit:junit:4.12'
195200
androidTestImplementation 'com.android.support.test:runner:1.0.2'
196201
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
197-
implementation group: 'com.squareup.picasso', name: 'picasso', version: '2.5.2'
202+
implementation group: 'com.squareup.picasso', name: 'picasso', version: '2.71828'
198203
implementation group: 'net.lingala.zip4j', name: 'zip4j', version: '1.2.7'
199204

200205
}

claimManagement/src/bephaDev/java/org/openimis/imisclaims/Escape.java renamed to claimManagement/src/bepha/java/org/openimis/imisclaims/Escape.java

File renamed without changes.
File renamed without changes.

claimManagement/src/chfDev/java/org/openimis/imisclaims/Escape.java renamed to claimManagement/src/chf/java/org/openimis/imisclaims/Escape.java

File renamed without changes.
File renamed without changes.
File renamed without changes.
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)