From 3ce6043c7a97c3ceb269e075a145b923bf7e4e82 Mon Sep 17 00:00:00 2001 From: VenomVendor Date: Sat, 22 Jul 2017 18:11:42 +0530 Subject: [PATCH 1/4] Updated gradle to the latest Updated support versions. Bump version for next release. --- app/build.gradle | 25 +++++--- build.gradle | 26 ++++---- gradle/wrapper/gradle-wrapper.jar | Bin 49896 -> 54720 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 78 +++++++++++++---------- gradlew.bat | 14 ++-- 6 files changed, 76 insertions(+), 71 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 42970df..05e7ab0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,26 +1,31 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 24 - buildToolsVersion "24.0.0" + compileSdkVersion 26 + buildToolsVersion '26.0.0' defaultConfig { - applicationId "com.venomvendor.sms.deduplicate" + applicationId 'com.venomvendor.sms.deduplicate' minSdkVersion 8 - targetSdkVersion 24 + targetSdkVersion 26 versionCode rootProject.ext.versionCode versionName rootProject.ext.versionName - jackOptions { - enabled rootProject.ext.enableJack + if (rootProject.ext.enableJack) { + jackOptions { + enabled false + } } } + flavorDimensions 'buildType' productFlavors { froyo { + dimension 'buildType' minSdkVersion 8 versionCode rootProject.ext.froyo } donut { + dimension 'buildType' minSdkVersion 4 maxSdkVersion 7 targetSdkVersion 7 @@ -37,6 +42,7 @@ android { storePassword KEYSTORE_PASSWORD } catch (ex) { + //noinspection GrUnresolvedAccess throw new InvalidUserDataException("You should define KEY_ALIAS, KEY_PASSWORD & " + "KEYSTORE_PASSWORD in gradle.properties. \n ${ex.getLocalizedMessage()}") } @@ -60,7 +66,7 @@ android { jniDebuggable rootProject.ext.DEBUG renderscriptDebuggable rootProject.ext.DEBUG pseudoLocalesEnabled rootProject.ext.DEBUG - shrinkResources rootProject.ext.DEBUG //Always True + shrinkResources !rootProject.ext.DEBUG minifyEnabled !rootProject.ext.DEBUG signingConfig signingConfigs.release versionNameSuffix rootProject.ext.DEBUG_SUFFIX @@ -79,10 +85,11 @@ android { lintOptions { checkReleaseBuilds rootProject.ext.checkReleaseBuilds abortOnError rootProject.ext.abortOnError + disable 'IconMissingDensityFolder' } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_6 - targetCompatibility JavaVersion.VERSION_1_6 + sourceCompatibility 1.8 + targetCompatibility 1.8 } } diff --git a/build.gradle b/build.gradle index da1ad40..425ed11 100644 --- a/build.gradle +++ b/build.gradle @@ -1,20 +1,11 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. - buildscript { repositories { jcenter() + maven { url 'https://maven.google.com' } } dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - jcenter() + classpath 'com.android.tools.build:gradle:3.0.0-alpha7' } } @@ -22,10 +13,15 @@ task clean(type: Delete) { delete rootProject.buildDir } +task wrapper(type: Wrapper) { + // Execute "./gradlew wrapper --distribution-type=all" when modified. + gradleVersion = '4.1-milestone-1' +} + ext { DEBUG = true - MAJOR = 1 - MINOR = 1 + MAJOR = 2 + MINOR = 0 PATCH = 0 RELEASE_SUFFIX = '' //"alpha/beta/debug" TODO-Always check during release. DEBUG_SUFFIX = "${RELEASE_SUFFIX}-debug" @@ -36,10 +32,10 @@ ext { KEY_LOCATION = '../key.keystore' abortOnError = false checkReleaseBuilds = true - enableJack = true + enableJack = false } -def computeVersionName() { +def static computeVersionName() { def format = 'YYMMddHHmm' def date = new Date() def formattedDate = date.format(format) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 8c0fb64a8698b08ecc4158d828ca593c4928e9dd..eb4ea524ad390fed697eb00ff23f780a5f9cb65d 100644 GIT binary patch delta 48661 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,31 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -90,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -114,6 +113,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` @@ -154,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec9973..e95643d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line From a1fb394827841fc7c814f9047aaefd1d4e08ab88 Mon Sep 17 00:00:00 2001 From: VenomVendor Date: Sat, 22 Jul 2017 18:19:30 +0530 Subject: [PATCH 2/4] Updated Proguard rules. --- app/build.gradle | 5 +- app/pro-guard/proguard-optimize.pro | 64 +++++ app/pro-guard/proguard-rules-aggressive.pro | 283 ++++++++++++++++++++ app/pro-guard/proguard-rules-consumer.pro | 20 ++ app/pro-guard/proguard-rules-log.pro | 10 + app/proguard-rules.pro | 17 -- 6 files changed, 381 insertions(+), 18 deletions(-) create mode 100644 app/pro-guard/proguard-optimize.pro create mode 100644 app/pro-guard/proguard-rules-aggressive.pro create mode 100644 app/pro-guard/proguard-rules-consumer.pro create mode 100644 app/pro-guard/proguard-rules-log.pro delete mode 100644 app/proguard-rules.pro diff --git a/app/build.gradle b/app/build.gradle index 05e7ab0..37f3591 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,10 @@ android { minifyEnabled rootProject.ext.DEBUG signingConfig signingConfigs.release versionNameSuffix rootProject.ext.RELEASE_SUFFIX - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + proguardFiles './pro-guard/proguard-optimize.pro', + './pro-guard/proguard-rules-aggressive.pro', + './pro-guard/proguard-rules-consumer.pro', + './pro-guard/proguard-rules-log.pro' } debug { debuggable rootProject.ext.DEBUG diff --git a/app/pro-guard/proguard-optimize.pro b/app/pro-guard/proguard-optimize.pro new file mode 100644 index 0000000..fe79ea6 --- /dev/null +++ b/app/pro-guard/proguard-optimize.pro @@ -0,0 +1,64 @@ +-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* +-optimizationpasses 5 +-allowaccessmodification +-dontpreverify + +# The remainder of this file is identical to the non-optimized version +# of the Proguard configuration file (except that the other file has +# flags to turn off optimization). + +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-verbose + +-keepattributes *Annotation* +-keep public class com.google.vending.licensing.ILicensingService +-keep public class com.android.vending.licensing.ILicensingService + +# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native +-keepclasseswithmembernames class * { + native ; +} + +# keep setters in Views so that animations can still work. +# see http://proguard.sourceforge.net/manual/examples.html#beans +-keepclassmembers public class * extends android.view.View { + void set*(***); + *** get*(); +} + +# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keepclassmembers class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator CREATOR; +} + +-keepclassmembers class **.R$* { + public static ; +} + +# The support library contains references to newer platform versions. +# Don't warn about those in case this app is linking against an older +# platform version. We know about them, and they are safe. +-dontwarn android.support.** + +# Understand the @Keep support annotation. +-keep class android.support.annotation.Keep + +-keep @android.support.annotation.Keep class * {*;} + +-keepclasseswithmembers class * { + @android.support.annotation.Keep ; +} + +-keepclasseswithmembers class * { + @android.support.annotation.Keep ; +} + +-keepclasseswithmembers class * { + @android.support.annotation.Keep (...); +} diff --git a/app/pro-guard/proguard-rules-aggressive.pro b/app/pro-guard/proguard-rules-aggressive.pro new file mode 100644 index 0000000..17a31c8 --- /dev/null +++ b/app/pro-guard/proguard-rules-aggressive.pro @@ -0,0 +1,283 @@ +# ########################################AGGRESSIVE######################################### # +-allowaccessmodification +-mergeinterfacesaggressively +# -overloadaggressively +-useuniqueclassmembernames + +# Remove - Math method calls. Remove all invocations of Math +# methods without side effects whose return values are not used. +-assumenosideeffects public class java.lang.Math { + public static double sin(double); + public static double cos(double); + public static double tan(double); + public static double asin(double); + public static double acos(double); + public static double atan(double); + public static double toRadians(double); + public static double toDegrees(double); + public static double exp(double); + public static double log(double); + public static double log10(double); + public static double sqrt(double); + public static double cbrt(double); + public static double IEEEremainder(double,double); + public static double ceil(double); + public static double floor(double); + public static double rint(double); + public static double atan2(double,double); + public static double pow(double,double); + public static int round(float); + public static long round(double); + public static double random(); + public static int abs(int); + public static long abs(long); + public static float abs(float); + public static double abs(double); + public static int max(int,int); + public static long max(long,long); + public static float max(float,float); + public static double max(double,double); + public static int min(int,int); + public static long min(long,long); + public static float min(float,float); + public static double min(double,double); + public static double ulp(double); + public static float ulp(float); + public static double signum(double); + public static float signum(float); + public static double sinh(double); + public static double cosh(double); + public static double tanh(double); + public static double hypot(double,double); + public static double expm1(double); + public static double log1p(double); +} + +# Remove - Number method calls. Remove all invocations of Number +# methods without side effects whose return values are not used. +-assumenosideeffects public class java.lang.* extends java.lang.Number { + public static java.lang.String toString(byte); + public static java.lang.Byte valueOf(byte); + public static byte parseByte(java.lang.String); + public static byte parseByte(java.lang.String,int); + public static java.lang.Byte valueOf(java.lang.String,int); + public static java.lang.Byte valueOf(java.lang.String); + public static java.lang.Byte decode(java.lang.String); + public int compareTo(java.lang.Byte); + public static java.lang.String toString(short); + public static short parseShort(java.lang.String); + public static short parseShort(java.lang.String,int); + public static java.lang.Short valueOf(java.lang.String,int); + public static java.lang.Short valueOf(java.lang.String); + public static java.lang.Short valueOf(short); + public static java.lang.Short decode(java.lang.String); + public static short reverseBytes(short); + public int compareTo(java.lang.Short); + public static java.lang.String toString(int,int); + public static java.lang.String toHexString(int); + public static java.lang.String toOctalString(int); + public static java.lang.String toBinaryString(int); + public static java.lang.String toString(int); + public static int parseInt(java.lang.String,int); + public static int parseInt(java.lang.String); + public static java.lang.Integer valueOf(java.lang.String,int); + public static java.lang.Integer valueOf(java.lang.String); + public static java.lang.Integer valueOf(int); + public static java.lang.Integer getInteger(java.lang.String); + public static java.lang.Integer getInteger(java.lang.String,int); + public static java.lang.Integer getInteger(java.lang.String,java.lang.Integer); + public static java.lang.Integer decode(java.lang.String); + public static int highestOneBit(int); + public static int lowestOneBit(int); + public static int numberOfLeadingZeros(int); + public static int numberOfTrailingZeros(int); + public static int bitCount(int); + public static int rotateLeft(int,int); + public static int rotateRight(int,int); + public static int reverse(int); + public static int signum(int); + public static int reverseBytes(int); + public int compareTo(java.lang.Integer); + public static java.lang.String toString(long,int); + public static java.lang.String toHexString(long); + public static java.lang.String toOctalString(long); + public static java.lang.String toBinaryString(long); + public static java.lang.String toString(long); + public static long parseLong(java.lang.String,int); + public static long parseLong(java.lang.String); + public static java.lang.Long valueOf(java.lang.String,int); + public static java.lang.Long valueOf(java.lang.String); + public static java.lang.Long valueOf(long); + public static java.lang.Long decode(java.lang.String); + public static java.lang.Long getLong(java.lang.String); + public static java.lang.Long getLong(java.lang.String,long); + public static java.lang.Long getLong(java.lang.String,java.lang.Long); + public static long highestOneBit(long); + public static long lowestOneBit(long); + public static int numberOfLeadingZeros(long); + public static int numberOfTrailingZeros(long); + public static int bitCount(long); + public static long rotateLeft(long,int); + public static long rotateRight(long,int); + public static long reverse(long); + public static int signum(long); + public static long reverseBytes(long); + public int compareTo(java.lang.Long); + public static java.lang.String toString(float); + public static java.lang.String toHexString(float); + public static java.lang.Float valueOf(java.lang.String); + public static java.lang.Float valueOf(float); + public static float parseFloat(java.lang.String); + public static boolean isNaN(float); + public static boolean isInfinite(float); + public static int floatToIntBits(float); + public static int floatToRawIntBits(float); + public static float intBitsToFloat(int); + public static int compare(float,float); + public boolean isNaN(); + public boolean isInfinite(); + public int compareTo(java.lang.Float); + public static java.lang.String toString(double); + public static java.lang.String toHexString(double); + public static java.lang.Double valueOf(java.lang.String); + public static java.lang.Double valueOf(double); + public static double parseDouble(java.lang.String); + public static boolean isNaN(double); + public static boolean isInfinite(double); + public static long doubleToLongBits(double); + public static long doubleToRawLongBits(double); + public static double longBitsToDouble(long); + public static int compare(double,double); + public boolean isNaN(); + public boolean isInfinite(); + public int compareTo(java.lang.Double); + public (byte); + public (short); + public (int); + public (long); + public (float); + public (double); + public (java.lang.String); + public byte byteValue(); + public short shortValue(); + public int intValue(); + public long longValue(); + public float floatValue(); + public double doubleValue(); + public int compareTo(java.lang.Object); + public boolean equals(java.lang.Object); + public int hashCode(); + public java.lang.String toString(); +} + +# Remove - String method calls. Remove all invocations of String +# methods without side effects whose return values are not used. +-assumenosideeffects public class java.lang.String { + public (); + public (byte[]); + public (byte[],int); + public (byte[],int,int); + public (byte[],int,int,int); + public (byte[],int,int,java.lang.String); + public (byte[],java.lang.String); + public (char[]); + public (char[],int,int); + public (java.lang.String); + public (java.lang.StringBuffer); + public static java.lang.String copyValueOf(char[]); + public static java.lang.String copyValueOf(char[],int,int); + public static java.lang.String valueOf(boolean); + public static java.lang.String valueOf(char); + public static java.lang.String valueOf(char[]); + public static java.lang.String valueOf(char[],int,int); + public static java.lang.String valueOf(double); + public static java.lang.String valueOf(float); + public static java.lang.String valueOf(int); + public static java.lang.String valueOf(java.lang.Object); + public static java.lang.String valueOf(long); + public boolean contentEquals(java.lang.StringBuffer); + public boolean endsWith(java.lang.String); + public boolean equalsIgnoreCase(java.lang.String); + public boolean equals(java.lang.Object); + public boolean matches(java.lang.String); + public boolean regionMatches(boolean,int,java.lang.String,int,int); + public boolean regionMatches(int,java.lang.String,int,int); + public boolean startsWith(java.lang.String); + public boolean startsWith(java.lang.String,int); + public byte[] getBytes(); + public byte[] getBytes(java.lang.String); + public char charAt(int); + public char[] toCharArray(); + public int compareToIgnoreCase(java.lang.String); + public int compareTo(java.lang.Object); + public int compareTo(java.lang.String); + public int hashCode(); + public int indexOf(int); + public int indexOf(int,int); + public int indexOf(java.lang.String); + public int indexOf(java.lang.String,int); + public int lastIndexOf(int); + public int lastIndexOf(int,int); + public int lastIndexOf(java.lang.String); + public int lastIndexOf(java.lang.String,int); + public int length(); + public java.lang.CharSequence subSequence(int,int); + public java.lang.String concat(java.lang.String); + public java.lang.String replaceAll(java.lang.String,java.lang.String); + public java.lang.String replace(char,char); + public java.lang.String replaceFirst(java.lang.String,java.lang.String); + public java.lang.String[] split(java.lang.String); + public java.lang.String[] split(java.lang.String,int); + public java.lang.String substring(int); + public java.lang.String substring(int,int); + public java.lang.String toLowerCase(); + public java.lang.String toLowerCase(java.util.Locale); + public java.lang.String toString(); + public java.lang.String toUpperCase(); + public java.lang.String toUpperCase(java.util.Locale); + public java.lang.String trim(); +} + +# Remove - StringBuffer method calls. Remove all invocations of StringBuffer +# methods without side effects whose return values are not used. +-assumenosideeffects public class java.lang.StringBuffer { + public (); + public (int); + public (java.lang.String); + public (java.lang.CharSequence); + public java.lang.String toString(); + public char charAt(int); + public int capacity(); + public int codePointAt(int); + public int codePointBefore(int); + public int indexOf(java.lang.String,int); + public int lastIndexOf(java.lang.String); + public int lastIndexOf(java.lang.String,int); + public int length(); + public java.lang.String substring(int); + public java.lang.String substring(int,int); +} + +# Remove - StringBuilder method calls. Remove all invocations of StringBuilder +# methods without side effects whose return values are not used. +-assumenosideeffects public class java.lang.StringBuilder { + public (); + public (int); + public (java.lang.String); + public (java.lang.CharSequence); + public java.lang.String toString(); + public char charAt(int); + public int capacity(); + public int codePointAt(int); + public int codePointBefore(int); + public int indexOf(java.lang.String,int); + public int lastIndexOf(java.lang.String); + public int lastIndexOf(java.lang.String,int); + public int length(); + public java.lang.String substring(int); + public java.lang.String substring(int,int); +} + +-keepclasseswithmembers,allowshrinking class * { + native ; +} diff --git a/app/pro-guard/proguard-rules-consumer.pro b/app/pro-guard/proguard-rules-consumer.pro new file mode 100644 index 0000000..5ec1f36 --- /dev/null +++ b/app/pro-guard/proguard-rules-consumer.pro @@ -0,0 +1,20 @@ +# Prougard rules for all modules goes here. + +#Keep model, but still obfuscate +-keep,allowobfuscation class **.model.** { *; } + +# Repack in 'd' +-repackageclasses 'd' + +# Preserve the line number information for debugging stack traces. +-keepattributes SourceFile,LineNumberTable + +# Keep the line number information, hide the original source file name. +-renamesourcefileattribute SourceFile + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +-keepclassmembers class fqcn.of.javascript.interface.for.webview { + public *; +} diff --git a/app/pro-guard/proguard-rules-log.pro b/app/pro-guard/proguard-rules-log.pro new file mode 100644 index 0000000..44e5e66 --- /dev/null +++ b/app/pro-guard/proguard-rules-log.pro @@ -0,0 +1,10 @@ +# Remove Log +-assumenosideeffects class android.util.Log { + public static boolean isLoggable(java.lang.String, int); + public static *** d(...); + public static *** v(...); + public static *** i(...); + public static *** w(...); + public static *** e(...); + public static *** wtf(...); +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro deleted file mode 100644 index 8488275..0000000 --- a/app/proguard-rules.pro +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /Volumes/Data/Android/SDK/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} From 9d6b68fb91c4870b3dd0ccffc16bb201e90a9c24 Mon Sep 17 00:00:00 2001 From: VenomVendor Date: Sat, 22 Jul 2017 19:17:33 +0530 Subject: [PATCH 3/4] Fixes #5 In some devices android service was not starting, this was the reason behind app getting struck at 0/0 during deletion. Removed deletion in service & made it in async task. Added support for deleting multiple sms at once --- app/src/main/AndroidManifest.xml | 10 +- .../deduplicate/activity/Deduplication.java | 228 ++++++++++-------- .../sms/deduplicate/data/DuplicateList.java | 18 ++ .../sms/deduplicate/data/FindDuplicates.java | 76 +++--- .../deduplicate/service/DeleteSMSAsync.java | 66 +++++ .../deduplicate/service/DeleteSmsService.java | 145 ----------- .../service/OnDeletedListener.java | 6 + .../sms/deduplicate/util/Constants.java | 8 +- .../res/layout/activity_deduplication.xml | 21 +- app/src/main/res/values/strings.xml | 1 + 10 files changed, 282 insertions(+), 297 deletions(-) create mode 100644 app/src/main/java/com/venomvendor/sms/deduplicate/data/DuplicateList.java create mode 100644 app/src/main/java/com/venomvendor/sms/deduplicate/service/DeleteSMSAsync.java delete mode 100644 app/src/main/java/com/venomvendor/sms/deduplicate/service/DeleteSmsService.java create mode 100644 app/src/main/java/com/venomvendor/sms/deduplicate/service/OnDeletedListener.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 54ab0b1..d5834da 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,7 @@ + package="com.venomvendor.sms.deduplicate"> @@ -17,7 +16,9 @@ android:theme="@style/AppTheme" tools:ignore="GoogleAppIndexingWarning,UnusedAttribute"> - + @@ -81,9 +82,6 @@ - diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java b/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java index 78594ec..3225b68 100644 --- a/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java +++ b/app/src/main/java/com/venomvendor/sms/deduplicate/activity/Deduplication.java @@ -20,25 +20,25 @@ import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; -import android.app.Dialog; -import android.content.BroadcastReceiver; -import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; +import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; +import android.os.Handler; import android.preference.PreferenceManager; import android.provider.Telephony; import android.provider.Telephony.Sms; import android.text.Html; +import android.text.TextUtils; import android.view.Gravity; import android.view.View; import android.widget.Button; import android.widget.CheckedTextView; +import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.RadioButton; @@ -47,8 +47,8 @@ import com.venomvendor.sms.deduplicate.R; import com.venomvendor.sms.deduplicate.data.FindDuplicates; -import com.venomvendor.sms.deduplicate.data.FindDuplicates.OnDuplicatesFoundListener; -import com.venomvendor.sms.deduplicate.service.DeleteSmsService; +import com.venomvendor.sms.deduplicate.service.DeleteSMSAsync; +import com.venomvendor.sms.deduplicate.service.OnDeletedListener; import com.venomvendor.sms.deduplicate.util.Constants; import com.venomvendor.sms.deduplicate.util.Utils; @@ -59,16 +59,16 @@ /* * Created by VenomVendor on 11/8/15. */ -@SuppressWarnings("NullableProblems") public class Deduplication extends Activity implements View.OnClickListener { private static final int APP_CHANGE_REQUEST = 253; private static final int UPDATE_PERMISSIONS = 254; private static final int RUNTIME_PERMISSIONS_CODE = 255; - private final String[] mRequiredPermissions = {permission.READ_SMS}; - - private Intent mService; - + private static final String[] REQUIRED_PERMISSIONS = {permission.READ_SMS}; + private static final String DEFAULT_DEL = "50"; + private String mFormat; + private DeleteSMSAsync mSmsDeleter; + private int mTotalMessages; private LinearLayout mProgressBarHolder; private ProgressBar mProgressBar; private Button mDeDuplicate; @@ -76,45 +76,19 @@ public class Deduplication extends Activity implements View.OnClickListener { private Button mRevert; private TextView mDeleted; private TextView mRevertMessage; + private EditText mDeleteBy; private CheckedTextView mIgnoreTimestamp; private LinearLayout mIgnoreMessage; private RadioButton mKeepFirst; private SharedPreferences mPref; - private final BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - int totalMessages = intent.getIntExtra(Constants.TOTAL_MSGS, 0); - int deletedMessages = intent.getIntExtra(Constants.DELETED_MSGS, 0); - if (intent.getBooleanExtra(Constants.INTERRUPTED, false)) { - cancelDeletion(); - mCancel.setEnabled(true); - mCancel.setClickable(true); - mCancel.setText(android.R.string.cancel); - mDeDuplicate.setVisibility(View.VISIBLE); - mProgressBarHolder.setVisibility(View.GONE); - - String format = getResources().getQuantityString(R.plurals.deleted_messages, totalMessages); - Toast toast = Toast.makeText(context, String.format(format, deletedMessages, totalMessages), Toast.LENGTH_SHORT); - toast.setGravity(Gravity.CENTER, 0, 0); - toast.show(); - } - - String format = getResources().getQuantityString(R.plurals.deleted_messages, totalMessages); - - mDeleted.setText(String.format(format, deletedMessages, totalMessages)); - mProgressBar.setMax(totalMessages); - mProgressBar.setProgress(deletedMessages); - } - }; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_deduplication); - mPref = PreferenceManager.getDefaultSharedPreferences(this); + mPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); if (mPref.getBoolean(Constants.SHOW_EULA, true)) { showEula(); @@ -129,7 +103,7 @@ private void showEula() { .setMessage(getString(R.string.eula)) .setCancelable(false) .setPositiveButton(android.R.string.ok, - new Dialog.OnClickListener() { + new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { SharedPreferences.Editor editor = mPref.edit(); @@ -140,7 +114,7 @@ public void onClick(DialogInterface dialog, int which) { } }) .setNegativeButton(android.R.string.cancel, - new Dialog.OnClickListener() { + new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); @@ -150,16 +124,19 @@ public void onClick(DialogInterface dialog, int which) { } private void initViews() { - mDeDuplicate = (Button) findViewById(R.id.deduplicate); - mCancel = (Button) findViewById(R.id.cancel); - mRevert = (Button) findViewById(R.id.revert); - mDeleted = (TextView) findViewById(R.id.current_progress); - mRevertMessage = (TextView) findViewById(R.id.revert_message); - mProgressBarHolder = (LinearLayout) findViewById(R.id.progress_bar_holder); - mProgressBar = (ProgressBar) findViewById(R.id.progress_bar); - mIgnoreTimestamp = (CheckedTextView) findViewById(R.id.ignore_timestamp); - mIgnoreMessage = (LinearLayout) findViewById(R.id.ignore_timestamp_message); - mKeepFirst = (RadioButton) findViewById(R.id.keep_first); + mPref = null; + + mDeDuplicate = findViewById(R.id.deduplicate); + mCancel = findViewById(R.id.cancel); + mRevert = findViewById(R.id.revert); + mDeleted = findViewById(R.id.current_progress); + mRevertMessage = findViewById(R.id.revert_message); + mProgressBarHolder = findViewById(R.id.progress_bar_holder); + mProgressBar = findViewById(R.id.progress_bar); + mIgnoreTimestamp = findViewById(R.id.ignore_timestamp); + mIgnoreMessage = findViewById(R.id.ignore_timestamp_message); + mKeepFirst = findViewById(R.id.keep_first); + mDeleteBy = findViewById(R.id.per_iteration); initListeners(); } @@ -172,15 +149,13 @@ private void initListeners() { mRevert.setOnClickListener(this); mIgnoreTimestamp.setOnClickListener(this); - if (getIntent().getBooleanExtra(Constants.FROM_SERVICE, false)) { - doCancel(); - } - if (!isValidMessageApp(this)) { - SharedPreferences mPref = PreferenceManager.getDefaultSharedPreferences(this); - SharedPreferences.Editor mEditor = mPref.edit(); - mEditor.putString(Constants.CURRENT_SMS_APP, Sms.getDefaultSmsPackage(this)); - mEditor.apply(); + SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences( + getApplicationContext()); + SharedPreferences.Editor editor = pref.edit(); + editor.putString(Constants.CURRENT_SMS_APP, + Sms.getDefaultSmsPackage(getApplicationContext())); + editor.apply(); mRevert.setVisibility(View.GONE); } @@ -197,17 +172,17 @@ private void initListeners() { @TargetApi(Build.VERSION_CODES.M) private void checkPermissions() { - if (checkSelfPermission(mRequiredPermissions[0]) != PackageManager.PERMISSION_GRANTED) { - if (shouldShowRequestPermissionRationale(mRequiredPermissions[0])) { - + if (checkSelfPermission(REQUIRED_PERMISSIONS[0]) != PackageManager.PERMISSION_GRANTED) { + if (shouldShowRequestPermissionRationale(REQUIRED_PERMISSIONS[0])) { //Educate User - showCustomDialog(getString(R.string.required_permissions), getString(R.string.m_permission_inform), + showCustomDialog(getString(R.string.required_permissions), + getString(R.string.m_permission_inform), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //ask permissions. - requestPermissions(mRequiredPermissions, RUNTIME_PERMISSIONS_CODE); + requestPermissions(REQUIRED_PERMISSIONS, RUNTIME_PERMISSIONS_CODE); } }, new DialogInterface.OnClickListener() { @Override @@ -222,7 +197,8 @@ public void onClick(DialogInterface dialog, int which) { } @Override - public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { + public void onRequestPermissionsResult(int requestCode, String permissions[], + int[] grantResults) { switch (requestCode) { case RUNTIME_PERMISSIONS_CODE: { // If request is cancelled, the result arrays are empty. @@ -241,7 +217,8 @@ private void permissionsDenied() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Intent intent = new Intent( + android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, UPDATE_PERMISSIONS); } @@ -281,14 +258,6 @@ public void onClick(DialogInterface dialog, int which) { ); } - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - if (intent.getBooleanExtra(Constants.FROM_SERVICE, false)) { - doCancel(); - } - } - private void showHideWarning() { mKeepFirst.setChecked(true); mIgnoreTimestamp.setChecked(!mIgnoreTimestamp.isChecked()); @@ -296,19 +265,31 @@ private void showHideWarning() { } private void doCancel() { + mSmsDeleter.doCancel(); + mCancel.setEnabled(false); mCancel.setClickable(false); mCancel.setText(R.string.cancelling); mDeDuplicate.setVisibility(View.GONE); mProgressBarHolder.setVisibility(View.VISIBLE); - cancelDeletion(); } private void cancelDeletion() { - if (mService == null) { - mService = new Intent(this, DeleteSmsService.class); - } - stopService(mService); + mCancel.setEnabled(true); + mCancel.setClickable(true); + mCancel.setText(android.R.string.cancel); + mDeDuplicate.setVisibility(View.VISIBLE); + mProgressBarHolder.setVisibility(View.GONE); + revertApp(); + } + + private void revertApp() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + Utils.revertOldApp(getApplicationContext()); + } + }, 3000); } @TargetApi(Build.VERSION_CODES.KITKAT) @@ -316,7 +297,8 @@ private void deduplicate() { mProgressBar.setMax(0); mProgressBar.setProgress(0); - mDeleted.setText(String.format(getResources().getQuantityString(R.plurals.deleted_messages, 0), 0, 0)); + mDeleted.setText(String.format(getResources() + .getQuantityString(R.plurals.deleted_messages, 0), 0, 0)); mProgressBarHolder.setVisibility(View.GONE); if (!isValidMessageApp(this)) { Intent setApp = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); @@ -331,16 +313,19 @@ private void showWarning() { AlertDialog.Builder warningDialog = new AlertDialog.Builder(this); warningDialog.setMessage(R.string.warning_message); warningDialog.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int id) { findDuplicates(); } }); - warningDialog.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.dismiss(); - } - }); + warningDialog.setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + dialog.dismiss(); + } + }); AlertDialog dialog = warningDialog.create(); dialog.setCancelable(false); @@ -348,12 +333,15 @@ public void onClick(DialogInterface dialog, int id) { } private void findDuplicates() { - FindDuplicates findDuplicates = new FindDuplicates(this, mIgnoreTimestamp.isChecked(), mKeepFirst.isChecked()); - findDuplicates.setOnDuplicatesFoundListener(new OnDuplicatesFoundListener() { + FindDuplicates findDuplicates = new FindDuplicates(this, + mIgnoreTimestamp.isChecked(), + mKeepFirst.isChecked()); + findDuplicates.setOnDuplicatesFoundListener(new FindDuplicates.OnDuplicatesFoundListener() { @Override public void duplicatesFound(ArrayList duplicateIds) { if (duplicateIds.isEmpty()) { - Toast.makeText(getApplicationContext(), R.string.no_duplicates, Toast.LENGTH_SHORT).show(); + Toast.makeText(getApplicationContext(), R.string.no_duplicates, + Toast.LENGTH_SHORT).show(); Utils.revertOldApp(getApplicationContext()); } else { mDeDuplicate.setVisibility(View.GONE); @@ -366,9 +354,45 @@ public void duplicatesFound(ArrayList duplicateIds) { } private void startDeleteService(ArrayList duplicateIds) { - mService = new Intent(this, DeleteSmsService.class); - mService.putStringArrayListExtra(Constants.DUPLICATE_IDS, duplicateIds); - startService(mService); + mTotalMessages = duplicateIds.size(); + mFormat = getResources().getQuantityString(R.plurals.deleted_messages, mTotalMessages); + + mProgressBar.setMax(mTotalMessages); + + String del = mDeleteBy.getText().toString().trim(); + del = TextUtils.isEmpty(del) ? DEFAULT_DEL : del; + int deleteBy = Math.abs(Integer.valueOf(del)); + + mSmsDeleter = new DeleteSMSAsync(this, duplicateIds, deleteBy, new OnDeletedListener() { + @Override + public void onResponse(final int deletedMsgs, final boolean interrupted) { + updateDeletedItems(deletedMsgs, interrupted); + } + }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + mSmsDeleter.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } else { + mSmsDeleter.execute(); + } + } + + private void updateDeletedItems(int deletedMsgs, boolean interrupted) { + runOnUiThread(new Runnable() { + @Override + public void run() { + mDeleted.setText(String.format(mFormat, deletedMsgs, mTotalMessages)); + if (interrupted) { + showToast(String.format(mFormat, deletedMsgs, mTotalMessages)); + cancelDeletion(); + } + } + }); + } + + private void showToast(String message) { + Toast toast = Toast.makeText(this, message, Toast.LENGTH_SHORT); + toast.setGravity(Gravity.CENTER, 0, 0); + toast.show(); } @TargetApi(Build.VERSION_CODES.M) @@ -391,13 +415,12 @@ public void onClick(DialogInterface dialog, int which) { }, null); } } else if (requestCode == UPDATE_PERMISSIONS) { - if (checkSelfPermission(mRequiredPermissions[0]) != PackageManager.PERMISSION_GRANTED) { + if (checkSelfPermission(REQUIRED_PERMISSIONS[0]) != PackageManager.PERMISSION_GRANTED) { deadLock(); } } else { super.onActivityResult(requestCode, resultCode, data); } - } @Override @@ -406,34 +429,25 @@ public void onClick(View view) { case R.id.deduplicate: deduplicate(); break; + case R.id.more_apps: Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("market://search?q=pub:VenomVendor")); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); break; + case R.id.cancel: doCancel(); break; + case R.id.revert: Utils.revertOldApp(getApplicationContext()); break; + case R.id.ignore_timestamp: showHideWarning(); break; } } - - @Override - protected void onPause() { - unregisterReceiver(mMessageReceiver); - super.onPause(); - } - - @Override - protected void onResume() { - super.onResume(); - IntentFilter filter = new IntentFilter(); - filter.addAction(Constants.INTENT_FILTER); - registerReceiver(mMessageReceiver, filter); - } } diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/data/DuplicateList.java b/app/src/main/java/com/venomvendor/sms/deduplicate/data/DuplicateList.java new file mode 100644 index 0000000..a0e06f9 --- /dev/null +++ b/app/src/main/java/com/venomvendor/sms/deduplicate/data/DuplicateList.java @@ -0,0 +1,18 @@ +package com.venomvendor.sms.deduplicate.data; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class DuplicateList extends ArrayList { + + public DuplicateList(Collection collection) { + super(collection); + } + + public List splice(int fromIndex, int toIndex) { + DuplicateList splicedList = new DuplicateList<>(subList(fromIndex, toIndex)); + removeRange(fromIndex, splicedList.size()); + return splicedList; + } +} diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/data/FindDuplicates.java b/app/src/main/java/com/venomvendor/sms/deduplicate/data/FindDuplicates.java index c817aba..c48c830 100644 --- a/app/src/main/java/com/venomvendor/sms/deduplicate/data/FindDuplicates.java +++ b/app/src/main/java/com/venomvendor/sms/deduplicate/data/FindDuplicates.java @@ -16,6 +16,7 @@ package com.venomvendor.sms.deduplicate.data; +import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; @@ -23,6 +24,7 @@ import android.database.Cursor; import android.os.AsyncTask; +import com.venomvendor.sms.deduplicate.BuildConfig; import com.venomvendor.sms.deduplicate.R; import com.venomvendor.sms.deduplicate.util.Constants; @@ -34,9 +36,10 @@ */ public class FindDuplicates extends AsyncTask { - private final ArrayList mDuplicateIds = new ArrayList(); - private final List mHashCodeCache = new ArrayList(); - private final Activity mContext; + private final ArrayList mDuplicateIds = new ArrayList<>(); + private final List mHashCodeCache = new ArrayList<>(); + @SuppressLint("StaticFieldLeak") + private final Activity mActivity; private final boolean mChecked; private final boolean mKeepFirst; private ProgressDialog mProgressDialog; @@ -45,7 +48,7 @@ public class FindDuplicates extends AsyncTask { private OnDuplicatesFoundListener mListener; public FindDuplicates(Activity activity, boolean checked, boolean keepFirst) { - this.mContext = activity; + this.mActivity = activity; this.mChecked = checked; this.mKeepFirst = keepFirst; } @@ -60,8 +63,12 @@ public void setOnDuplicatesFoundListener(OnDuplicatesFoundListener listener) { @Override protected void onPreExecute() { super.onPreExecute(); - mProgressDialog = new ProgressDialog(mContext); - mProgressDialog.setMessage(mContext.getString(R.string.reading_msg)); + if (mListener == null) { + throw new NullPointerException("OnDuplicatesFoundListener not implemented."); + } + + mProgressDialog = new ProgressDialog(mActivity); + mProgressDialog.setMessage(mActivity.getString(R.string.reading_msg)); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(false); mProgressDialog.show(); @@ -70,7 +77,7 @@ protected void onPreExecute() { @Override protected Boolean doInBackground(Void... params) { String sortOrder = mChecked ? Constants.DATE + (mKeepFirst ? " ASC" : " DESC") : null; - String[] projection = new String[]{ + String[] projection = new String[] { Constants._ID, Constants.ADDRESS, Constants.BODY, @@ -79,13 +86,16 @@ protected Boolean doInBackground(Void... params) { Constants.TYPE }; - mCursor = mContext.getContentResolver().query(Constants.CONTENT_URI, projection, null, null, sortOrder); + mCursor = mActivity.getContentResolver().query(Constants.CONTENT_URI, projection, + null, + null, + sortOrder); if (mCursor != null) { mProgressDialog.setMax(mCursor.getCount()); try { mDuplicateIds.clear(); mHashCodeCache.clear(); - while (mCursor.moveToNext()) { + while (mCursor.moveToNext() && getMax()) { mIndex++; collectDuplicates(); } @@ -100,6 +110,10 @@ protected Boolean doInBackground(Void... params) { return null; } + private boolean getMax() { + return !BuildConfig.DEBUG || mDuplicateIds.size() < 20; + } + private void collectDuplicates() { final int __id = mCursor.getInt(mCursor.getColumnIndex(Constants._ID)); final String _id; @@ -109,7 +123,7 @@ private void collectDuplicates() { _id = String.valueOf(__id); } - final List uniqueData = new ArrayList(); + final List uniqueData = new ArrayList<>(); uniqueData.add(mCursor.getString(mCursor.getColumnIndex(Constants.ADDRESS))); uniqueData.add(mCursor.getString(mCursor.getColumnIndex(Constants.BODY))); @@ -144,37 +158,37 @@ private void showConfirmation() { if (mDuplicateIds.isEmpty()) { deleteDuplicates(); } else { - AlertDialog.Builder confirmationDialog = new AlertDialog.Builder(mContext); + AlertDialog.Builder confirmationDialog = new AlertDialog.Builder(mActivity); confirmationDialog.setCancelable(false); - confirmationDialog.setMessage(mContext.getResources() - .getQuantityString(R.plurals.delete_duplicates, mDuplicateIds.size(), mDuplicateIds.size())); - - confirmationDialog.setPositiveButton(mContext.getString(android.R.string.ok), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - deleteDuplicates(); - } - }); - confirmationDialog.setNegativeButton(mContext.getString(android.R.string.cancel), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); + confirmationDialog.setMessage(mActivity.getResources() + .getQuantityString(R.plurals.delete_duplicates, mDuplicateIds.size(), + mDuplicateIds.size())); + + confirmationDialog.setPositiveButton(mActivity.getString(android.R.string.ok), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + FindDuplicates.this.deleteDuplicates(); + } + }); + confirmationDialog.setNegativeButton(mActivity.getString(android.R.string.cancel), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); confirmationDialog.show(); } } private void deleteDuplicates() { - if (mListener == null) { - throw new NullPointerException("OnDuplicatesFoundListener not implemented."); - } mListener.duplicatesFound(mDuplicateIds); } public interface OnDuplicatesFoundListener { + void duplicatesFound(ArrayList duplicateIds); } - } diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/service/DeleteSMSAsync.java b/app/src/main/java/com/venomvendor/sms/deduplicate/service/DeleteSMSAsync.java new file mode 100644 index 0000000..a6ab9a8 --- /dev/null +++ b/app/src/main/java/com/venomvendor/sms/deduplicate/service/DeleteSMSAsync.java @@ -0,0 +1,66 @@ +package com.venomvendor.sms.deduplicate.service; + +import android.content.ContentResolver; +import android.content.Context; +import android.os.AsyncTask; + +import com.venomvendor.sms.deduplicate.data.DuplicateList; +import com.venomvendor.sms.deduplicate.util.Constants; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class DeleteSMSAsync extends AsyncTask { + + private int mDeleteBy; + private DuplicateList mDuplicateIds; + private OnDeletedListener mOnDeletedListener; + private ContentResolver contentResolver; + private boolean mCancel; + + public DeleteSMSAsync(Context context, ArrayList duplicateIds, + int deleteBy, OnDeletedListener onDeletedListener) { + contentResolver = context.getContentResolver(); + mDuplicateIds = new DuplicateList<>(duplicateIds); + mDeleteBy = Math.min(deleteBy, 100); + mOnDeletedListener = onDeletedListener; + Collections.sort(mDuplicateIds); + } + + @Override + protected Integer doInBackground(Void... voids) { + int deletedMsgs = 0; + + while (!mDuplicateIds.isEmpty() && !mCancel) { + deletedMsgs = deleteMessages(contentResolver, deletedMsgs); + mOnDeletedListener.onResponse(deletedMsgs, false); + } + return deletedMsgs; + } + + @Override + protected void onPostExecute(Integer deletedMsgs) { + super.onPostExecute(deletedMsgs); + mOnDeletedListener.onResponse(deletedMsgs, true); + } + + private int deleteMessages(ContentResolver contentResolver, int deletedMsgs) { + int toIndex = Math.min(mDeleteBy, mDuplicateIds.size()); + List tempIds = mDuplicateIds.splice(0, toIndex); + + StringBuilder stringBuilder = new StringBuilder(); + for (String duplicateId : tempIds) { + stringBuilder.append(duplicateId).append(", "); + } + stringBuilder.append("-1"); + + String whereClause = String.format("%s in (%s)", Constants._ID, stringBuilder.toString()); + deletedMsgs += contentResolver.delete(Constants.CONTENT_URI, whereClause, null); + return deletedMsgs; + } + + public void doCancel() { + mCancel = true; + } +} diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/service/DeleteSmsService.java b/app/src/main/java/com/venomvendor/sms/deduplicate/service/DeleteSmsService.java deleted file mode 100644 index 02be6af..0000000 --- a/app/src/main/java/com/venomvendor/sms/deduplicate/service/DeleteSmsService.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (C) 2015 VenomVendor - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.venomvendor.sms.deduplicate.service; - -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.app.Service; -import android.content.ContentResolver; -import android.content.Intent; -import android.os.Build; -import android.os.IBinder; - -import com.venomvendor.sms.deduplicate.R; -import com.venomvendor.sms.deduplicate.activity.Deduplication; -import com.venomvendor.sms.deduplicate.util.Constants; -import com.venomvendor.sms.deduplicate.util.Utils; - -import java.util.ArrayList; -import java.util.Collections; - -/* - * Created by VenomVendor on 11/8/15. - */ -public class DeleteSmsService extends Service { - private static final int NOTIFICATION_ID = 500; - private ArrayList mDuplicateIds; - private Thread mDelDuplicates; - - public DeleteSmsService() { - } - - @Override - public IBinder onBind(Intent intent) { - return null; - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - mDuplicateIds = intent.getStringArrayListExtra(Constants.DUPLICATE_IDS); - deleteDuplicates(); - return START_STICKY; - } - - private void deleteDuplicates() { - - final NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); - Intent intent = new Intent(this, Deduplication.class); - intent.putExtra(Constants.FROM_SERVICE, true); - intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - - final Notification.Builder builder; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { - builder = new Notification.Builder(this) - .setContentTitle(getString(R.string.deleting_duplicates)) - .setContentText(getString(R.string.tap_here)) - .setSmallIcon(R.drawable.ic_launcher) - .setContentIntent(pendingIntent) - .setOngoing(true) - .setAutoCancel(false); - } else { - builder = null; - } - - Collections.sort(mDuplicateIds); - final int size = mDuplicateIds.size(); - - mDelDuplicates = new Thread(new Runnable() { - @Override - public void run() { - String format = getResources().getQuantityString(R.plurals.deleted_messages, size); - ContentResolver contentResolver = getContentResolver(); - int k = 0; - for (int i = 0; i < size; i++) { - if (!mDelDuplicates.isInterrupted()) { - k += contentResolver.delete(Constants.CONTENT_URI, "_id=?", new String[]{mDuplicateIds.get(i)}); - - if (builder != null) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - builder.setContentTitle(String.format(format, i + 1, size)); - builder.setProgress(size, i + 1, false); - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - notificationManager.notify(NOTIFICATION_ID, builder.build()); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - notificationManager.notify(NOTIFICATION_ID, builder.getNotification()); - } - } - - Intent broadCastIntent = new Intent(Constants.INTENT_FILTER); - broadCastIntent.putExtra(Constants.TOTAL_MSGS, size); - broadCastIntent.putExtra(Constants.DELETED_MSGS, i + 1); - sendBroadcast(broadCastIntent); - } - } - Intent broadCastIntent = new Intent(Constants.INTENT_FILTER); - broadCastIntent.putExtra(Constants.INTERRUPTED, true); - broadCastIntent.putExtra(Constants.TOTAL_MSGS, size); - broadCastIntent.putExtra(Constants.DELETED_MSGS, k); - sendBroadcast(broadCastIntent); - notificationManager.cancel(NOTIFICATION_ID); - - Utils.revertOldApp(getApplicationContext()); - - stopSelf(); - - } - }); - - if (builder != null) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - builder.setProgress(size, 0, false); - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - notificationManager.notify(NOTIFICATION_ID, builder.build()); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - notificationManager.notify(NOTIFICATION_ID, builder.getNotification()); - } - } - - mDelDuplicates.start(); - - } - - @Override - public void onDestroy() { - mDelDuplicates.interrupt(); - super.onDestroy(); - } -} diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/service/OnDeletedListener.java b/app/src/main/java/com/venomvendor/sms/deduplicate/service/OnDeletedListener.java new file mode 100644 index 0000000..5e8bf9d --- /dev/null +++ b/app/src/main/java/com/venomvendor/sms/deduplicate/service/OnDeletedListener.java @@ -0,0 +1,6 @@ +package com.venomvendor.sms.deduplicate.service; + +public interface OnDeletedListener { + + void onResponse(int deletedMsgs, boolean interrupted); +} diff --git a/app/src/main/java/com/venomvendor/sms/deduplicate/util/Constants.java b/app/src/main/java/com/venomvendor/sms/deduplicate/util/Constants.java index 8e9561b..1c0aadf 100644 --- a/app/src/main/java/com/venomvendor/sms/deduplicate/util/Constants.java +++ b/app/src/main/java/com/venomvendor/sms/deduplicate/util/Constants.java @@ -21,13 +21,7 @@ /* * Created by VenomVendor on 11/8/15. */ -public class Constants { - public static final String DUPLICATE_IDS = "duplicateIds"; - public static final String FROM_SERVICE = "fromService"; - public static final String DELETED_MSGS = "deletedMessages"; - public static final String TOTAL_MSGS = "totalMessages"; - public static final String INTENT_FILTER = "messageStatus"; - public static final String INTERRUPTED = "interrupted"; +public final class Constants { public static final String CURRENT_SMS_APP = "currentSmsApp"; public static final String SHOW_EULA = "eula"; public static final Uri CONTENT_URI = Uri.parse("content://sms"); diff --git a/app/src/main/res/layout/activity_deduplication.xml b/app/src/main/res/layout/activity_deduplication.xml index c278265..23a2a68 100644 --- a/app/src/main/res/layout/activity_deduplication.xml +++ b/app/src/main/res/layout/activity_deduplication.xml @@ -13,6 +13,12 @@ android:orientation="vertical" android:padding="@dimen/activity_margin"> + + + android:textAllCaps="false"> + + +