diff --git a/README.md b/README.md index 4537ddd960..0827778730 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ If you want to support Xabber development you can buy [Xabber VIP](https://play. [![Donate with PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G9AYTUSXCWRVL) +[![Patreon](https://c5.patreon.com/external/logo/become_a_patron_button.png)](https://www.patreon.com/xabber) + ## Feedback info [at] xabber.com diff --git a/xabber/build.gradle b/xabber/build.gradle index 0ada58ffac..42119a1d8d 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 27 - versionCode 467 - versionName '2.2.1(467)' + versionCode 468 + versionName '2.2.1(468)' } lintOptions { @@ -193,6 +193,15 @@ dependencies { } implementation group: 'org.bouncycastle', name: 'bcpkix-jdk15on', version: '1.58' + + // leak canary + debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4' + releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' + + // block canary + debugImplementation 'com.github.markzhai:blockcanary-android:1.5.0' + releaseCompile 'com.github.markzhai:blockcanary-no-op:1.5.0' + } apply plugin: 'com.google.gms.google-services' 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 67e4a7ccc5..83a9cf37e7 100644 --- a/xabber/src/main/java/com/xabber/android/data/Application.java +++ b/xabber/src/main/java/com/xabber/android/data/Application.java @@ -17,12 +17,15 @@ 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; @@ -57,8 +60,8 @@ import com.xabber.android.data.roster.RosterManager; import com.xabber.android.data.xaccount.XabberAccountManager; import com.xabber.android.service.XabberService; +import com.xabber.android.utils.AppBlockCanaryContext; -import io.fabric.sdk.android.Fabric; import org.jivesoftware.smack.provider.ProviderFileLoader; import org.jivesoftware.smack.provider.ProviderManager; @@ -74,6 +77,8 @@ import java.util.concurrent.Future; import java.util.concurrent.ThreadFactory; +import io.fabric.sdk.android.Fabric; + /** * Base entry point. * @@ -304,6 +309,30 @@ public boolean isClosing() { @Override public void onCreate() { super.onCreate(); + + if (BuildConfig.DEBUG) { + /** Leak Canary */ + if (LeakCanary.isInAnalyzerProcess(this)) { + // This process is dedicated to LeakCanary for heap analysis. + // You should not init your app in this process. + return; + } + LeakCanary.install(this); + + /** Block Canary */ + BlockCanary.install(this, new AppBlockCanaryContext()).start(); + + /** Android Dev Metrics */ + AndroidDevMetrics.initWith(this); + + /** Strict Mode */ + StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() + .detectAll() + .penaltyLog() + .build()); + } + + /** Crashlytics */ // Set up Crashlytics, disabled for debug builds Crashlytics crashlyticsKit = new Crashlytics.Builder() .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) @@ -314,10 +343,6 @@ public void onCreate() { Fabric.with(this, crashlyticsKit); } - if (BuildConfig.DEBUG) { - AndroidDevMetrics.initWith(this); - } - Thread.currentThread().setPriority(Thread.MAX_PRIORITY); addManagers(); diff --git a/xabber/src/main/java/com/xabber/android/data/database/sqlite/PhraseTable.java b/xabber/src/main/java/com/xabber/android/data/database/sqlite/PhraseTable.java index 1506a1115b..ee85616df7 100644 --- a/xabber/src/main/java/com/xabber/android/data/database/sqlite/PhraseTable.java +++ b/xabber/src/main/java/com/xabber/android/data/database/sqlite/PhraseTable.java @@ -133,7 +133,7 @@ public long write(Long id, String value, String user, String group, return id; } - void remove(long id) { + public void remove(long id) { SQLiteDatabase db = databaseManager.getWritableDatabase(); db.delete(NAME, Fields._ID + " = ?", new String[]{String.valueOf(id)}); diff --git a/xabber/src/main/java/com/xabber/android/data/message/phrase/PhraseManager.java b/xabber/src/main/java/com/xabber/android/data/message/phrase/PhraseManager.java index ebbeb17f78..32b805fc3d 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/phrase/PhraseManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/phrase/PhraseManager.java @@ -129,7 +129,11 @@ public void updateOrCreatePhrase(Phrase phrase, String value, String user, * @param index */ public void removePhrase(int index) { - phrases.remove(getPhrase(index)); + Phrase phrase = getPhrase(index); + if (phrase != null) { + phrases.remove(phrase); // remove from the local list + PhraseTable.getInstance().remove(phrase.getId()); // remove from database + } } private void writePhrase(final Phrase phrase, final String value, diff --git a/xabber/src/main/java/com/xabber/android/utils/AppBlockCanaryContext.java b/xabber/src/main/java/com/xabber/android/utils/AppBlockCanaryContext.java new file mode 100644 index 0000000000..5c604522c5 --- /dev/null +++ b/xabber/src/main/java/com/xabber/android/utils/AppBlockCanaryContext.java @@ -0,0 +1,20 @@ +package com.xabber.android.utils; + +import com.github.moduth.blockcanary.BlockCanaryContext; +import com.xabber.android.BuildConfig; + + +/** + * Configuration class. Used in Block Canary - ui-block detection library for Android + */ + +public class AppBlockCanaryContext extends BlockCanaryContext { + + public String provideQualifier() { + return BuildConfig.VERSION_NAME; + } + + public int provideBlockThreshold() { + return 1000; + } +}