#! /system/bin/sh

############################################
#         Script made by ruigui            #
#             version 1.02                 #
############################################

key ()
{
echo "=========================="
echo "Press Enter to continue..."
read opt
}

error ()
{
echo "wrong option"
key
}

#############
### menus ###
#############

menu_main ()
{
clear
echo "1 - enable/disable hardware acceleration"
echo "2 - enable/disable jit"
echo "3 - enable/disable stagefright player"
echo "4 - change heapsize"
echo
echo "s - show status"
echo "r - revert to original configuration"
echo
echo "q - quit (don't forget to reboot your phone!)"
echo "=================="
echo -n "enter your option: "
read opt
clear
}

menu_tweak_standard ()
{
while :
do
	clear
	echo "1- enable $tweak_name"
	echo "2- disable $tweak_name"
	echo
	echo "b - back..."
	echo "=================="
	echo -n "enter your option: "
	read opt
	clear

	case $opt in
	1)
		tweak_standard_enable
		key
	;;
	2)
		tweak_standard_disable
		key
	;;
	b)
		break
	;;
	*)
		error
	;;
	esac
done
}

menu_tweak_heapsize ()
{
while :
do
	clear
	echo "1- change heapsize"
	echo
	echo "b - back..."
	echo "=================="
	echo -n "enter your option: "
	read opt
	clear

	case $opt in
	1)
		data_heapsize
		clear
		if [ $heapsize_value -ge 1 2> /dev/null ] && [ $heapsize_value -le 64 ]
		then
			tweak_standard_enable
		else
			echo "wrong value"
			echo "please input a value between 1 and 64"
		fi
		key
	;;
	b)
		break
	;;
	*)
		error
	;;
	esac
done
}

menu_status ()
{
while :
do
	clear
	echo "1- current status"
	echo "2- status (after next reboot)"
	echo
	echo "b - back..."
	echo "=================="
	echo -n "enter your option: "
	read opt
	clear

	case $opt in
	1)
		status_current
		status
		key
	;;
	2)
		status_new
		status
		key
	;;
	b)
		break
	;;
	*)
		error
	;;
	esac
done
}

########################
### backup / restore ###
########################

backup ()
{
if [ ! -f /data/.tweaks_backup ]
then
	clear
	echo "no backup found"
	echo -n "press b to backup your config, or ENTER to abort: "
	read opt
	clear

	case $opt in
	b)
		touch /data/.tweaks_backup
		chmod 444 /data/.tweaks_backup
		status_current
		echo "debug.sf.hw=$hw_acc_status" > /data/.tweaks_backup
		echo "dalvik.vm.execution-mode=$jit_status" >> /data/.tweaks_backup
		echo "media.stagefright.enable-player=$stagefright_status" >> /data/.tweaks_backup
		echo "dalvik.vm.heapsize=$heapsize_status" >> /data/.tweaks_backup
		echo "backup done"
		key
	;;
	*)
		echo "aborted"
		key
	;;
	esac
fi
}

restore ()
{
if [ ! -f /data/.tweaks_backup ]
then
	echo "error"
	echo "no backup found"
	key
else
	echo "backup found"
	echo -n "press r to restore your config, or ENTER to abort: "
	read opt
	clear

	case $opt in
	r)
		hw_acc_status="$(cat /data/.tweaks_backup | grep "^debug.sf.hw" | cut -d= -f2)"
		jit_status="$(cat /data/.tweaks_backup | grep "^dalvik.vm.execution-mode" | cut -d= -f2)"
		stagefright_status="$(cat /data/.tweaks_backup | grep "^media.stagefright.enable-player" | cut -d= -f2)"
		heapsize_status="$(cat /data/.tweaks_backup | grep "^dalvik.vm.heapsize" | cut -d= -f2)"

		var_name="debug.sf.hw"
		var_on="$hw_acc_status"
		tweak_standard_restore
		
		var_name="dalvik.vm.execution-mode"
		var_on="$jit_status"
		tweak_standard_restore
		
		var_name="media.stagefright.enable-player"
		var_on="$stagefright_status"
		tweak_standard_restore
		
		var_name="dalvik.vm.heapsize"
		var_on="$heapsize_status"
		tweak_standard_restore
		
		clear
		echo "done"
		key
	;;
	*)
		echo "aborted"
		key
	;;
	esac

