Skip to content

Commit 98f35ab

Browse files
authored
Merge pull request #343 from Horizontal-org/feat/release_2.14.0(196)
merge release 2.14.0 to main
2 parents b7e59e4 + 96ba46d commit 98f35ab

File tree

167 files changed

+10065
-3848
lines changed

Some content is hidden

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

167 files changed

+10065
-3848
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ buildscript {
7272
versions.permissionDispatcher = "4.8.0"
7373
versions.googlePlayServices = "17.0.0"
7474
versions.pdf_viewer = "2.8.2"
75+
versions.nextcloud = "2.19.1"
76+
versions.fidoVersion = "4.1.0-patch1"
7577
versions.divviup = "0.2.0"
7678
versions.credentialsVersion = '1.2.2'
7779
versions.googleIdVersion = '1.1.1'
@@ -83,6 +85,7 @@ buildscript {
8385
versions.googleApiClientGsonVersion = '1.34.0'
8486
versions.dropboxVersion = '7.0.0'
8587

88+
8689
repositories {
8790
mavenCentral()
8891
jcenter()

mobile/build.gradle

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ android {
1414
minSdkVersion versions.minSdk
1515
compileSdkVersion versions.compileSdk
1616
targetSdkVersion versions.targetSdk
17-
versionCode 191
18-
versionName "2.13.1"
17+
versionCode 196
18+
versionName "2.14.0"
1919
multiDexEnabled true
2020

2121
ndk {
@@ -47,9 +47,8 @@ android {
4747
}
4848

4949
configurations.all {
50-
// resolutionStrategy.force "com.android.support:exifinterface:${supportLibVersion}"
51-
// resolutionStrategy.force "com.android.support:animated-vector-drawble:${supportLibVersion}"
52-
// resolutionStrategy.force "com.android.support:support-v13:${supportLibVersion}"
50+
exclude group: "org.slf4j", module: "slf4j-log4j12"
51+
exclude group: "log4j", module: "log4j"
5352
}
5453

5554
buildTypes {
@@ -86,6 +85,10 @@ android {
8685
enableExperimentalClasspathAggregation = true
8786
enableAggregatingTask = true
8887

88+
}
89+
packagingOptions {
90+
exclude 'META-INF/DEPENDENCIES'
91+
8992
}
9093
namespace 'rs.readahead.washington.mobile'
9194
}
@@ -216,6 +219,20 @@ dependencies {
216219
implementation "com.google.code.gson:gson:$versions.gsonVersion"
217220
implementation "com.dropbox.core:dropbox-core-sdk:$versions.dropboxVersion"
218221
implementation "com.dropbox.core:dropbox-android-sdk:$versions.dropboxVersion"
222+
223+
//Next cloud
224+
implementation ("com.github.nextcloud:android-library:$versions.nextcloud") {
225+
exclude group: 'org.ogce', module: 'xpp3'
226+
exclude group: 'commons-logging', module: 'commons-logging' // Exclude commons-logging
227+
exclude group: 'org.slf4j', module: 'jcl-over-slf4j' // Optionally exclude jcl-over-slf4j
228+
229+
}
230+
implementation "commons-httpclient:commons-httpclient:3.1@jar" // remove after entire switch to lib v2
231+
implementation 'org.conscrypt:conscrypt-android:2.5.2'
232+
233+
implementation "com.github.nextcloud-deps.hwsecurity:hwsecurity-fido:$versions.fidoVersion"
234+
implementation "com.github.nextcloud-deps.hwsecurity:hwsecurity-fido2:$versions.fidoVersion"
235+
219236
}
220237

221238
def getLocalProperties() {

mobile/proguard-rules.pro

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@
240240

241241
# Android-Image-Cropper
242242
-keep class androidx.appcompat.widget.** { *; }
243+
-keep class org.apache.commons.** { *; }
244+
243245

244246
-if class androidx.credentials.CredentialManager
245247
-keep class androidx.credentials.playservices.** {

mobile/src/main/AndroidManifest.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
android:roundIcon="@mipmap/tella_icon_round"
5454
android:supportsRtl="true"
5555
android:theme="@style/AppTheme"
56+
android:usesCleartextTraffic="true"
5657
tools:ignore="GoogleAppIndexingWarning"
5758
tools:replace="android:allowBackup"
5859
tools:targetApi="n">
@@ -658,6 +659,11 @@
658659
android:configChanges="keyboardHidden|orientation|screenSize"
659660
android:theme="@style/AppTheme.NoActionBar" />
660661

662+
<activity
663+
android:name=".views.dialog.nextcloud.NextCloudLoginFlowActivity"
664+
android:configChanges="keyboardHidden|orientation|screenSize"
665+
android:theme="@style/AppTheme.NoActionBar" />
666+
661667
<meta-data
662668
android:name="preloaded_fonts"
663669
android:resource="@array/preloaded_fonts" />

mobile/src/main/java/rs/readahead/washington/mobile/MyApplication.java

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@
66
import android.app.Application;
77
import android.content.Context;
88
import android.content.Intent;
9+
import android.content.pm.ActivityInfo;
10+
import android.content.pm.PackageInfo;
11+
import android.content.pm.PackageManager;
912
import android.net.ConnectivityManager;
1013
import android.net.NetworkInfo;
1114
import android.os.Build;
15+
import android.os.StrictMode;
1216
import android.os.Bundle;
1317
import android.widget.Toast;
1418

@@ -35,9 +39,14 @@
3539
import com.hzontal.tella_locking_ui.ui.pin.PinUnlockActivity;
3640
import com.hzontal.tella_vault.Vault;
3741
import com.hzontal.tella_vault.rx.RxVault;
42+
import com.owncloud.android.lib.common.utils.Log_OC;
43+
import com.owncloud.android.lib.resources.status.OwnCloudVersion;
3844

3945
import org.hzontal.shared_ui.data.CommonPrefs;
4046

47+
import net.zetetic.database.sqlcipher.SQLiteDatabase;
48+
49+
import org.conscrypt.Conscrypt;
4150
import org.hzontal.tella.keys.MainKeyStore;
4251
import org.hzontal.tella.keys.TellaKeys;
4352
import org.hzontal.tella.keys.config.IUnlockRegistryHolder;
@@ -51,14 +60,23 @@
5160
import org.hzontal.tella.keys.wrapper.UnencryptedKeyWrapper;
5261

5362
import java.io.File;
63+
import java.lang.ref.WeakReference;
64+
import java.security.NoSuchAlgorithmException;
65+
import java.security.Security;
66+
import java.util.Arrays;
5467

5568
import javax.inject.Inject;
69+
import javax.net.ssl.SSLContext;
70+
import javax.net.ssl.SSLEngine;
5671

5772
import dagger.hilt.android.HiltAndroidApp;
73+
import de.cotech.hw.SecurityKeyManager;
74+
import de.cotech.hw.SecurityKeyManagerConfig;
5875
import io.reactivex.functions.Consumer;
5976
import io.reactivex.plugins.RxJavaPlugins;
6077
import rs.readahead.washington.mobile.bus.TellaBus;
6178
import rs.readahead.washington.mobile.data.database.KeyDataSource;
79+
import rs.readahead.washington.mobile.data.nextcloud.TempFileManager;
6280
import rs.readahead.washington.mobile.data.rest.BaseApi;
6381
import rs.readahead.washington.mobile.data.sharedpref.Preferences;
6482
import rs.readahead.washington.mobile.data.sharedpref.SharedPrefs;
@@ -72,11 +90,11 @@
7290
import rs.readahead.washington.mobile.views.activity.ExitActivity;
7391
import rs.readahead.washington.mobile.views.activity.MainActivity;
7492
import rs.readahead.washington.mobile.views.activity.onboarding.OnBoardingActivity;
93+
import rs.readahead.washington.mobile.views.dialog.nextcloud.NextCloudLoginFlowActivity;
7594
import timber.log.Timber;
7695

7796
@HiltAndroidApp
78-
public class MyApplication extends MultiDexApplication implements IUnlockRegistryHolder, CredentialsCallback, Configuration.Provider, Application.ActivityLifecycleCallbacks
79-
{
97+
public class MyApplication extends MultiDexApplication implements IUnlockRegistryHolder, CredentialsCallback, Configuration.Provider, Application.ActivityLifecycleCallbacks {
8098
public static Vault vault;
8199
public static RxVault rxVault;
82100
private static TellaBus bus;
@@ -90,6 +108,10 @@ public class MyApplication extends MultiDexApplication implements IUnlockRegistr
90108
@Inject
91109
DivviupUtils divviupUtils;
92110
Vault.Config vaultConfig;
111+
private static final String TAG = MyApplication.class.getSimpleName();
112+
public static final String DOT = ".";
113+
public static final OwnCloudVersion MINIMUM_SUPPORTED_SERVER_VERSION = OwnCloudVersion.nextcloud_17;
114+
private static WeakReference<Context> appContext;
93115
private long startTime;
94116
private long totalTimeSpent = 0; // Store total time spent in the app
95117
private int activityReferences = 0;
@@ -164,7 +186,6 @@ protected void attachBaseContext(Context newBase) {
164186
@Override
165187
public void onCreate() {
166188
super.onCreate();
167-
168189
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
169190

170191
//ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
@@ -192,7 +213,10 @@ public void onCreate() {
192213
//initialize WorkManager
193214
// WorkManager.initialize(this, myConfig);
194215

195-
RxJavaPlugins.setErrorHandler(new Consumer<>() {
216+
System.setProperty("javax.net.debug", "ssl,handshake");
217+
218+
219+
RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
196220
@Override
197221
public void accept(Throwable throwable) {
198222
Timber.d(throwable, getClass().getName());
@@ -220,6 +244,8 @@ public void accept(Throwable throwable) {
220244
mainKeyHolder = new LifecycleMainKey(ProcessLifecycleOwner.get().getLifecycle(), Preferences.getLockTimeout());
221245
keyDataSource = new KeyDataSource(getApplicationContext());
222246
TellaKeysUI.initialize(mainKeyStore, mainKeyHolder, unlockRegistry, this, Preferences.getFailedUnlockOption(), Preferences.getUnlockRemainingAttempts(), Preferences.isShowUnlockRemainingAttempts());
247+
insertConscrypt();
248+
enableStrictMode();
223249
}
224250

225251
private void configureCrashlytics() {
@@ -350,6 +376,7 @@ public void onActivityStarted(Activity activity) {
350376
startTime = System.currentTimeMillis(); // Start tracking time
351377
}
352378
}
379+
353380
@Override
354381
public void onActivityResumed(@NonNull Activity activity) {
355382

@@ -369,6 +396,7 @@ public void onActivityStopped(Activity activity) {
369396
totalTimeSpent += spentTime; // Add to total time spent
370397
Preferences.setTimeSpent(totalTimeSpent); // Save the time to shared preferences
371398
divviupUtils.runTimeSpentEvent(totalTimeSpent); // Send analytics if needed
399+
TempFileManager.INSTANCE.deleteAllFiles();
372400
}
373401
}
374402

@@ -381,4 +409,43 @@ public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bun
381409
public void onActivityDestroyed(@NonNull Activity activity) {
382410

383411
}
412+
413+
private void insertConscrypt() {
414+
Security.insertProviderAt(Conscrypt.newProvider(), 1);
415+
416+
try {
417+
Conscrypt.Version version = Conscrypt.version();
418+
Log_OC.i(TAG, "Using Conscrypt/"
419+
+ version.major()
420+
+ DOT
421+
+ version.minor()
422+
+ DOT + version.patch()
423+
+ " for TLS");
424+
SSLEngine engine = SSLContext.getDefault().createSSLEngine();
425+
Log_OC.i(TAG, "Enabled protocols: " + Arrays.toString(engine.getEnabledProtocols()) + " }");
426+
Log_OC.i(TAG, "Enabled ciphers: " + Arrays.toString(engine.getEnabledCipherSuites()) + " }");
427+
} catch (NoSuchAlgorithmException e) {
428+
Log_OC.e(TAG, e.getMessage());
429+
}
430+
}
431+
432+
433+
private void enableStrictMode() {
434+
if (BuildConfig.DEBUG) {
435+
Log_OC.d(TAG, "Enabling StrictMode");
436+
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
437+
.detectDiskReads()
438+
.detectDiskWrites()
439+
.detectAll()
440+
.penaltyLog()
441+
.build());
442+
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
443+
.detectLeakedSqlLiteObjects()
444+
.detectLeakedClosableObjects()
445+
.penaltyLog()
446+
.build());
447+
}
448+
}
449+
450+
384451
}

mobile/src/main/java/rs/readahead/washington/mobile/data/database/D.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class D {
1616

1717
// 1=start,2=form media file status,3=updated flag in xforms
1818
// 4=xml form part status,5=media file hash,6=tella upload server,7=file uploads table
19-
static final int DATABASE_VERSION = 15;
19+
static final int DATABASE_VERSION = 16;
2020
static final int MIN_DATABASE_VERSION = 1;
2121

2222
/* DATABASE TABLES */
@@ -26,6 +26,7 @@ class D {
2626
static final String T_REPORT_FORM_INSTANCE = "t_report_form_instance";
2727
static final String T_GOOGLE_DRIVE_FORM_INSTANCE = "t_google_drive_form_instance";
2828
static final String T_DROPBOX_FORM_INSTANCE = "t_dropbox_form_instance";
29+
static final String T_NEXT_CLOUD_FORM_INSTANCE = "t_next_cloud_form_instance";
2930
static final String T_MEDIA_FILE = "t_media_file";
3031
static final String T_COLLECT_FORM_INSTANCE_MEDIA_FILE = "t_collect_xform_instance_media_file";
3132
static final String T_SETTINGS = "t_settings";
@@ -52,6 +53,7 @@ class D {
5253
static final String C_PATH = "c_path";
5354
static final String C_URL = "c_url";
5455
static final String C_USERNAME = "c_username";
56+
static final String C_USERID = "c_userid";
5557
static final String C_PASSWORD = "c_password";
5658
static final String C_VERSION = "c_version";
5759
static final String C_HASH = "c_hash";
@@ -109,6 +111,7 @@ class D {
109111
static final String C_UWAZI_ENTITY_INSTANCE_ID = "c_uwazi_entity_instance_id";
110112
static final String T_REPORT_INSTANCE_VAULT_FILE = "t_report_instance_vault_file";
111113
static final String T_GOOGLE_DRIVE_INSTANCE_VAULT_FILE = "t_google_drive_instance_vault_file";
114+
static final String T_NEXT_CLOUD_INSTANCE_VAULT_FILE = "t_next_cloud_instance_vault_file";
112115
static final String T_DROPBOX_INSTANCE_VAULT_FILE = "t_dropbox_instance_vault_file";
113116
static final String C_REPORT_INSTANCE_ID = "c_report_instance_id";
114117
static final String C_UPLOADED_SIZE = "c_uploaded_size";
@@ -138,6 +141,13 @@ class D {
138141
static final String C_RESOURCES_PROJECT = "c_resources_project";
139142
static final String C_RESOURCES_FILE_ID = "c_resources_file_id";
140143

144+
/* NEXT CLOUD */
145+
static final String T_NEXT_CLOUD = "t_next_cloud";
146+
static final String C_NEXT_CLOUD_SERVER_NAME = "c_next_cloud_server_name";
147+
static final String C_NEXT_CLOUD_FOLDER_ID = "c_next_cloud_folder_id";
148+
static final String C_NEXT_CLOUD_FOLDER_NAME = "c_next_cloud_folder_name";
149+
static final String C_NEXT_CLOUD_USER_ID = "c_next_cloud_user_id";
150+
141151
/* GOOGLE DRIVE */
142152
static final String T_GOOGLE_DRIVE = "t_google_drive";
143153
static final String C_GOOGLE_DRIVE_FOLDER_ID = "c_google_drive_folder_id";

mobile/src/main/java/rs/readahead/washington/mobile/data/database/KeyDataSource.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class KeyDataSource {
1414
private final AsyncSubject<ResourceDataSource> asyncResourceSubject;
1515
private final AsyncSubject<GoogleDriveDataSource> asyncGoogleDriveSubject;
1616
private final AsyncSubject<DropBoxDataSource> asyncDropBoxSubject;
17+
private final AsyncSubject<NextCloudDataSource> asyncNextCloudSubject;
1718
private final Context context;
1819

1920
public KeyDataSource(Context context) {
@@ -23,6 +24,7 @@ public KeyDataSource(Context context) {
2324
asyncResourceSubject = AsyncSubject.create();
2425
asyncGoogleDriveSubject = AsyncSubject.create();
2526
asyncDropBoxSubject = AsyncSubject.create();
27+
asyncNextCloudSubject = AsyncSubject.create();
2628
}
2729

2830
public void initKeyDataSource() {
@@ -41,6 +43,9 @@ public void initKeyDataSource() {
4143

4244
asyncDropBoxSubject.onNext(DropBoxDataSource.getInstance(this.context, MyApplication.getMainKeyHolder().get().getKey().getEncoded()));
4345
asyncDropBoxSubject.onComplete();
46+
47+
asyncNextCloudSubject.onNext(NextCloudDataSource.getInstance(this.context, MyApplication.getMainKeyHolder().get().getKey().getEncoded()));
48+
asyncNextCloudSubject.onComplete();
4449
} catch (LifecycleMainKey.MainKeyUnavailableException e) {
4550
e.printStackTrace();
4651
}
@@ -66,5 +71,9 @@ public Observable<DropBoxDataSource> getDropBoxDataSource() {
6671
return asyncDropBoxSubject;
6772
}
6873

74+
public Observable<NextCloudDataSource> getNextCloudDataSource() {
75+
return asyncNextCloudSubject;
76+
}
77+
6978
}
7079

0 commit comments

Comments
 (0)