#!/bin/sh

LANG=C

if [ "$1" == "-h" ]
then
    cat <<- EOH
		    Usage: $0 [-p] [folder]
		      -p option prints out unused resources, otherwise a total count is printed
		      folder option causes only that app folder to be scanned, default is to scan all folders onder apps/
		EOH
    exit
fi

showall=no
if [ "$1" == "-p" ]
then
    showall=yes
    shift
fi

apps=$1
if [ "$apps" == "" ]
then
    apps=$ANDROID_BUILD_TOP/packages/apps/*
fi

for app in $apps
do
    echo '-----------------------------------------------------------'
    if [ "$app" == "." ]
    then
        app=$(pwd)
    fi
    if [ -d $app/res ]
    then
        appname=$(basename $app)
        iappname=$(grep LOCAL_PACKAGE_NAME $app/Android.mk | sed 's/.*:= *//')
        resources=
        for res in $(echo $app/res/* $(find $ANDROID_BUILD_TOP/vendor -type d -wholename $ANDROID_BUILD_TOP/vendor/*/$appname/res | grep overlay))
        do
            resources="$resources $(echo $res | grep -v '\-mcc\|[a-z]*-[a-z][a-z]$\|[a-z]*-[a-z][a-z]-.*')"
        done
        sources=$app/src
        if [ -d $app/tests ]
        then
            sources="$sources $app/tests"
        fi
        if [ -d $app/samples ]
        then
            sources="$sources $app/samples"
        fi

        # find the R.java file that contains all the generated resource identifiers
        rDotJava=$(find $ANDROID_BUILD_TOP/out/target/common/obj/APPS/${iappname}_intermediates/ -name R.java)

        # Simplistically process the content of the file to get the names of all the constants,
        # and try to find a reference to each constant.

        # First take all the input files and concatenate them, removing newlines. This allows us to
        # find expressions that are broken up over multiple lines, i.e. R.drawable.\nsomeconstant
        find $resources $sources $app/AndroidManifest.xml -type f -print |xargs cat | tr -d '\n ' > /tmp/everything$$

        # Now look for each of the constants in the contatenated file.
        for i in $(cat $rDotJava | grep "\w*=0x\d*" | sed 's/ *public static final int //' | sed 's/=0x.*//')
        do
            # Since periods in the names get translated to underscores in R.java, and you can actually
            # refer to such constants from java by using an underscore instead of a period, we also
            # replace all underscores with a pattern that will match periods and underscores.
            p=$(echo $i | sed 's/_/[\\._]/g')
            echo $i $(grep -cw R\\..*\\.$i\\\|@style/$p\\\|@drawable/$p\\\|@anim/$p\\\|@color/$p\\\|@xml/$p\\\|@layout/$p\\\|@menu/$p\\\|@+id/$p\\\|@array/$p\\\|@string/$p\\\|@mipmap/$p\\\|@integer/$p\\\|@dimen/$p\\\|\[a-z\]\*:$p\\\|enumname=\"$p\\\|\<item\>$p\< < /tmp/everything$$)
        done | grep " 0$" | {
            # this block gets as its input a list of constants for which no references were found, one per line
            if [ "$showall" == "yes" ]
            then
                echo $app
                cat
            else
                count=$(wc -l)
                if [ "$count" != "0" ]
                then
                    echo $app: $count unused resources
                fi
            fi
        }
        rm /tmp/everything$$
    fi
done