fi
}

##############
### status ###
##############

status ()
{
case $hw_acc_status in
"0")
	echo "hardware acceleration = disabled"
;;
"1")
	echo "hardware acceleration = enabled"
;;
*)
	echo "error. hardware acceleration has wrong value"
;;
esac

case $jit_status in
"int:fast")
	echo "jit = disabled"
;;
"int:jit")
	echo "jit = enabled"
;;
*)
	echo "error. jit has wrong value"
;;
esac

case $stagefright_status in
"false")
	echo "stagefright player = disabled"
;;
"true")
	echo "stagefright player = enabled"
;;
*)
	echo "error. stagefright player has wrong value"
;;
esac

echo "heapsize = $heapsize_status"
}

status_current ()
{
hw_acc_status="$(getprop | grep "debug.sf.hw" | cut -d: -f2 | cut -d[ -f2 | cut -d] -f1)"
jit_status="$(getprop | grep "dalvik.vm.execution-mode" | cut -d: -f2,3 | cut -d[ -f2 | cut -d] -f1)"
stagefright_status="$(getprop | grep "media.stagefright.enable-player" | cut -d: -f2 | cut -d[ -f2 | cut -d] -f1)"
heapsize_status="$(getprop | grep "dalvik.vm.heapsize" | cut -d: -f2 | cut -d[ -f2 | cut -d] -f1)"
}

status_new ()
{
hw_acc_status="$(cat /system/build.prop | grep "^debug.sf.hw" | cut -d= -f2)"
jit_status="$(cat /system/build.prop | grep "^dalvik.vm.execution-mode" | cut -d= -f2)"
stagefright_status="$(cat /system/build.prop | grep "^media.stagefright.enable-player" | cut -d= -f2)"
heapsize_status="$(cat /system/build.prop | grep "^dalvik.vm.heapsize" | cut -d= -f2)"

if [ -f /data/local.prop ]
then
	if [ $(grep -c "^debug.sf.hw" /data/local.prop) -ne 0 ]
	then
		hw_acc_status="$(cat /data/local.prop | grep "^debug.sf.hw" | cut -d= -f2)"
	fi
	if [ $(grep -c "^dalvik.vm.execution-mode" /data/local.prop) -ne 0 ]
	then
		jit_status="$(cat /data/local.prop | grep "^dalvik.vm.execution-mode" | cut -d= -f2)"
	fi
	if [ $(grep -c "^media.stagefright.enable-player" /data/local.prop) -ne 0 ]
	then
		stagefright_status="$(cat /data/local.prop | grep "^media.stagefright.enable-player" | cut -d= -f2)"
	fi
	if [ $(grep -c "^dalvik.vm.heapsize" /data/local.prop) -ne 0 ]
	then
		heapsize_status="$(cat /data/local.prop | grep "^dalvik.vm.heapsize" | cut -d= -f2)"
	fi
fi	
}


##################
### tweak data ###
##################

data_hw_acc ()
{
tweak_name="hardware acceleration"
var_name="debug.sf.hw"
var_status_on="enabled"
var_status_off="disabled"
var_on="1"
var_off="0"
}

data_jit ()
{
tweak_name="jit"
var_name="dalvik.vm.execution-mode"
var_status_on="enabled"
var_status_off="disabled"
var_on="int:jit"
var_off="int:fast"
}

data_stagefright ()
{
tweak_name="stagefright player"
var_name="media.stagefright.enable-player"
var_status_on="enabled"
var_status_off="disabled"
var_on="true"
var_off="false"
}

