#!/bin/bash
#
# Super-mega LiquidSmooth opticharger of doom
# Shrinks apks by running pngquant or pngcrush or optipng or pngout on png images
#

. $ANDROID_BUILD_TOP/vendor/bliss/tools/colors

OUT_TARGET_HOST=$(uname -a | grep Darwin)
if [ -z "$OUT_TARGET_HOST" ]
then
    OUT_TARGET_HOST=linux-x86
else
    OUT_TARGET_HOST=darwin-x86
fi

set -e
QUIET=1
BASE=`pwd`
BRUTECRUSH="-brute"
TMPDIR=/tmp/opticharge-$$

if [ -z "$BRUTE_PNGCRUSH" ]
then
    BRUTECRUSH=""
fi

if [ "$APKCERTS" = "" ];
then
    if [ "$TARGET_BUILD_VARIANT" = "userdebug" ]; then
       TARGET_BUILD_VARIANT="eng"
    elif [ "$TARGET_BUILD_VARIANT" = "user" ]; then
       TARGET_BUILD_VARIANT="eng"
    fi

    APKCERTS=$OUT/obj/PACKAGING/target_files_intermediates/$TARGET_PRODUCT-target_files-$TARGET_BUILD_VARIANT.$USER/META/apkcerts.txt
    if [ ! -f "$APKCERTS" ];
    then
        echo -e ${red}"Set APKCERTS to the path to your apkcerts.txt file"${txtrst}
        exit 1;
    fi
fi

if [ ! -f "$APKCERTS" ];
then
    echo -e ${red}"Invalid path to apkcerts.txt, set APKCERTS to the correct path."${txtrst}
fi

if [ "$(which pngquant)" != "" ];
then
    optimize_png () {
        pngquant --speed 1 --force --ext .png $1 1> /dev/null 2> /dev/null
    }
elif [ "$(which pngcrush)" != "" ];
then
    optimize_png () {
        pngcrush -q ${BRUTECRUSH} $1 ${1}.out 1> /dev/null 2> /dev/null
        mv ${1}.out ${1} 2> /dev/null
    }
elif [ "$(which optipng)" != "" ];
then
    optimize_png () {
        optipng -o7 -quiet $1 1> /dev/null 2> /dev/null
    }
elif [ "$(which pngout-static)" != "" ];
then
    optimize_png () {
        pngout-static $1
    }
elif [ "$(which pngout)" != "" ];
then
    optimize_png () {
        pngout $1
    }
else
    echo -e ${red}"Please install pngquant, pngcrush, optipng, or pngout"${txtrst}
    exit 1;
fi

if [ "`which aapt`" = "" ];
then
    echo -e ${red}"Please ensure aapt is in your \$PATH"${txtrst}
    exit 1;
fi

if [ "`which zipalign`" = "" ];
then
    echo -e ${red}"Please ensure zipalign is in your \$PATH"${txtrst}
    exit 1;
fi

if [ -e "$1" ];
then
    NAME=`basename $1`;
    echo -e ${bldgrn}"Optimizing:${txtrst} $NAME...";

    if [ "$2" != "" ];
    then
        if [ "$DEFAULT_SYSTEM_DEV_CERTIFICATE" ]; then
            CERT_PATH=`dirname $DEFAULT_SYSTEM_DEV_CERTIFICATE`
        else
            CERT_PATH=build/target/product/security
        fi
        CERT="$CERT_PATH"/$2.x509.pem
        KEY="$CERT_PATH"/$2.pk8
        if [ ! -f "$ANDROID_BUILD_TOP/$CERT" ];
        then
            echo -e ${red}"$CERT does not exist!"${txtrst};
            exit 1;
        fi
    else
        APKINFO=`grep "name=\"$NAME\"" $APKCERTS`;
        [ $QUIET ] || echo -e "APKINFO: $APKINFO";
        if [ "$APKINFO" = "" ];
        then
            echo -e ${red}"No apk info for $NAME"${txtrst};
            exit 1;
        fi
        CERT=`echo -e $APKINFO | awk {'print $2'} | cut -f 2 -d "=" | tr -d "\""`;
        KEY=`echo -e $APKINFO | awk {'print $3'} | cut -f 2 -d "=" | tr -d "\""`;
        if [ "$CERT" = "" ];
        then
            echo -e ${red}"Unable to find certificate for $NAME"${txtrst}
            exit 1;
        fi
        if [ "$CERT" = "PRESIGNED" ];
        then
            echo -e ${cya}"$NAME is presigned, skipping"${txtrst}
            exit 1;
        fi
    fi

    [ $QUIET ] || echo -e ${bldylw}"Certificate:${txtrst} $CERT";

    [ -d $TMPDIR/$NAME ] && rm -rf $TMPDIR/$NAME
    mkdir -p $TMPDIR/$NAME
    trap "rm -rf $TMPDIR; exit" INT TERM EXIT
    cd $TMPDIR/$NAME
    unzip -q $BASE/$1
    for x in `find . -name "*.png" | grep -v "\.9.png$" | tr "\n" " "`
    do
        [ $QUIET ] || echo -e ${bldgrn}"Crushing${txtrst} $x"
        optimize_png $x
    done
    cp $BASE/$1 $BASE/$1.old

    [ $QUIET ] || echo -e ${bldgrn}"Repacking apk.."${txtrst}
    aapt p -0 .dat -0 .dict -0 .arsc -F $NAME .

    [ $QUIET ] || echo -e ${bldgrn}"Resigning with cert:${txtrst} `echo -e $CERT`"

    [ $QUIET ] || echo java -jar $ANDROID_HOST_OUT/framework/signapk.jar $ANDROID_BUILD_TOP/$CERT $ANDROID_BUILD_TOP/$KEY $NAME signed_$NAME
    java -jar $ANDROID_HOST_OUT/framework/signapk.jar $ANDROID_BUILD_TOP/$CERT $ANDROID_BUILD_TOP/$KEY $NAME signed_$NAME
    [ $QUIET ] || echo -e ${bldgrn}"Zipalign.."${txtrst}
    zipalign -f 4 signed_$NAME $BASE/$1
    if [ ! $QUIET ]; then
        ls -l $BASE/$1.old
        ls -l $BASE/$1
    fi
    rm $BASE/$1.old
else
    echo -e "Usage: $0 [apk file]"
fi
