//
// This Gradle build file illustrates how to process Android
// applications.
//
// If you're using the Android SDK, the provided build systems with Gradle,
// Android Studio, Eclipse, and Ant already take care of the proper settings.
// You only need to enable ProGuard as explained in the Android documentation.
// You can still add project-specific configuration in proguard-project.txt.
//
// This configuration file is for custom, stand-alone builds.
// Usage:
//     gradle -b android.gradle proguard

// Tell Gradle where to find the ProGuard task.

buildscript {
    repositories {
        flatDir dirs: '../../lib'
    }
    dependencies {
        classpath ':proguard'
    }
}

// Define a ProGuard task.

task ('proguard', type: proguard.gradle.ProGuardTask) {

    // You should probably import a more compact ProGuard-style configuration
    // file for all static settings, but we're specifying them all here, for
    // the sake of the example.
    //configuration 'configuration.pro'


    //##############################################################################
    // Input and output.
    //##############################################################################

    // Specify the input jars, output jars, and library jars.
    // Note that ProGuard works with Java bytecode (.class),
    // before the dex compiler converts it into Dalvik code (.dex).

    injars  'classes'
    injars  'libs'
    outjars 'classes-processed.jar'

    libraryjars '/usr/local/android-sdk/platforms/android-27/android.jar'
    //libraryjars '/usr/local/java/android-sdk/extras/android/support/v4/android-support-v4.jar'
    //libraryjars '/usr/local/java/android-sdk/add-ons/addon-google_apis-google-21/libs/maps.jar'
    // ...

    // Save the obfuscation mapping to a file, so you can de-obfuscate any stack
    // traces later on.

    printmapping 'bin/classes-processed.map'

    // You can print out the seeds that are matching the keep options below.

    //printseeds 'bin/classes-processed.seeds'


    //##############################################################################
    // General settings.
    //##############################################################################

    verbose

    // We can debug the ProGuard configuration by instrumenting the code and
    // checking the log for feedback. Disable the option again for actual releases!

    //addconfigurationdebugging

    // We can also disable the individual processing steps.

    //dontshrink
    //dontoptimize
    //dontobfuscate

    // Specifically target Android.

    android

    // The dex compiler ignores preverification information.

    dontpreverify

    // Reduce the size of the output some more.

    repackageclasses ''
    allowaccessmodification

    // Switch off some optimizations that trip older versions of the Dalvik VM.

    optimizations '!code/simplification/arithmetic'

    // Keep a fixed source file attribute and all line number tables to get line
    // numbers in the stack traces.

    renamesourcefileattribute 'SourceFile'
    keepattributes 'SourceFile,LineNumberTable'


    //##############################################################################
    // Settings to handle reflection in the code.
    //##############################################################################

    // RemoteViews might need annotations.

    keepattributes '*Annotation*'

    // Preserve all fundamental application classes.

    keep 'public class * extends android.app.Activity'
    keep 'public class * extends android.app.Application'
    keep 'public class * extends android.app.Service'
    keep 'public class * extends android.content.BroadcastReceiver'
    keep 'public class * extends android.content.ContentProvider'

    // Preserve all View implementations, their special context constructors, and
    // their setters.

    keep 'public class * extends android.view.View { \
        public <init>(android.content.Context); \
        public <init>(android.content.Context, android.util.AttributeSet); \
        public <init>(android.content.Context, android.util.AttributeSet, int); \
        public void set*(...); \
    }'

    // Preserve all classes that have special context constructors, and the
    // constructors themselves.

    keepclasseswithmembers 'class * { \
        public <init>(android.content.Context, android.util.AttributeSet); \
    }'

    // Preserve all classes that have special context constructors, and the
    // constructors themselves.

    keepclasseswithmembers 'class * { \
        public <init>(android.content.Context, android.util.AttributeSet, int); \
    }'

    // Preserve all possible onClick handlers.

    keepclassmembers 'class * extends android.content.Context { \
       public void *(android.view.View); \
       public void *(android.view.MenuItem); \
    }'

    // Preserve the special fields of all Parcelable implementations.

    keepclassmembers 'class * implements android.os.Parcelable { \
        static android.os.Parcelable$Creator CREATOR; \
    }'

    // Preserve static fields of inner classes of R classes that might be accessed
    // through introspection.

    keepclassmembers 'class **.R$* { \
      public static <fields>; \
    }'

    // Preserve annotated Javascript interface methods.

    keepclassmembers 'class * { \
        @android.webkit.JavascriptInterface <methods>; \
    }'

    // Preserve annotated and generated classes for Dagger.

    keepclassmembers allowobfuscation: true, 'class * { \
        @dagger.** *; \
    }'

    keep 'class **$$ModuleAdapter'
    keep 'class **$$InjectAdapter'
    keep 'class **$$StaticInjection'

    keep if: 'class **$$ModuleAdapter', 'class <1>'

    keep if: 'class **$$InjectAdapter', 'class <1>'

    keep if: 'class **$$StaticInjection', 'class <1>'

    keepnames 'class dagger.Lazy'

    // Preserve annotated and generated classes for Butterknife.

    keep 'class **$$ViewBinder { \
        public static void bind(...); \
        public static void unbind(...); \
    }'

    keep if: 'class **$$ViewBinder', 'class <1>'

    keep 'class **_ViewBinding { \
        <init>(<1>, android.view.View); \
    }'

    keep if: 'class **_ViewBinding', 'class <1>'

    // Preserve fields that are serialized with GSON.

    //keepclassmembers 'class com.example.SerializedClass1,'
    //                        com.example.SerializedClass2 {
    //    <fields>;
    //}'

    keepclassmembers allowobfuscation: true, 'class * { \
        @com.google.gson.annotations.SerializedName <fields>; \
    }'

    keep allowobfuscation: true, '@interface com.google.gson.annotations.**'


    // Preserve the required interface from the License Verification Library
    // (but don't nag the developer if the library is not used at all).

    keep 'public interface com.android.vending.licensing.ILicensingService'

    dontnote 'com.android.vending.licensing.ILicensingService'

    // The Android Compatibility library references some classes that may not be
    // present in all versions of the API, but we know that's ok.

    dontwarn 'android.support.**'

    // Preserve all native method names and the names of their classes.

    keepclasseswithmembernames includedescriptorclasses: true, 'class * { \
        native <methods>; \
    }'

    // Preserve the special static methods that are required in all enumeration
    // classes.

    keepclassmembers allowoptimization: true, 'enum * { \
        public static **[] values(); \
        public static ** valueOf(java.lang.String); \
    }'

    // Explicitly preserve all serialization members. The Serializable interface
    // is only a marker interface, so it wouldn't save them.
    // You can comment this out if your application doesn't use serialization.
    // If your code contains serializable classes that have to be backward
    // compatible, please refer to the manual.

    keepclassmembers 'class * implements java.io.Serializable { \
        static final long serialVersionUID; \
        static final java.io.ObjectStreamField[] serialPersistentFields; \
        private void writeObject(java.io.ObjectOutputStream); \
        private void readObject(java.io.ObjectInputStream); \
        java.lang.Object writeReplace(); \
        java.lang.Object readResolve(); \
    }'

    // Your application may contain more items that need to be preserved;
    // typically classes that are dynamically created using Class.forName:

    // keep 'public class com.example.MyClass'
    // keep 'public interface com.example.MyInterface'
    // keep 'public class * implements com.example.MyInterface'


    //##############################################################################
    // Further optimizations.
    //##############################################################################

    // If you wish, you can let the optimization step remove Android logging calls.

    assumenosideeffects 'class android.util.Log { \
        public static boolean isLoggable(java.lang.String, int); \
        public static int v(...); \
        public static int i(...); \
        public static int w(...); \
        public static int d(...); \
        public static int e(...); \
    }'
}
