
# Dolby&ViPERFX functions

mount_filesystems() {
  ui_print " "
  ui_print " "
  ui_print "• Mounting partitions..."
  sleep 1
  mount -o rw,remount / 2>/dev/null
  sleep 1
  if [ "$BOOTMODE" ]; then
    mirror=/sbin/.magisk/mirror
    mount -o rw,remount $mirror/system 2>/dev/null
    mount -o rw,remount $mirror/vendor 2>/dev/null
    sysroot=/sbin/.magisk/mirror/system_root
    if [ -d "$sysroot" ]; then
      mount -o rw,remount $sysroot
      if is_mounted $sysroot; then
        ui_print "  √ $sysroot mounted successfully."
      else
        ui_print "  X $sysroot mounted unsuccessfully."
      fi
      ui_print " "
      sleep 1
      ui_print "• Assigning directory variables..."
      sleep 1
      sys=$(realpath $mirror/system)
      ven=$(realpath $mirror/vendor)
      if [ -e "$sys/system/build.prop" ]; then
        sys=$mirror/system/system
      fi
      ui_print "  √ System: $sys"
      sleep 1
      ui_print "  √ Vendor: $sys/vendor"
    else
      sys=$mirror/system
      mount -o rw,remount $sys
      if is_mounted $sys; then
        ui_print "  √ $sys mounted successfully."
      else
        ui_print "  X $sys mounted unsuccessfully."
      fi
      sleep 1
      if [ -L "$mirror/vendor" ]; then
        ven=$sys/vendor
      else
        mount -o rw,remount $mirror/vendor
        ven=$mirror/vendor
        if is_mounted $mirror/vendor; then
          ui_print "  √ $mirror/vendor mounted successfully."
        else
          ui_print "  X $mirror/vendor mounted unsuccessfully."
        fi
      fi
      ui_print " "
      sleep 1
      ui_print "• Assigning directory variables..."
      sleep 1
      sys=$(realpath $mirror/system)
      ven=$(realpath $mirror/vendor)
      if [ -e "$sys/system/build.prop" ]; then
        sys=$mirror/system/system
      fi
      ui_print "  √ System: $sys"
      sleep 1
      ui_print "  √ Vendor: $ven"
    fi
  else
    mount -o rw,remount /system
    sys=/system
    if is_mounted $sys; then
      ui_print "  √ $sys mounted successfully."
    else
      ui_print "  X $sys mounted unsuccessfully."
    fi
    sleep 1
    if [ -L /vendor ]; then
      ven=$sys/vendor
    else
      ven=/vendor
      mount -o rw,remount $ven
      if is_mounted $ven; then
        ui_print "  √ $ven mounted successfully."
      else
        ui_print "  √ $ven mounted unsuccessfully."
      fi
    fi
    sleep 1
    ui_print " "
    ui_print "• Assigning directory variables..."
    sleep 1
    if [ -e "$sys/system/build.prop" ]; then
      sys=/system/system
    fi
    ui_print "  √ System: $sys"
    sleep 1
    ui_print "  √ Vendor: $ven"
  fi
  ui_print " "
  sleep 1
}

