#!/sbin/sh
# Get file descriptor for output
OUTFD = $( ps | grep -v "grep" | grep -o -E "update-binary(.*)" | cut -d " " -f 3) ;
# Try looking for a differently named updater binary
if [ -z $OUTFD ] ; then
OUTFD = $( ps | grep -v "grep" | grep -o -E "updater(.*)" | cut -d " " -f 3) ;
fi
# same as ui_print command in updater_script, for example:
#
# ui_print "hello world!"
#
# will output "hello world!" to recovery, while
#
# ui_print
#
# outputs an empty line
ui_print( ) {
if [ $OUTFD != "" ] ; then
echo " ui_print ${ 1 } " 1>& $OUTFD ;
echo "ui_print " 1>& $OUTFD ;
else
echo " ${ 1 } " ;
fi ;
}
system_mount = /mnt/system
vendor_path = /vendor
device_variant =
device_supported = false
default_network =
block_allow_data =
# If we have system-as-root the system is mounted at /system/system in twrp
check_vendor_on_system( ) {
ui_print "Checking whether /vendor is on /system (Pre-Treble)"
# Variant 1: Non-System-as-Root
# Variant 2: Q System-as-Root, system partition contains ramdisk, vendor inside own folder
if [ -f ${ system_mount } /vendor/etc/vintf/manifest.xml ]
then
vendor_path = ${ system_mount } /vendor
# Variant 3: System-as-Root, system partition contains ramdisk, /vendor still inside /system/vendor
elif [ -f ${ system_mount } /system/vendor/etc/vintf/manifest.xml ]
then
vendor_path = ${ system_mount } /system/vendor
fi
}
check_oem_as_vendor( ) {
ui_print "Checking whether /oem is used as /vendor (Fake Treble)"
if [ -f /oem/etc/vintf/manifest.xml ]
then
vendor_path = /oem
fi
}
# Sanity check - was this patch already flashed?
check_already_patched( ) {
ui_print "Checking if already patched"
if [ ! -z " $( cat ${ vendor_path } /etc/vintf/manifest.xml | grep slot2) " ]
then
ui_print "Already patched"
exit 0
else
ui_print "Not yet patched"
fi
}
# Detect the exact model from the LTALabel partition
# This looks something like:
# 1284-8432_5-elabel-f8332-row.html
# Output will be e.g. f8332
# (Not 100% sure about the lowercase f8332 though,
# so use tr to convert to all-lowercase to make sure)
get_lta_label( ) {
ui_print "Mounting LTALabel partition"
mkdir /lta-label
mount -t ext4 /dev/block/bootdevice/by-name/LTALabel /lta-label
device_variant = $( \
ls /lta-label/*.html | \
sed 's/.*-elabel-//' | \
sed 's/-.*.html//' | \
tr -d '\n\r' | \
tr '[:upper:]' '[:lower:]' \
) ;
umount /lta-label
rm -r /lta-label
ui_print " Device variant is ${ device_variant } "
}
assign_props( ) {
case ${ device_variant } in
# voyager, pioneer, discovery, kirin(2x), mermaid(2x), pdx201
h4413| h4113| h4213| i4113| i4193| i4213| i4293| xqau52)
default_network = "9,0"
device_supported = true
; ;
# suzu, kagura, dora, keyaki, maple, poplar
f5122| f8332| f8132| g8232| g8142| g8342)
default_network = "9,1"
device_supported = true
; ;
# apollo, akatsuki(2x), akari(2x)
h8324| h9436| h9493| h8266| h8296)
default_network = "9,9"
device_supported = true
; ;
# griffin, bahamut
j9110| j9210)
default_network = "9,9"
block_allow_data = 0
device_supported = true
; ;
esac
}
set_build_prop_dual_sim_values( ) {
rm -f /tmp/build.prop
ui_print "Setting multisim config to dsds"
echo "persist.vendor.radio.multisim.config=dsds" >> /tmp/build.prop
ui_print " Setting default_network to $default_network "
echo " ro.telephony.default_network= $default_network " >> /tmp/build.prop
if [ ! -z $block_allow_data ]
# kumano devices
then
ui_print " Setting block_allow_data to $block_allow_data "
echo " persist.vendor.radio.block_allow_data= $block_allow_data " >> /tmp/build.prop
fi
model = $( \
cat ${ vendor_path } /build.prop | \
grep "ro.product.vendor.model" | \
head -n 1 \
)
model = $( echo ${ model } | sed 's/(AOSP)/Dual (AOSP)/' )
echo " $model " >> /tmp/build.prop
ui_print " Substituting props in $vendor_path /build.prop "
# Prevent prop names with spaces in them being split into multiple fields
IFS = $'\n'
for prop in ` cat /tmp/build.prop`
do
propname = $( echo " $prop " | cut -d '=' -f 1)
sed -i " / $propname /d " ${ vendor_path } /build.prop
echo " $prop " >> ${ vendor_path } /build.prop
done
}
substitute_in_build_prop( ) {
sed -i " s/ $1 / $2 /g " ${ vendor_path } /build.prop
}
# VINTF manifest patching
# Add a second instance of every needed HAL
patch_vintf_manifest( ) {
ui_print "Patching VINTF manifest"
sed -i -r 's/( +<(fqname|instance)>[^<>]*(slot)[^<>]*)1(<\/[^<>]+>)/\11\4\n\12\4/i' ${ vendor_path } /etc/vintf/manifest.xml
sed -i -r 's/( +<(fqname|instance)>[^<>]*(hook|radio|ril|uim|iiwlan|idataconnection)[^<>]*)0(<\/[^<>]+>)/\10\4\n\11\4/i' ${ vendor_path } /etc/vintf/manifest.xml
}
ui_print ""
check_vendor_on_system;
check_oem_as_vendor;
ui_print " /vendor located at $vendor_path "
get_lta_label;
check_already_patched;
assign_props;
if [ $device_supported = false ]
then
ui_print ""
ui_print "############################################"
ui_print " FAIL: Device $device_variant not supported "
ui_print "Are you trying to flash a single-sim device?"
ui_print "############################################"
ui_print ""
exit 1
fi
set_build_prop_dual_sim_values;
# pdx201
substitute_in_build_prop xqau51 xqau52;
substitute_in_build_prop XQAU51 XQAU52;
substitute_in_build_prop XQ-AU51 XQ-AU52;
# griffin
substitute_in_build_prop j8110 j9110;
substitute_in_build_prop J8110 J9110;
# bahamut
substitute_in_build_prop j8210 j9210;
substitute_in_build_prop J8210 J9210;
# kirin
substitute_in_build_prop i3113 i4113;
substitute_in_build_prop I3113 I4113;
# mermaid
substitute_in_build_prop i3213 i4213;
substitute_in_build_prop I3213 I4213;
# akari
substitute_in_build_prop h8216 h8266;
substitute_in_build_prop H8216 H8266;
# apollo
substitute_in_build_prop h8314 h8324;
substitute_in_build_prop H8314 H8324;
# akatsuki
substitute_in_build_prop h8416 h9436;
substitute_in_build_prop H8416 H9436;
# pioneer
substitute_in_build_prop h3113 h4113;
substitute_in_build_prop H3113 H4113;
# discovery
substitute_in_build_prop h3213 h4213;
substitute_in_build_prop H3213 H4213;
# voyager
substitute_in_build_prop h3413 h4413;
substitute_in_build_prop H3413 H4413;
# maple
substitute_in_build_prop g8131 g8142;
substitute_in_build_prop G8131 G8142;
# poplar
substitute_in_build_prop g8341 g8342;
substitute_in_build_prop G8341 G8342;
# dora
substitute_in_build_prop f8131 f8132;
substitute_in_build_prop F8131 F8132;
# kagura
substitute_in_build_prop f8331 f8332;
substitute_in_build_prop F8331 F8332;
# keyaki
substitute_in_build_prop g8231 g8232;
substitute_in_build_prop G8231 G8232;
# suzu
substitute_in_build_prop f5121 f5122;
substitute_in_build_prop F5121 F5122;
patch_vintf_manifest;