#!/system/bin/sh
#
#     +----------------------------------------+
#     |           A D 2 S D X - MOD            |
#     +====[ by AMARULLZ - xda-developers ]====+
#     |                                        |
#     |  Special For:                          |
#     |  sebastiaan15 Runnymede Desire ROM.    |
#     |                                        |
#     +-----------+-------------+--------------+
#     |  VERSION  |  1.00-RC01  |  2011/08/11  |
#     +-----------+-------------+--------------+
#
######################################################
#                  NOTES & REQUIRED                  #
######################################################
#
# mtdblock5 = Internal Memory, commonly mounted on
#             /data
# mmcblk0p2 = SDCard EXT Partition, commonly mounted
#             on /sd-ext
#
# * SD-EXT Should be on EXT4.
# * Minimum SD-EXT Size = 512MB
# * Minimum SDCard Class = Class 4
#
######################################################
#                     CHANGELOG                      #
######################################################
#
#  [ RELEASE CANDIDATE ]
#  1.00-RC01 : Rewrite script, Add Better Dalvik
#              Handler, Enhance Waiter Script,
#              Rewrite updater-script, cleanup code
#              and script comments
#
#  [ BETA ]
#  BETA 4    : Fix Filesystem Corrupt, Add delete 
#              uninstalled application dalvik-cache
#  BETA 3    : Typo error fix for chmown->chmod
#  BETA 2    : Fix /data/app /sd-ext/app Handler
#  BETA 1    : Initial release
#
######################################################

###> Initializing
AD2SDX_VERSION="1.00-RC01"
sync;


###> SDCard Cache Size
#
# Default is disabled. Remove #'s, and change 128 value
# to enabled it
#
##
# if [ -e /sys/devices/virtual/bdi/179:0/read_ahead_kb ]
# then
#   /system/xbin/echo "128" > /sys/devices/virtual/bdi/179:0/read_ahead_kb;
# fi;
# sync;


###> Unmount /sd-ext if it already mounted
busybox umount /sd-ext;
sync;


###> Mount /data and move mount point to /sd-ext
#
# Current mtdblock5 will mounted on /sd-ext
#
##
busybox mount /data;
busybox mount --move /data /sd-ext;
sync;


###> Mount mmcblk0p2 to /data
#
# Current mmcblk0p2 will mounted on /data
# You Will Get 512MB/1GB/2GB Internal Memory
#
##
busybox mount -t ext4 -o noauto_da_alloc,data=ordered,commit=15,barrier=1,nouser_xattr,errors=continue,noatime,nodiratime,nosuid,nodev /dev/block/mmcblk0p2 /data;
busybox chown 1000:1000 /data;
busybox chmod 771 /data;
sync;


###> Create AD2SDX Directory
#
# Used for script, logs & cache
#
##
if [ ! -e /data/ad2sdx ]
then
  busybox mkdir /data/ad2sdx;
fi;

###> SAVE CURRENT VERSION - $echo "$AD2SDX_VERSION" > /data/ad2sdx/version
AD2SDX_CURRENT_VERSION=`cat /data/ad2sdx/version`;

########################################### SCRIPTS CREATOR ############################################
#
###> Create AD2SDX Waiter Script
#
# The script will waiting the system to settle
# boot proccess, then initializing application data
# structures
#
##
if [ ! -e /data/ad2sdx/waiter.sh ] || [ $AD2SDX_CURRENT_VERSION != $AD2SDX_VERSION ];
then
cat > /data/ad2sdx/waiter.sh <<EOF
#!/system/bin/sh
######################################################
#                AD2SDX WAITER SCRIPT                #
######################################################
  echo "AD2SDX Waiter Script Version $AD2SDX_VERSION";
  echo "       by AMARULLZ - xda-developers";
  echo "";
  echo "Initializing First Boot...";
  echo "Wait System to Finish the Boot...";

###> Wait for system data completely initialized
  cd /sd-ext/data_s
  while [ ! -e /sd-ext/data_s/com.htc.home.personalize/shared_prefs/PersonalizeSummary.xml ]
  do
    sleep 5;
  done;
  echo "First Boot is Completed...";