data_heapsize ()
{
echo "default=24, recommended=32"
echo -n "enter new heapsize value (1-64): "
read heapsize_value

tweak_name="heapsize"
var_name="dalvik.vm.heapsize"
var_status_on="$(echo $heapsize_value)m"
var_on="$(echo $heapsize_value)m"
}

######################
### tweak standard ###
######################

tweak_standard_enable ()
{
var_rom=`grep "^$var_name" /system/build.prop | cut -d= -f2`
message_nothing="nothing changed\n$tweak_name is already $var_status_on"
message_done="done\n$tweak_name = $var_status_on"

if [ ! -f /data/local.prop ]
then
	if [ "$var_rom" = "$var_on" ]
	then
		echo -e $message_nothing
	else
		echo "$var_name=$var_on" > /data/local.prop
		echo -e $message_done
	fi
elif [ $(grep -c "^$var_name=$var_on$" /data/local.prop) -ne 0 ]
then
		echo -e $message_nothing
elif [ $(grep -c "^$var_name" /data/local.prop) -ne 0 ]
then
	sed -i "s/^.*$var_name.*$/$var_name=$var_on/g" /data/local.prop
		echo -e $message_done
elif [ "$var_rom" != "$var_on" ] && [ $(grep -c "^$var_name" /data/local.prop) -eq 0 ]
then
	echo -e "\n$var_name=$var_on" >> /data/local.prop
		echo -e $message_done
else
		echo -e $message_nothing
fi
}

tweak_standard_disable ()
{
var_rom=`grep "^$var_name" /system/build.prop | cut -d= -f2`
message_nothing="nothing changed\n$tweak_name is already $var_status_off"
message_done="done\n$tweak_name = $var_status_off"

if [ ! -f /data/local.prop ]
then
	if [ "$var_rom" = "$var_off" ]
	then
		echo -e $message_nothing
	else
		echo "$var_name=$var_off" > /data/local.prop
		echo -e $message_done
	fi
elif [ $(grep -c "^$var_name=$var_off$" /data/local.prop) -ne 0 ]
then
		echo -e $message_nothing
elif [ $(grep -c "^$var_name" /data/local.prop) -ne 0 ]
then
	sed -i "s/^.*$var_name.*$/$var_name=$var_off/g" /data/local.prop
		echo -e $message_done
elif [ "$var_rom" != "$var_off" ] && [ $(grep -c "^$var_name" /data/local.prop) -eq 0 ]
then
	echo -e "\n$var_name=$var_off" >> /data/local.prop
		echo -e $message_done
else
		echo -e $message_nothing
fi
}

tweak_standard_restore ()
{
var_rom=`grep "^$var_name" /system/build.prop | cut -d= -f2`
message_nothing="nothing changed"
message_done="done"

if [ ! -f /data/local.prop ]
then
	if [ "$var_rom" = "$var_on" ]
	then
		echo -e $message_nothing
	else
		echo "$var_name=$var_on" > /data/local.prop
		echo -e $message_done
	fi
elif [ $(grep -c "^$var_name=$var_on$" /data/local.prop) -ne 0 ]
then
		echo -e $message_nothing
elif [ $(grep -c "^$var_name" /data/local.prop) -ne 0 ]
then
	sed -i "s/^.*$var_name.*$/$var_name=$var_on/g" /data/local.prop
		echo -e $message_done
elif [ "$var_rom" != "$var_on" ] && [ $(grep -c "^$var_name" /data/local.prop) -eq 0 ]
then
	echo -e "\n$var_name=$var_on" >> /data/local.prop
		echo -e $message_done
else
		echo -e $message_nothing
fi
}

####################
### main program ###
####################

backup

while :
do
	menu_main

	case $opt in
	1)
		data_hw_acc
		menu_tweak_standard
	;;
	2)
		data_jit
		menu_tweak_standard
	;;
	3)
		data_stagefright
		menu_tweak_standard
	;;
	4)
		menu_tweak_heapsize
	;;
	s)
		menu_status
	;;
	r)
		restore
	;;
	q)
		clear
		exit
	;;
	*)
		error
	;;
	esac
done