prepare_module() {
  ui_print "• Preparing module..."
  unzip -qq "$ZIPFILE" 'Redux/*' -d $TMPDIR >&2
  cp -rf $TMPDIR/Redux/* $MODPATH
  modsys=$MODPATH/system
  modetc=$MODPATH/system/etc
  modven=$MODPATH/system/vendor
  modbin=$MODPATH/system/vendor/bin
  modvetc=$MODPATH/system/vendor/etc
  modlib=$MODPATH/system/vendor/lib
  modlib64=$MODPATH/system/vendor/lib64
    stdc=libstdc++.so
  if [ ! -e "$ven/lib/$stdc" ] && [ -e "$sys/lib/$stdc" ]; then
    cp -f $sys/lib/$stdc $modlib/
    cp -f $ven/lib64/$stdc $modlib64/
  fi
  sleep 1
}

configure_fx() {
  ui_print "• Configuring audio effects..."
  sleep 2
  acdbetc=/data/adb/modules*/acdb/system/etc
  acdbvetc=/data/adb/modules*/acdb/system/vendor/etc
  etc=$sys/etc
  vetc=$ven/etc
  conf=*audio_effects*conf
  xml=*audio_effects*xml
  moduleconf=/data/adb/module*/*/system/etc/$conf
  modulevconf=/data/adb/module*/*/system/vendor/etc/$conf
  modulexml=/data/adb/module*/*/system/vendor/etc/$xml
  for fxconfig in $acdbetc/*effects* $acdbvetc/*effects*; do
    if [ ! -e "$fxconfig" ]; then
      for fxconfig in $etc/*effects*; do
        if [ -e "$fxconfig" ]; then
          mkdir -p $modetc
          cp -f $fxconfig $modetc/
        fi
      done
      for fxconfig in $vetc/*effects*; do
        if [ -e "$fxconfig" ]; then
          cp -f $fxconfig $modvetc/
        fi
      done
    fi
  done
  for fxconfig in $acdbvetc/$xml $modulexml; do
    if [ -e "$fxconfig" ]; then
      dsplus=$(grep "dsplus" $fxconfig)
      v4afx=$(grep "v4a" $fxconfig)
      musichelper=$(grep '<apply effect="music_helper"/>' $fxconfig)
      notification=$(grep '<apply effect="notification_helper"/>' $fxconfig)
      conflict=$(grep "libv4a_fx.so" $fxconfig)
      if [ ! "$dsplus" ]; then
        sed -i '1,/^    <\/libraries>/s/^    <\/libraries>/        <library name=\"dsplus\" path=\"libdseffect.so\"\/>\n    <\/libraries>/' $fxconfig
        sed -i '1,/^    <\/effects>/s/^    <\/effects>/        <effect name=\"dsplus\" library=\"dsplus\" uuid=\"9d4921da-8225-4f29-aefa-39537a04bcaa\"\/>\n    <\/effects>/' $fxconfig
      fi
      if [ "$conflict" ]; then
        sed -i 's/libv4a\_fx.so/libv4a\_fx.so/g' $fxconfig
      elif [ ! "$v4afx" ]; then
        sed -i '1,/^    <\/libraries>/s/^    <\/libraries>/        <library name=\"v4a_fx\" path=\"libv4a_fx.so\"\/>\n    <\/libraries>/' $fxconfig
        sed -i '1,/^    <\/effects>/s/^    <\/effects>/        <effect name=\"v4a_standard_fx\" library=\"v4a_fx\" uuid=\"41d3c987-e6cf-11e3-a88a-11aba5d5c51b\"\/>\n    <\/effects>/' $fxconfig
      fi
      if [ "musichelper" ]; then
        sed -i '1,/^            <apply effect=\"music\_helper\"\/>/s/^            <apply effect=\"music\_helper\"\/>/            <!-- apply effect=\"music\_helper\"\/ -->/' $fxconfig
      fi
      if [ "notification" ]; then
        sed -i '1,/^            <apply effect=\"notification\_helper\"\/>/s/^            <apply effect=\"notification\_helper\"\/>/            <!-- apply effect=\"notification\_helper\"\/ -->/' $fxconfig
      fi
    fi
  done
  sleep 2
  ui_print "• Configuring audio effects..."
  for fxconfig in $acdbetc/$conf $acdbvetc/$conf $moduleconf $modulevconf; do
    if [ -e "$fxconfig" ]; then
      dsplus=$(grep "dsplus" $fxconfig)
      v4afx=$(grep "v4a" $fxconfig)
      musichelper=$(grep "music_helper" $fxconfig)
      notification=$(grep "notification_helper" $fxconfig)
      conflict=$(grep "libv4a_fx.so" $fxconfig)
      if [ ! "$dsplus" ]; then
        sed -i 's/^libraries {/libraries {\n  dsplus {\n    path \/vendor\/lib\/soundfx\/libdseffect.so\n  }/' $fxconfig
        sed -i 's/^effects {/effects {\n  dsplus {\n    library dsplus\n    uuid 9d4921da-8225-4f29-aefa-39537a04bcaa\n  }/' $fxconfig
      fi
      if [ "$conflict" ]; then
        sed -i 's/libv4a\_fx.so/libv4a\_fx.so/g' $fxconfig
      elif [ ! "$v4afx" ]; then
        sed -i 's/^libraries {/libraries {\n  v4a_fx {\n    path \/vendor\/lib\/soundfx\/libv4a_fx.so\n  }/' $fxconfig
        sed -i 's/^effects {/effects {\n  v4a_standard_fx {\n    library v4a_fx\n    uuid 41d3c987-e6cf-11e3-a88a-11aba5d5c51b\n  }/' $fxconfig
      fi
      if [ "$musichelper" ]; then
        sed -i '/^        music_helper {/ {;N s/        music_helper {\n        }/#        music_helper {\n#        }/}' $fxconfig
      fi
      if [ "$notification" ]; then
        sed -i '/^        notification_helper {/ {;N s/        notification_helper {\n        }/#        notification_helper {\n#        }/}' $fxconfig
      fi
    fi
  done
  sleep 2
}


finalize_module() {
  ui_print "• Finalizing module..."
  set_perm_recursive $MODPATH 0 0 0755 0644
  set_perm_recursive $modbin 0 2000 0755 0755
  chown 0:2000 $modsvetc $modsvetc/dolby $modlib $modlib/soundfx $modlib64 $modlib64/soundfx
  chcon -R u:object_r:vendor_file:s0 $modven
  chcon -R u:object_r:vendor_configs_file:s0 $modsvetc
  chcon u:object_r:hal_dms_default_exec:s0 $modbin/hw/*dolby*
  sleep 1
}

tidy_up() {
  ui_print "• Tidying up..."
  rm -rf $MODPATH/META-INF 2>/dev/null
  rm -f $MODPATH/customize.sh 2>/dev/null
  rm -f $MODPATH/README.md 2>/dev/null
  ui_print " "
  ui_print " "
  sleep 2
}

go() {
  mount_filesystems
  check_compatibility
  restore
  register_contexts
  register_service
  prepare_module
  configure_fx
  finalize_module
  tidy_up
  ui_print "Done!"
  sleep 1 && exit 0
}