###> Now Create temp data_t
  echo "Switching Data Directory to sd-ext...";
  busybox mkdir /data/data_t
  busybox chown system:system /data/data_t;
  busybox chmod 771 /data/data_t;
  echo "";

###> Create Symlinks of /sd-ext/data_s in /data/data_t
  echo "List Of Data in Internal Memory:";
  echo "================================";
  cd /sd-ext/data_s/
  for i in \`ls -d *\`;
  do
    ###> Only If Symlink Not Exists
    if [ ! -h /data/data_t/\$i ]
    then
  	  busybox ln -s /sd-ext/data_s/\$i /data/data_t/\$i
  	  echo "   \$i";
  	fi;
  done;
  sync;

###> Delete Old Symlink
  echo "";
  echo "Cleaning Up...";
  cd /
  busybox rm /data/data;
  busybox mv /data/data_t /data/data;

###> If Initialized, It don't need 2nd boot...
  busybox touch /data/ad2sdx/init2;
  echo "Completed...";
  sync;
EOF
fi;
###/ End Of AD2SDX Waiter Script


###> Create AD2SDX Dalvik Waiter Script
#
# The script will waiting the system to settle
# boot proccess, then initializing dalvik-cache
# structures
#
##
if [ ! -e /data/ad2sdx/dalvik-waiter.sh ] || [ $AD2SDX_CURRENT_VERSION != $AD2SDX_VERSION ];
then
cat > /data/ad2sdx/dalvik-waiter.sh <<EOF
#!/system/bin/sh
######################################################
#            AD2SDX DALVIK WAITER SCRIPT             #
######################################################
  echo "AD2SDX Dalvik Waiter Script Version $AD2SDX_VERSION";
  echo "       by AMARULLZ - xda-developers";
  echo "";
  echo "Initializing First Boot...";
  echo "Wait System to Finish the Boot...";

###> Wait For Boot Finished & Dalvik-Cache Initialized
  IS_BOOT_FINISHED="no";
  while [ \$IS_BOOT_FINISHED != "yes" ]
  do
    for i in \`ps | grep com.android.systemui | awk '{print \$5}'\`;
    do
      if [ \$i = "com.android.systemui" ]
      then
        IS_BOOT_FINISHED="yes";
      fi;
    done;
    
    ###> Even it settled, we wait for 5 seconds ;)
    sleep 5;
  done;
  sync;

###> Now Do The Structurizing Actions
  echo "";
  echo "Initializing 3rd Party Dalvik Cache Directory...";
  busybox mkdir /data/dalvik-temp
  busybox chmod 777 /data/dalvik-temp

###> Copy Application Dalvik to dalvik-temp
  cd /sd-ext/dalvik-cache;
  echo "Dalvik On SD-EXT:";
  for i in \`ls data*\`;
  do
    busybox cp -a /sd-ext/dalvik-cache/\$i /data/dalvik-temp/\$i;
    echo "  \$i";
  done;
  echo "Dalvik On Internal Storage:";
  for i in \`ls system*\`;
  do
    busybox ln -s /sd-ext/dalvik-cache/\$i /data/dalvik-temp/\$i;
    echo "  \$i";
  done;
  echo "";
  echo "Configuring...";
  busybox mv /data/dalvik-cache /data/dalvik-delete;
  busybox mv /data/dalvik-temp /data/dalvik-cache;
  busybox rm -R /data/dalvik-delete;
  busybox rm data*;
  cd /;
  echo "Completed...";
  sync;
EOF
fi;
###/ End Of AD2SDX Dalvik Waiter Script
#
######################################## END OF SCRIPTS CREATOR ########################################


######################################### DALVIK MANAGEMENT ############################################
#
###> AD2SDX Dalvik-Cache Handler
#
# Check if dalvik-cache is wiped or uninitialized
#
##
###> Check Dalvik Cache File Counts
DALVIK_COUNT=`ls /sd-ext/dalvik-cache/ | wc -l`;

###> Run Updater ( Dalvik Waiter ) if DALVIK_COUNT < 1.
if [ $DALVIK_COUNT -lt 1 ] || [ ! -e /data/ad2sdx/init ]
then
  ###> If dalvik not exist in Internal Memory, create the directory
  busybox mkdir /sd-ext/dalvik-cache
  busybox chmod 777 /sd-ext/dalvik-cache
  
  ###> Direct rm possible error, use move then rm
  if [ -e /data/dalvik-delete ]
  then
    busybox rm -R /data/dalvik-delete;
  fi;
  
  if [ -e /data/dalvik-cache ]
  then
    busybox mv /data/dalvik-cache /data/dalvik-delete;
  fi;
  
  ###> Create Symlink
  busybox ln -s /sd-ext/dalvik-cache /data/dalvik-cache;
  
  ###> Now Remove /data/dalvik-delete
  if [ -e /data/dalvik-delete ]
  then
    busybox rm -R /data/dalvik-delete;
  fi;
  
  
  ###> Run Dalvik Waiter Script
  date > /data/ad2sdx/dalvik-last-wipe.log
  sh /data/ad2sdx/dalvik-waiter.sh > /data/ad2sdx/dalvik-waiter.log 2>&1 &
fi;
if [ ! -e /data/dalvik-cache ]
then
  busybox ln -s /sd-ext/dalvik-cache /data/dalvik-cache;
fi;
#
##################################### END OF DALVIK MANAGEMENT #########################################


########################################## DATA MANAGEMENT #############################################
#
###> AD2SDX First Boot
#
# Initializing AD2SDX For First Boot
#
##
if [ ! -e /data/ad2sdx/init ]
then
  ###> Create /sd-ext/data_s + chown + chmod
  busybox mkdir /sd-ext/data_s;
  busybox chown system:system /sd-ext/data_s;
  busybox chmod 771 /sd-ext/data_s
  
  ###> Create Symlink of /sd-ext/data_s
  busybox ln -s /sd-ext/data_s /data/data
  busybox ln -s /data/data /sd-ext/data
  
  ###> We should move /sd-ext/app to /data/app
  if [ -e /data/app ]
  then
    if [ -e /sd-ext/app ]
    then
      busybox mv /sd-ext/app/* /data/app/;
      busybox rm -R /sd-ext/app;
    fi;
  else
    busybox mv /sd-ext/app /data/;
  fi;
  
  ###> Now create symlink of the rest non Symlink Directories and Files on /sd-ext to /data
  cd /sd-ext;
  for i in `ls -a`;
  do
    if [ $i != ".." -a $i != "." ]
    then
      if [ ! -h /sd-ext/$i ]
      then
        if [ ! -h /data/$i ]
        then
          busybox ln -s /sd-ext/$i /data/$i;
        fi;
      fi;
    fi;
  done;
  cd /;
  sync;
  
  ###> It should also need to create the rest non Symlink Directories and Files on /data to /sd-ext
  cd /data;
  for i in `ls -a`;
  do
    if [ $i != ".." -a $i != "." ]
    then
      if [ ! -h /data/$i ]
      then
        if [ ! -h /sd-ext/$i ]
        then
          busybox ln -s /data/$i /sd-ext/$i;
        fi;
      fi;
    fi;
  done;
  sync;
  cd /;
  
  ###> Touch File, so next boot it don't need to do again
  busybox touch /data/ad2sdx/init
  sync;
  
  ###> Run Waiter Script
  sh /data/ad2sdx/waiter.sh > /data/ad2sdx/waiter.log 2>&1 &


###> If Waiter Script Not Finished yet in 1st boot
#
# If in 1st boot the waiter script didn't finish the initializing
# re-do the waiter script in the next boot.
#
##
else
  if [ ! -e /data/ad2sdx/init2 ]
  then
    ###> Run Waiter Script
    sh /data/ad2sdx/waiter.sh > /data/ad2sdx/waiter.log 2>&1 &
  fi;
fi;
#
#################################### END OF DATA MANAGEMENT ########################################

# SAVE VERSION
echo "$AD2SDX_VERSION" > /data/ad2sdx/version;
cat /data/ad2sdx/version;