#!/system/bin/sh

BUSYBOX="/data/data/com.paget96.lsandroid/files/binary/busybox"
LOG="/data/data/com.paget96.lsandroid/files/log/mainLog"
ACTIVATED_TWEAKS="/data/data/com.paget96.lsandroid/shared_prefs/act_scripts.xml"
divider="==============================================="

sendToLog() {
  timeZone=$(getprop persist.sys.timezone)
  printDate=$(TZ="$timeZone" $BUSYBOX date +"%H:%M:%S:%3N %d-%m-%Y")

  echo "[$printDate] $1" >>$LOG
}

write() {
  #chmod 0644 "$1"
  echo "$2" >"$1"
}

# Variables
memTotal=$($BUSYBOX free -m | $BUSYBOX awk '/^Mem:/{print $2}')
# Prevent issues when $memTotal return weird output (including non-integer values, empty strings...),
# in this case device acts like a 4GB RAM device
case $memTotal in
'' | *[!0-9]*) memTotal=4096 ;;
*) memTotal=$memTotal ;;
esac

fa=$(((memTotal * 3 / 2 / 100) * 1024 / 4))
va=$(((memTotal * 2 / 100) * 1024 / 4))
ss=$(((memTotal * 4 / 100) * 1024 / 4))
ha=$(((memTotal * 7 / 100) * 1024 / 4))
cp=$(((memTotal * 11 / 100) * 1024 / 4))
ea=$(((memTotal * 15 / 100) * 1024 / 4))
minFree="$fa,$va,$ss,$ha,$cp,$ea"

# Higher values of oom_adj are more likely
# to be killed by the kernel's oom killer.
# The current foreground app has a oom_adj of 0
adj="0,112,224,408,824,1000"

# If you set this to lower than 1024KB, your system will
# become subtly broken, and prone to deadlock under high loads, we don't allow it below 3072kb
mfk=$((memTotal * 6 / 5))

if [ "$mfk" -le "3072" ]; then
  mfk=3072
fi

# Extra free kbytes calculated based on min_free_kbytes
efk=$((mfk * 16 / 5))

if [ "$efk" -le 18432 ]; then
  efk=18432
fi

# Background app limit per ram size
if [ "$memTotal" -le "1024" ]; then
  backgroundAppLimit="18"
elif [ "$memTotal" -le "2048" ]; then
  backgroundAppLimit="22"
elif [ "$memTotal" -le "3072" ]; then
  backgroundAppLimit="26"
elif [ "$memTotal" -le "4096" ]; then
  backgroundAppLimit="30"
else
  backgroundAppLimit="42"
fi

# Set 1 to reclaim resources quickly when needed.
fastRun="1"

oomReaper="1"
adaptiveLmk="0"

# How much memory of swap will be counted as free
fudgeSwap="1024"

sendToLog "Enabling gaming RAM manager profile"

sync
$BUSYBOX sysctl -w vm.drop_caches=3

setprop ro.sys.fw.bg_apps_limit $backgroundAppLimit
setprop ro.vendor.qti.sys.fw.bg_apps_limit $backgroundAppLimit
resetprop ro.sys.fw.bg_apps_limit $backgroundAppLimit
resetprop ro.vendor.qti.sys.fw.bg_apps_limit $backgroundAppLimit
sendToLog "Background app limit=$backgroundAppLimit"

parameter_adj=/sys/module/lowmemorykiller/parameters/adj
if [ -e $parameter_adj ]; then
  write $parameter_adj "$adj"
  sendToLog "adj=$adj"
fi

parameter_oom_reaper=/sys/module/lowmemorykiller/parameters/oom_reaper
if [ -e $parameter_oom_reaper ]; then
  write $parameter_oom_reaper "$oomReaper"
  sendToLog "oom_reaper=$oomReaper"
fi

parameter_lmk_fast_run=/sys/module/lowmemorykiller/parameters/lmk_fast_run
if [ -e $parameter_lmk_fast_run ]; then
  write $parameter_lmk_fast_run "$fastRun"
  sendToLog "lmk_fast_run=$fastRun"
fi

parameter_adaptive_lmk=/sys/module/lowmemorykiller/parameters/enable_adaptive_lmk
if [ -e $parameter_adaptive_lmk ]; then
  write $parameter_adaptive_lmk "$adaptiveLmk"
  setprop lmk.autocalc false
  sendToLog "adaptive_lmk=$adaptiveLmk"
fi

parameter_fudge_swap=/sys/module/lowmemorykiller/parameters/fudgeswap
if [ -e $parameter_fudge_swap ]; then
  write $parameter_fudge_swap "$fudgeSwap"
  sendToLog "fudge_swap=$fudgeSwap"
fi

parameter_minfree=/sys/module/lowmemorykiller/parameters/minfree
if [ -e $parameter_minfree ] && ! $BUSYBOX grep "minfree" "$ACTIVATED_TWEAKS"; then
  write $parameter_minfree "$minFree"
  sendToLog "minfree=$minFree"
fi

parameter_min_free_kbytes=/proc/sys/vm/min_free_kbytes
if [ -e $parameter_min_free_kbytes ]; then
  write $parameter_min_free_kbytes "$mfk"
  sendToLog "min_free_kbytes=$mfk"
fi

parameter_extra_free_kbytes=/proc/sys/vm/extra_free_kbytes
if [ -e $parameter_extra_free_kbytes ]; then
  write $parameter_extra_free_kbytes "$efk"
  sendToLog "extra_free_kbytes=$efk"
fi

sendToLog "Gaming RAM manager profile for $((memTotal))mb devices successfully applied"
sendToLog "$divider"
