//
// This Gradle build file illustrates how to process Android
// applications.
// Usage:
//     gradle -b android.gradle proguard
//
// If you're using the Android SDK, the Ant release build and Eclipse export
// already take care of the proper settings. You only need to enable ProGuard
// by commenting in the corresponding line in project.properties. You can still
// add project-specific configuration in proguard-project.txt.
//
// This configuration file is for custom, stand-alone builds.

// 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'

    // 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  'bin/classes'
    injars  'libs'
    outjars 'bin/classes-processed.jar'

    libraryjars '/usr/local/android-sdk/platforms/android-9/android.jar'
    //libraryjars '/usr/local/android-sdk/add-ons/google_apis-7_r01/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'

    // Preverification is irrelevant for the dex compiler and the Dalvik VM.

    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.
    // You can comment this out if you're not interested in stack traces.

    renamesourcefileattribute 'SourceFile'
    keepattributes 'SourceFile,LineNumberTable'

    // 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 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 allowshrinking: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 mypackage.MyClass'
    //keep 'public interface mypackage.MyInterface'
    //keep 'public class * implements mypackage.MyInterface'

    // 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(...);
    //}
}
