#!/sbin/sh
#
# ADDOND_VERSION=2
#
##########################################################################################
# 
# NanoDroid System Mode OTA survival Script
# by Nanolx
# 
# Inspired by 99-flashafterupdate.sh of osm0sis @ xda-developers
# Forked from 99-magisk.sh of topjohnwu @ xda-developers
# 
##########################################################################################

source /tmp/backuptool.functions

MODID=@MODID@
OUTFD=
VERSION=22.3.20190805

print_google_apps()
{
cat <<EOF
AMAPNetworkLocation
BaiduNetworkLocation
BlankStore
ConfigUpdater
GCS
GmsCoreSetupPrebuilt
GmsCore_update
GoogleFeedback
GoogleLoginService
GoogleOneTimeInitializer
GoogleServicesFramework
GoogleConnectivityServices
GoogleTTS
LegacyNetworkLocation
MarketUpdater
MarkupGoogle
NetworkLocation
PlayGames
PlayStore
PrebuiltGmsCore
PrebuiltGmsCorePi
PrebuiltGmsCorePix
UnifiedNlp
Velvet
Vending
WhisperPush
EOF
}

print_google_data ()
{
cat <<EOF
com.amap.android.location
com.baidu.location
com.google.android.location
org.microg.nlp
org.microg.unifiednlp
EOF
}

# check for configuration files
config_locations="/data/media/0 /external_sd /sdcard1 /data"

get_config () {
	config=""
	config_exists=0
	for path in ${config_locations}; do
		if test -r "${path}/.nanodroid-${1}"; then
			config="${path}/.nanodroid-${1}"
			config_exists=1
			return
		fi
	done
}

is_mounted() {
	if [ ! -z "$2" ]; then
		cat /proc/mounts | grep $1 | grep $2, >/dev/null
	else
		cat /proc/mounts | grep $1 >/dev/null
	fi
	return $?
}

if (is_mounted /data); then
	mount -orw,remount /data >/dev/null
else	mount -orw /data >/dev/null
fi

if [ ! -d /system/xbin ]; then
	NANODROID_BINDIR=/system/bin
else	NANODROID_BINDIR=/system/xbin
fi

if [ -r /data/adb/.nanodroid-list ]; then
	NANODROID_LIST=/data/adb/.nanodroid-list
elif [ -r /data/adb/NanoDroid_FileList ]; then
	NANODROID_LIST=/data/adb/NanoDroid_FileList
else
	echo "No installer information found!"
	exit 1
fi

ui_print () {
	echo -n -e "ui_print ${1}\n" >> /proc/self/fd/${OUTFD}
	echo -n -e "ui_print\n" >> /proc/self/fd/${OUTFD}
}

grep_prop() {
	REGEX="${1}"
	shift
	FILES="${@}"
	[ -z "${@}" ] && FILES='/system/build.prop'
	sed -n "s/^${REGEX}=//p" ${FILES} | \
		head -n 1
}

set_ldlibrarypath () {
	SDK_VERSION=$(grep_prop ro.build.version.sdk)

	ABI=$(grep_prop ro.product.cpu.abi | cut -c-3)
	ABI2=$(grep_prop ro.product.cpu.abi2 | cut -c-3)
	ABILONG=$(grep_prop ro.product.cpu.abi)

	OLD_LD=${LD_LIBRARY_PATH}
	OLD_PATH=${PATH}

	ARCH=arm

	[ "$ABI" = "x86" ] && ARCH=x86
	[ "$ABI2" = "x86" ] && ARCH=x86
	[ "$ABILONG" = "arm64-v8a" ] && ARCH=arm64
	[ "$ABILONG" = "x86_64" ] && ARCH=x86_64

	case ${ARCH} in
		arm | x86 )
			export LD_LIBRARY_PATH=/system/lib:/system/vendor/lib:/vendor/lib
		;;

		arm64 | x86_64 )
			export LD_LIBRARY_PATH=/system/lib64:/system/vendor/lib64:/vendor/lib64
		;;
	esac

	export PATH=/system/bin:/system/xbin:${PATH}
}

detect_outfd () {
	if [ -z $OUTFD ] || readlink /proc/$$/fd/$OUTFD | grep -q /tmp; then
		# We will have to manually find out OUTFD
		for FD in `ls /proc/$$/fd`; do
			if readlink /proc/$$/fd/$FD | grep -q pipe; then
				if ps | grep -v grep | grep -q " 3 $FD "; then
					OUTFD=$FD
					break
				fi
			fi
		done
	fi
}

detect_outfd

backup_action () {
	sleep 5

	mount /data

	ui_print " ++ ${MODID} ${VERSION} addon.d: backup"
	cat ${NANODROID_LIST} | while read FILE; do
		echo " + backup: ${FILE}"
		backup_file "${FILE}"
	done

	if test -h /system/fonts/Roboto-Regular.ttf; then
		CUSTOM_FONT="$(basename $(readlink /system/fonts/Roboto-Regular.ttf) .ttf)"
		ui_print " ++ ${MODID} addon.d: detected NanoDroid-Font (${CUSTOM_FONT})"

		echo CUSTOM_FONT=${CUSTOM_FONT} > /tmp/nanodroid_font
	fi

	ui_print " ++ ${MODID} ${VERSION} addon.d: backup done"
}

restore_action () {
	sleep 5

	ui_print " ++ ${MODID} ${VERSION} addon.d: restore"
	cat ${NANODROID_LIST} | while read FILE; do
		echo " + restore: ${FILE}"
		restore_file "${FILE}"
	done
	ui_print " ++ ${MODID} ${VERSION} addon.d: restore done"
}

postrestore_action () {
	sleep 5

	set_ldlibrarypath

	if [ -f /tmp/nanodroid_font ]; then
		source /tmp/nanodroid_font
		ui_print " ++ ${MODID} ${VERSION} addon.d: restoring NanoDroid-Font (${CUSTOM_FONT})"

		${NANODROID_BINDIR}/nanodroid-font -s "${CUSTOM_FONT}"
		rm /tmp/nanodroid_font
	fi

	ui_print " ++ ${MODID} ${VERSION} addon.d: GApps removal"
	print_google_apps | while read app; do
		${NANODROID_BINDIR}/nanodroid-overlay --add ${app}
	done

	print_google_data | while read app; do
		rm -rf /data/data/${app}
		rm -rf /data/user/*/${app}
		rm -rf /data/user_de/*/${app}
		rm -rf /data/app/${app}-*
	done
	ui_print " ++ ${MODID} ${VERSION} addon.d: GApps removal done"


	get_config setup
	if [ "${config_exists}" -eq 1 ]; then
		source "${config}"
		if [ "${nanodroid_overlay}" -eq 1 ]; then
			ui_print " ++ ${MODID} ${VERSION} addon.d: creating Overlays"
			${NANODROID_BINDIR}/nanodroid-overlay --create
			ui_print " ++ ${MODID} ${VERSION} addon.d: creating Overlays done"
		fi
	fi

	export PATH=${OLD_PATH}
	export LD_LIBRARY_PATH=${OLD_LD}
}

case "${1}" in
	backup)
		backup_action
	;;
	restore)
		restore_action
	;;
	pre-backup)
		# Stub
	;;
	post-backup)
		# Stub
	;;
	pre-restore)
		# Stub
	;;
	post-restore)
		postrestore_action
	;;
esac

