diff --git a/.travis.yml b/.travis.yml
index 9900afd6f2..438f681437 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -20,9 +20,6 @@ android:
licenses:
- '.+'
-before_install:
-- yes | sdkmanager "platforms;android-27"
-
install:
# Check install section: http://docs.travis-ci.com/user/build-configuration/#install
# If you'd like to skip the install stage entirely, set it to true and nothing will be run.
diff --git a/build.gradle b/build.gradle
index a866675c2f..1d68e19cee 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,7 +6,7 @@ buildscript {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.3.2'
+ classpath 'com.android.tools.build:gradle:3.4.1'
classpath "io.realm:realm-gradle-plugin:3.1.1"
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
classpath 'com.frogermcs.androiddevmetrics:androiddevmetrics-plugin:0.4'
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000000..6f7b22ee93
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,4 @@
+android.enableJetifier=false
+android.useAndroidX=false
+android.enableR8=false
+android.enableUnitTestBinaryResources=false
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index f83d2a335a..0d3fb51ff3 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Fri Feb 15 11:01:28 YEKT 2019
+#Thu Apr 18 14:07:31 YEKT 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
diff --git a/xabber/build.gradle b/xabber/build.gradle
index 55ad17e937..53b172ee52 100644
--- a/xabber/build.gradle
+++ b/xabber/build.gradle
@@ -10,8 +10,9 @@ android {
defaultConfig {
minSdkVersion 15
targetSdkVersion 28
- versionCode 602
- versionName '2.6.3(602)'
+ versionCode 634
+ versionName '2.6.4(634)'
+ manifestPlaceholders = [crashlytics:getLocalProperty("crashlytics.key")]
}
lintOptions {
@@ -95,6 +96,12 @@ android {
universalApk true
}
}
+
+ testOptions {
+ unitTests {
+ includeAndroidResources = true
+ }
+ }
}
def build_param = "${build}";
@@ -108,6 +115,17 @@ if (build_param == "open") {
}
}
+def getLocalProperty(String propertyName) {
+ def propsFile = rootProject.file('local.properties')
+ if (propsFile.exists()) {
+ def props = new Properties()
+ props.load(new FileInputStream(propsFile))
+ return props[propertyName]
+ } else {
+ return ""
+ }
+}
+
ext {
smackVersion = '4.2.1-SNAPSHOT'
supportVersion = '28.0.0'
@@ -180,9 +198,14 @@ dependencies {
debugImplementation 'com.github.markzhai:blockcanary-android:1.5.0'
releaseImplementation 'com.github.markzhai:blockcanary-no-op:1.5.0'
+ // test
+ testImplementation 'junit:junit:4.12'
+ testImplementation "org.robolectric:robolectric:4.0"
+ testImplementation "org.robolectric:shadows-multidex:4.0.1"
}
apply plugin: 'com.google.gms.google-services'
configurations {
all*.exclude group: 'xpp3', module: 'xpp3'
+ all*.exclude group: 'com.google.guava', module:'guava-jdk5'
}
diff --git a/xabber/src/dev/res/values/preferences.xml b/xabber/src/dev/res/values/preferences.xml
index 224b22e6ad..eb82acccb9 100644
--- a/xabber/src/dev/res/values/preferences.xml
+++ b/xabber/src/dev/res/values/preferences.xml
@@ -17,5 +17,6 @@
true
true
+ false
diff --git a/xabber/src/dev/res/xml/preference_debug.xml b/xabber/src/dev/res/xml/preference_debug.xml
index 983205d8b4..db03248080 100644
--- a/xabber/src/dev/res/xml/preference_debug.xml
+++ b/xabber/src/dev/res/xml/preference_debug.xml
@@ -53,4 +53,18 @@
android:title="@string/debug_fetch_crowdfunding_feed_title">
+
+
+
+
+
+
\ No newline at end of file
diff --git a/xabber/src/main/AndroidManifest.xml b/xabber/src/main/AndroidManifest.xml
index 68d6000156..999b60e3d7 100644
--- a/xabber/src/main/AndroidManifest.xml
+++ b/xabber/src/main/AndroidManifest.xml
@@ -49,6 +49,12 @@
android:label="@string/application_title_full"
android:theme="@style/Theme"
tools:replace="label, icon, allowBackup">
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/xabber/src/main/java/com/xabber/android/data/ActivityManager.java b/xabber/src/main/java/com/xabber/android/data/ActivityManager.java
index 9c1947ed60..42ba4f7c89 100644
--- a/xabber/src/main/java/com/xabber/android/data/ActivityManager.java
+++ b/xabber/src/main/java/com/xabber/android/data/ActivityManager.java
@@ -23,7 +23,11 @@
import com.xabber.android.R;
import com.xabber.android.data.account.AccountManager;
import com.xabber.android.data.connection.CertificateManager;
+import com.xabber.android.data.extension.avatar.AvatarManager;
import com.xabber.android.data.log.LogManager;
+import com.xabber.android.data.push.SyncManager;
+import com.xabber.android.data.roster.RosterManager;
+import com.xabber.android.service.XabberService;
import com.xabber.android.ui.activity.AboutActivity;
import com.xabber.android.ui.activity.ContactListActivity;
import com.xabber.android.ui.activity.LoadActivity;
@@ -42,6 +46,7 @@
public class ActivityManager implements OnUnloadListener {
private static final String EXTRA_TASK_INDEX = "com.xabber.android.data.ActivityManager.EXTRA_TASK_INDEX";
+ private static final long START_SERVICE_DELAY = 1000;
private static final boolean LOG = true;
private static ActivityManager instance;
@@ -201,11 +206,30 @@ public void onResume(final Activity activity) {
if (LOG) {
LogManager.i(activity, "onResume");
}
- if (!application.isInitialized() && !(activity instanceof LoadActivity)) {
+ if((!application.isInitialized() || SyncManager.getInstance().isSyncMode())
+ && !Application.getInstance().isClosing()) {
+
if (LOG) {
LogManager.i(this, "Wait for loading");
}
- activity.startActivity(LoadActivity.createIntent(activity));
+ AccountManager.getInstance().onPreInitialize();
+ RosterManager.getInstance().onPreInitialize();
+ Application.getInstance().runInBackground(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Thread.sleep(START_SERVICE_DELAY);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ Application.getInstance().runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ activity.startService(XabberService.createIntent(activity));
+ }
+ });
+ }
+ });
}
if (onErrorListener != null) {
application.removeUIListener(OnErrorListener.class, onErrorListener);
@@ -221,6 +245,7 @@ public void onError(final int resourceId) {
CertificateManager.getInstance().registerActivity(activity);
AccountManager.getInstance().stopGracePeriod();
+ SyncManager.getInstance().onActivityResume();
}
/**
diff --git a/xabber/src/main/java/com/xabber/android/data/Application.java b/xabber/src/main/java/com/xabber/android/data/Application.java
index 6cd0bf4f21..cf991341c2 100644
--- a/xabber/src/main/java/com/xabber/android/data/Application.java
+++ b/xabber/src/main/java/com/xabber/android/data/Application.java
@@ -44,7 +44,8 @@
import com.xabber.android.data.extension.chat_markers.ChatMarkerManager;
import com.xabber.android.data.extension.cs.ChatStateManager;
import com.xabber.android.data.extension.httpfileupload.HttpFileUploadManager;
-import com.xabber.android.data.extension.mam.MamManager;
+import com.xabber.android.data.extension.iqlast.LastActivityInteractor;
+import com.xabber.android.data.extension.mam.NextMamManager;
import com.xabber.android.data.extension.muc.MUCManager;
import com.xabber.android.data.extension.otr.OTRManager;
import com.xabber.android.data.extension.ssn.SSNManager;
@@ -56,8 +57,11 @@
import com.xabber.android.data.message.ReceiptManager;
import com.xabber.android.data.message.chat.ChatManager;
import com.xabber.android.data.message.phrase.PhraseManager;
+import com.xabber.android.data.notification.DelayedNotificationActionManager;
import com.xabber.android.data.notification.NotificationManager;
import com.xabber.android.data.notification.custom_notification.CustomNotifyPrefsManager;
+import com.xabber.android.data.push.PushManager;
+import com.xabber.android.data.push.SyncManager;
import com.xabber.android.data.roster.GroupManager;
import com.xabber.android.data.roster.PresenceManager;
import com.xabber.android.data.roster.RosterManager;
@@ -349,6 +353,7 @@ public void onCreate() {
}
private void addManagers() {
+ addManager(SyncManager.getInstance());
addManager(SettingsManager.getInstance());
addManager(LogManager.getInstance());
addManager(DatabaseManager.getInstance());
@@ -383,9 +388,12 @@ private void addManagers() {
addManager(CarbonManager.getInstance());
addManager(HttpFileUploadManager.getInstance());
addManager(BlockingManager.getInstance());
- addManager(MamManager.getInstance());
+ addManager(NextMamManager.getInstance());
addManager(CertificateManager.getInstance());
addManager(XMPPAuthManager.getInstance());
+ addManager(PushManager.getInstance());
+ addManager(DelayedNotificationActionManager.getInstance());
+ addManager(LastActivityInteractor.getInstance());
}
/**
@@ -603,4 +611,7 @@ public void runOnUiThreadDelay(final Runnable runnable, long delayMillis) {
handler.postDelayed(runnable, delayMillis);
}
+ public boolean isServiceStarted() {
+ return serviceStarted;
+ }
}
diff --git a/xabber/src/main/java/com/xabber/android/data/SettingsManager.java b/xabber/src/main/java/com/xabber/android/data/SettingsManager.java
index 59e0ef1a60..68895142be 100644
--- a/xabber/src/main/java/com/xabber/android/data/SettingsManager.java
+++ b/xabber/src/main/java/com/xabber/android/data/SettingsManager.java
@@ -327,10 +327,10 @@ public static boolean eventsLightningForMuc() {
R.bool.events_lightning_default);
}
- public static boolean eventsPersistent() {
- return getBoolean(R.string.events_persistent_key,
- R.bool.events_persistent_default);
- }
+// public static boolean eventsPersistent() {
+// return getBoolean(R.string.events_persistent_key,
+// R.bool.events_persistent_default);
+// }
public static boolean eventsShowText() {
return getNotifBoolean(R.string.events_show_text_key,
@@ -367,9 +367,8 @@ public static boolean eventsOnMuc() {
// R.bool.events_in_app_preview_default);
// }
- @Deprecated
public static boolean eventsInChatSounds() {
- return getBoolean(R.string.events_in_chat_sounds_key,
+ return getNotifBoolean(R.string.events_in_chat_sounds_key,
R.bool.events_in_chat_sounds_default);
}
@@ -528,6 +527,11 @@ public static boolean connectionUseCarbons() {
R.bool.connection_use_carbons_default);
}
+ public static boolean connectionCompressImage() {
+ return getBoolean(R.string.connection_compress_image_on_upload_key,
+ R.bool.connection_compress_image_on_upload_default);
+ }
+
public static DnsResolverType connectionDnsResolver() {
String value = getString(R.string.connection_dns_resolver_type_key,
R.string.connection_dns_resolver_type_default);
@@ -600,6 +604,10 @@ public static boolean useDevelopAPI() {
return getBoolean(R.string.debug_use_develop_api_key, R.bool.debug_use_develop_api_default);
}
+ public static boolean syncBookmarksOnStart() {
+ return getBoolean(R.string.debug_sync_bookmarks_on_start_key, R.bool.debug_sync_bookmarks_on_start_default);
+ }
+
public static boolean isCrashReportsSupported() {
return BuildConfig.FLAVOR.equals("beta")
|| BuildConfig.FLAVOR.equals("vip")
@@ -854,6 +862,14 @@ public static int getLastCrowdfundingPosition() {
return getInteger(R.string.crowdfunding_last_position_key, 0);
}
+ public static void setEnabledPushNodes(String enabledPushNodes) {
+ setString(R.string.enabled_push_nodes, enabledPushNodes);
+ }
+
+ public static String getEnabledPushNodes() {
+ return getString(R.string.enabled_push_nodes, "");
+ }
+
public static void resetPreferences(Context context, String preferencesName) {
context.getSharedPreferences(preferencesName, Context.MODE_PRIVATE).edit().clear().apply();
}
diff --git a/xabber/src/main/java/com/xabber/android/data/TestApplication.java b/xabber/src/main/java/com/xabber/android/data/TestApplication.java
new file mode 100644
index 0000000000..04e1f4ac30
--- /dev/null
+++ b/xabber/src/main/java/com/xabber/android/data/TestApplication.java
@@ -0,0 +1,596 @@
+/**
+ * Copyright (c) 2013, Redsolution LTD. All rights reserved.
+ *
+ * This file is part of Xabber project; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License, Version 3.
+ *
+ * Xabber is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License,
+ * along with this program. If not, see http://www.gnu.org/licenses/.
+ */
+package com.xabber.android.data;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Handler;
+import android.os.StrictMode;
+import android.support.annotation.NonNull;
+import android.support.multidex.MultiDex;
+
+import com.crashlytics.android.Crashlytics;
+import com.crashlytics.android.core.CrashlyticsCore;
+import com.frogermcs.androiddevmetrics.AndroidDevMetrics;
+import com.github.moduth.blockcanary.BlockCanary;
+import com.squareup.leakcanary.LeakCanary;
+import com.xabber.android.BuildConfig;
+import com.xabber.android.R;
+import com.xabber.android.data.account.AccountManager;
+import com.xabber.android.data.account.ScreenManager;
+import com.xabber.android.data.connection.CertificateManager;
+import com.xabber.android.data.connection.ConnectionManager;
+import com.xabber.android.data.connection.NetworkManager;
+import com.xabber.android.data.connection.ReconnectionManager;
+import com.xabber.android.data.database.DatabaseManager;
+import com.xabber.android.data.extension.attention.AttentionManager;
+import com.xabber.android.data.extension.avatar.AvatarManager;
+import com.xabber.android.data.extension.avatar.AvatarStorage;
+import com.xabber.android.data.extension.blocking.BlockingManager;
+import com.xabber.android.data.extension.capability.CapabilitiesManager;
+import com.xabber.android.data.extension.carbons.CarbonManager;
+import com.xabber.android.data.extension.chat_markers.ChatMarkerManager;
+import com.xabber.android.data.extension.cs.ChatStateManager;
+import com.xabber.android.data.extension.httpfileupload.HttpFileUploadManager;
+import com.xabber.android.data.extension.iqlast.LastActivityInteractor;
+import com.xabber.android.data.extension.mam.NextMamManager;
+import com.xabber.android.data.extension.muc.MUCManager;
+import com.xabber.android.data.extension.otr.OTRManager;
+import com.xabber.android.data.extension.ssn.SSNManager;
+import com.xabber.android.data.extension.vcard.VCardManager;
+import com.xabber.android.data.http.CrowdfundingManager;
+import com.xabber.android.data.http.PatreonManager;
+import com.xabber.android.data.log.LogManager;
+import com.xabber.android.data.message.MessageManager;
+import com.xabber.android.data.message.ReceiptManager;
+import com.xabber.android.data.message.chat.ChatManager;
+import com.xabber.android.data.message.phrase.PhraseManager;
+import com.xabber.android.data.notification.DelayedNotificationActionManager;
+import com.xabber.android.data.notification.NotificationManager;
+import com.xabber.android.data.notification.custom_notification.CustomNotifyPrefsManager;
+import com.xabber.android.data.push.PushManager;
+import com.xabber.android.data.push.SyncManager;
+import com.xabber.android.data.roster.GroupManager;
+import com.xabber.android.data.roster.PresenceManager;
+import com.xabber.android.data.roster.RosterManager;
+import com.xabber.android.data.xaccount.XMPPAuthManager;
+import com.xabber.android.data.xaccount.XabberAccountManager;
+import com.xabber.android.service.XabberService;
+import com.xabber.android.utils.AppBlockCanaryContext;
+
+import org.jivesoftware.smack.provider.ProviderFileLoader;
+import org.jivesoftware.smack.provider.ProviderManager;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+
+import io.fabric.sdk.android.Fabric;
+
+/**
+ * Base entry point.
+ *
+ * @author alexander.ivanov
+ */
+public class TestApplication extends android.app.Application {
+
+ private static final String LOG_TAG = Application.class.getSimpleName();
+ private static TestApplication instance;
+ private final ArrayList