+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ant.properties b/ant.properties
deleted file mode 100644
index fb0849b1..00000000
--- a/ant.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked in Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-# 'source.dir' for the location of your java source folder and
-# 'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-# 'key.store' for the location of your keystore and
-# 'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
-key.store=subsonic.keystore
-key.alias=subsonic
-
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 00000000..88d246d4
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,15 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:1.2.3'
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
diff --git a/build.xml b/build.xml
deleted file mode 100644
index 7f160548..00000000
--- a/build.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/debug.keystore b/debug.keystore
deleted file mode 100644
index 1cb2c3d1..00000000
Binary files a/debug.keystore and /dev/null differ
diff --git a/default.properties b/default.properties
deleted file mode 100644
index 8da376af..00000000
--- a/default.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-15
diff --git a/drag-sort-listview b/drag-sort-listview
deleted file mode 160000
index c3cfccee..00000000
--- a/drag-sort-listview
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit c3cfccee21676149dfdf8e803c0ec2eaebc6b841
diff --git a/drag-sort-listview.iml b/drag-sort-listview.iml
deleted file mode 100644
index 9fbcc75d..00000000
--- a/drag-sort-listview.iml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..8c0fb64a
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..0c71e760
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 00000000..91a7e269
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 00000000..aec99730
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/import-summary.txt b/import-summary.txt
new file mode 100644
index 00000000..94ed4717
--- /dev/null
+++ b/import-summary.txt
@@ -0,0 +1,809 @@
+ECLIPSE ANDROID PROJECT IMPORT SUMMARY
+======================================
+
+Manifest Merging:
+-----------------
+Your project uses libraries that provide manifests, and your Eclipse
+project did not explicitly turn on manifest merging. In Android Gradle
+projects, manifests are always merged (meaning that contents from your
+libraries' manifests will be merged into the app manifest. If you had
+manually copied contents from library manifests into your app manifest
+you may need to remove these for the app to build correctly.
+
+Ignored Files:
+--------------
+The following files were *not* copied into the new Gradle project; you
+should evaluate whether these are still needed in your project and if
+so manually move them:
+
+From UltraSonic:
+* .gitattributes
+* .gitignore
+* .gitmodules
+* .idea/
+* .idea/.name
+* .idea/codeStyleSettings.xml
+* .idea/compiler.xml
+* .idea/copyright/
+* .idea/copyright/profiles_settings.xml
+* .idea/dictionaries/
+* .idea/dictionaries/Josh.xml
+* .idea/encodings.xml
+* .idea/inspectionProfiles/
+* .idea/inspectionProfiles/Project_Default.xml
+* .idea/inspectionProfiles/profiles_settings.xml
+* .idea/modules.xml
+* .idea/scopes/
+* .idea/scopes/scope_settings.xml
+* .idea/vcs.xml
+* Subsonic-Android.iml
+* ant.properties
+* build.xml
+* debug.keystore
+* default.properties
+* drag-sort-listview.iml
+* drag-sort-listview/
+* drag-sort-listview/.git
+* drag-sort-listview/.gitignore
+* drag-sort-listview/CHANGELOG.md
+* drag-sort-listview/README.md
+* drag-sort-listview/demo/
+* drag-sort-listview/demo/.gitignore
+* drag-sort-listview/demo/AndroidManifest.xml
+* drag-sort-listview/demo/ant.properties
+* drag-sort-listview/demo/app-description.txt
+* drag-sort-listview/demo/build.xml
+* drag-sort-listview/demo/libs/
+* drag-sort-listview/demo/libs/android-support-v4.jar
+* drag-sort-listview/demo/pom.xml
+* drag-sort-listview/demo/proguard-project.txt
+* drag-sort-listview/demo/project.properties
+* drag-sort-listview/demo/res/
+* drag-sort-listview/demo/res/drawable-hdpi/
+* drag-sort-listview/demo/res/drawable-hdpi/delete_x.png
+* drag-sort-listview/demo/res/drawable-hdpi/drag.9.png
+* drag-sort-listview/demo/res/drawable-hdpi/dslv_launcher.png
+* drag-sort-listview/demo/res/drawable-ldpi/
+* drag-sort-listview/demo/res/drawable-ldpi/dslv_launcher.png
+* drag-sort-listview/demo/res/drawable-mdpi/
+* drag-sort-listview/demo/res/drawable-mdpi/drag.9.png
+* drag-sort-listview/demo/res/drawable-mdpi/dslv_launcher.png
+* drag-sort-listview/demo/res/drawable-xhdpi/
+* drag-sort-listview/demo/res/drawable-xhdpi/dslv_launcher.png
+* drag-sort-listview/demo/res/drawable/
+* drag-sort-listview/demo/res/drawable/bg_handle.xml
+* drag-sort-listview/demo/res/drawable/bg_handle_section1.xml
+* drag-sort-listview/demo/res/drawable/bg_handle_section1_selector.xml
+* drag-sort-listview/demo/res/drawable/bg_handle_section2.xml
+* drag-sort-listview/demo/res/drawable/bg_handle_section2_selector.xml
+* drag-sort-listview/demo/res/drawable/drag.9.png
+* drag-sort-listview/demo/res/drawable/section_div.xml
+* drag-sort-listview/demo/res/layout/
+* drag-sort-listview/demo/res/layout/bg_handle_main.xml
+* drag-sort-listview/demo/res/layout/checkable_main.xml
+* drag-sort-listview/demo/res/layout/cursor_main.xml
+* drag-sort-listview/demo/res/layout/dslv_fragment_main.xml
+* drag-sort-listview/demo/res/layout/header_footer.xml
+* drag-sort-listview/demo/res/layout/hetero_main.xml
+* drag-sort-listview/demo/res/layout/jazz_artist_list_item.xml
+* drag-sort-listview/demo/res/layout/launcher.xml
+* drag-sort-listview/demo/res/layout/launcher_item.xml
+* drag-sort-listview/demo/res/layout/list_item_bg_handle.xml
+* drag-sort-listview/demo/res/layout/list_item_checkable.xml
+* drag-sort-listview/demo/res/layout/list_item_click_remove.xml
+* drag-sort-listview/demo/res/layout/list_item_handle_left.xml
+* drag-sort-listview/demo/res/layout/list_item_handle_right.xml
+* drag-sort-listview/demo/res/layout/list_item_no_handle.xml
+* drag-sort-listview/demo/res/layout/list_item_radio.xml
+* drag-sort-listview/demo/res/layout/section_div.xml
+* drag-sort-listview/demo/res/layout/sections_main.xml
+* drag-sort-listview/demo/res/layout/test_bed_main.xml
+* drag-sort-listview/demo/res/layout/warp_main.xml
+* drag-sort-listview/demo/res/menu/
+* drag-sort-listview/demo/res/menu/mode_menu.xml
+* drag-sort-listview/demo/res/values/
+* drag-sort-listview/demo/res/values/colors.xml
+* drag-sort-listview/demo/res/values/dimens.xml
+* drag-sort-listview/demo/res/values/ids.xml
+* drag-sort-listview/demo/res/values/strings.xml
+* drag-sort-listview/demo/src/
+* drag-sort-listview/demo/src/com/
+* drag-sort-listview/demo/src/com/mobeta/
+* drag-sort-listview/demo/src/com/mobeta/android/
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/ArbItemSizeDSLV.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/BGHandle.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/CheckableLinearLayout.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/CursorDSLV.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/DSLVFragment.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/DSLVFragmentBGHandle.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/DSLVFragmentClicks.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/DragInitModeDialog.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/EnablesDialog.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/Launcher.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/MultipleChoiceListView.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/RemoveModeDialog.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/Sections.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/SingleChoiceListView.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/TestBedDSLV.java
+* drag-sort-listview/demo/src/com/mobeta/android/demodslv/WarpDSLV.java
+* drag-sort-listview/library/
+* drag-sort-listview/library/.gitignore
+* drag-sort-listview/library/AndroidManifest.xml
+* drag-sort-listview/library/ant.properties
+* drag-sort-listview/library/build.xml
+* drag-sort-listview/library/libs/
+* drag-sort-listview/library/libs/android-support-v4.jar
+* drag-sort-listview/library/pom.xml
+* drag-sort-listview/library/proguard-project.txt
+* drag-sort-listview/library/project.properties
+* drag-sort-listview/library/res/
+* drag-sort-listview/library/res/values/
+* drag-sort-listview/library/res/values/dslv_attrs.xml
+* drag-sort-listview/library/src/
+* drag-sort-listview/library/src/com/
+* drag-sort-listview/library/src/com/mobeta/
+* drag-sort-listview/library/src/com/mobeta/android/
+* drag-sort-listview/library/src/com/mobeta/android/dslv/
+* drag-sort-listview/library/src/com/mobeta/android/dslv/DragSortController.java
+* drag-sort-listview/library/src/com/mobeta/android/dslv/DragSortCursorAdapter.java
+* drag-sort-listview/library/src/com/mobeta/android/dslv/DragSortItemView.java
+* drag-sort-listview/library/src/com/mobeta/android/dslv/DragSortItemViewCheckable.java
+* drag-sort-listview/library/src/com/mobeta/android/dslv/DragSortListView.java
+* drag-sort-listview/library/src/com/mobeta/android/dslv/ResourceDragSortCursorAdapter.java
+* drag-sort-listview/library/src/com/mobeta/android/dslv/SimpleDragSortCursorAdapter.java
+* drag-sort-listview/library/src/com/mobeta/android/dslv/SimpleFloatViewManager.java
+* drag-sort-listview/pom.xml
+* drag-sort-listview/tools/
+* drag-sort-listview/tools/demo-sign-align.sh
+* drag-sort-listview/tools/doc-dslv.sh
+* drag-sort-listview/tools/dslv.py
+* drag-sort-listview/tools/pkg-dslv.sh
+* menudrawer.iml
+* menudrawer/
+* menudrawer/.git
+* menudrawer/.gitignore
+* menudrawer/CHANGELOG.md
+* menudrawer/LICENSE
+* menudrawer/README.md
+* menudrawer/art/
+* menudrawer/art/menu_arrow.svg
+* menudrawer/build.gradle
+* menudrawer/checkstyle.xml
+* menudrawer/gradle/
+* menudrawer/gradle/wrapper/
+* menudrawer/gradle/wrapper/gradle-wrapper.jar
+* menudrawer/gradle/wrapper/gradle-wrapper.properties
+* menudrawer/gradlew
+* menudrawer/gradlew.bat
+* menudrawer/menudrawer-samples/
+* menudrawer/menudrawer-samples/AndroidManifest.xml
+* menudrawer/menudrawer-samples/build.gradle
+* menudrawer/menudrawer-samples/res/
+* menudrawer/menudrawer-samples/res/drawable-hdpi-v14/
+* menudrawer/menudrawer-samples/res/drawable-hdpi-v14/menu_arrow_bottom.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi-v14/menu_arrow_end.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi-v14/menu_arrow_start.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi-v14/menu_arrow_top.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/
+* menudrawer/menudrawer-samples/res/drawable-hdpi/ic_action_refresh_dark.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/ic_action_select_all_dark.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/ic_drawer.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/ic_launcher.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/ic_menu_moreoverflow_normal_holo_light.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/md__category_background.9.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/md__list_focused_holo.9.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/md__list_longpressed_holo.9.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/md__list_pressed_holo_dark.9.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/md__list_selector_disabled_holo_dark.9.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/menu_arrow_bottom.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/menu_arrow_end.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/menu_arrow_start.png
+* menudrawer/menudrawer-samples/res/drawable-hdpi/menu_arrow_top.png
+* menudrawer/menudrawer-samples/res/drawable-ldrtl-hdpi/
+* menudrawer/menudrawer-samples/res/drawable-ldrtl-hdpi/ic_drawer.png
+* menudrawer/menudrawer-samples/res/drawable-ldrtl-hdpi/menu_arrow_end.png
+* menudrawer/menudrawer-samples/res/drawable-ldrtl-hdpi/menu_arrow_start.png
+* menudrawer/menudrawer-samples/res/drawable-ldrtl-mdpi/
+* menudrawer/menudrawer-samples/res/drawable-ldrtl-mdpi/ic_drawer.png
+* menudrawer/menudrawer-samples/res/drawable-ldrtl-mdpi/menu_arrow_end.png
+* menudrawer/menudrawer-samples/res/drawable-ldrtl-mdpi/menu_arrow_start.png
+* menudrawer/menudrawer-samples/res/drawable-ldrtl-xhdpi/
+* menudrawer/menudrawer-samples/res/drawable-ldrtl-xhdpi/ic_drawer.png
+* menudrawer/menudrawer-samples/res/drawable-ldrtl-xhdpi/menu_arrow_end.png
+* menudrawer/menudrawer-samples/res/drawable-ldrtl-xhdpi/menu_arrow_start.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi-v14/
+* menudrawer/menudrawer-samples/res/drawable-mdpi-v14/menu_arrow_bottom.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi-v14/menu_arrow_end.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi-v14/menu_arrow_start.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi-v14/menu_arrow_top.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/
+* menudrawer/menudrawer-samples/res/drawable-mdpi/ic_action_refresh_dark.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/ic_action_select_all_dark.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/ic_drawer.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/ic_launcher.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_light.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/md__category_background.9.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/md__list_focused_holo.9.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/md__list_longpressed_holo.9.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/md__list_pressed_holo_dark.9.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/md__list_selector_disabled_holo_dark.9.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/menu_arrow_bottom.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/menu_arrow_end.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/menu_arrow_start.png
+* menudrawer/menudrawer-samples/res/drawable-mdpi/menu_arrow_top.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi-v14/
+* menudrawer/menudrawer-samples/res/drawable-xhdpi-v14/menu_arrow_bottom.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi-v14/menu_arrow_end.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi-v14/menu_arrow_start.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi-v14/menu_arrow_top.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/ic_action_refresh_dark.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/ic_action_select_all_dark.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/ic_drawer.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/ic_launcher.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/ic_menu_moreoverflow_normal_holo_light.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/md__category_background.9.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/md__list_focused_holo.9.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/md__list_longpressed_holo.9.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/md__list_pressed_holo_dark.9.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/md__list_selector_disabled_holo_dark.9.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/menu_arrow_bottom.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/menu_arrow_end.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/menu_arrow_start.png
+* menudrawer/menudrawer-samples/res/drawable-xhdpi/menu_arrow_top.png
+* menudrawer/menudrawer-samples/res/drawable/
+* menudrawer/menudrawer-samples/res/drawable/md__list_selector_background_transition_holo_dark.xml
+* menudrawer/menudrawer-samples/res/drawable/md__list_selector_holo_dark.xml
+* menudrawer/menudrawer-samples/res/layout/
+* menudrawer/menudrawer-samples/res/layout/activity_bottommenu.xml
+* menudrawer/menudrawer-samples/res/layout/activity_contentsample.xml
+* menudrawer/menudrawer-samples/res/layout/activity_layoutsample.xml
+* menudrawer/menudrawer-samples/res/layout/activity_rightmenu.xml
+* menudrawer/menudrawer-samples/res/layout/activity_staticsample.xml
+* menudrawer/menudrawer-samples/res/layout/activity_topmenu.xml
+* menudrawer/menudrawer-samples/res/layout/activity_viewpagersample.xml
+* menudrawer/menudrawer-samples/res/layout/activity_windowsample.xml
+* menudrawer/menudrawer-samples/res/layout/fragment_sample.xml
+* menudrawer/menudrawer-samples/res/layout/list_row_sample.xml
+* menudrawer/menudrawer-samples/res/layout/list_row_sample_header.xml
+* menudrawer/menudrawer-samples/res/layout/main.xml
+* menudrawer/menudrawer-samples/res/layout/menu_bottom.xml
+* menudrawer/menudrawer-samples/res/layout/menu_row_category.xml
+* menudrawer/menudrawer-samples/res/layout/menu_row_item.xml
+* menudrawer/menudrawer-samples/res/layout/menu_scrollview.xml
+* menudrawer/menudrawer-samples/res/layout/menu_top.xml
+* menudrawer/menudrawer-samples/res/values-v14/
+* menudrawer/menudrawer-samples/res/values-v14/colors.xml
+* menudrawer/menudrawer-samples/res/values-v14/themes.xml
+* menudrawer/menudrawer-samples/res/values/
+* menudrawer/menudrawer-samples/res/values/colors.xml
+* menudrawer/menudrawer-samples/res/values/strings.xml
+* menudrawer/menudrawer-samples/res/values/styles.xml
+* menudrawer/menudrawer-samples/res/values/themes.xml
+* menudrawer/menudrawer-samples/src/
+* menudrawer/menudrawer-samples/src/net/
+* menudrawer/menudrawer-samples/src/net/simonvt/
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/ActionBarSherlockSample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/BaseListSample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/BottomDrawerSample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/BottomOverlaySample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/Category.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/FragmentSample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/Item.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/LayoutSample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/LeftDrawerSample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/LeftOverlaySample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/ListActivitySample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/MenuAdapter.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/RightDrawerSample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/RightOverlaySample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/SamplesActivity.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/StaticDrawerSample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/TopDrawerSample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/TopOverlaySample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/ViewPagerSample.java
+* menudrawer/menudrawer-samples/src/net/simonvt/menudrawer/samples/WindowSample.java
+* menudrawer/menudrawer/
+* menudrawer/menudrawer/AndroidManifest.xml
+* menudrawer/menudrawer/build.gradle
+* menudrawer/menudrawer/res/
+* menudrawer/menudrawer/res/values/
+* menudrawer/menudrawer/res/values/attrs.xml
+* menudrawer/menudrawer/res/values/colors.xml
+* menudrawer/menudrawer/res/values/ids.xml
+* menudrawer/menudrawer/res/values/strings.xml
+* menudrawer/menudrawer/res/values/styles.xml
+* menudrawer/menudrawer/src/
+* menudrawer/menudrawer/src/net/
+* menudrawer/menudrawer/src/net/simonvt/
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/BuildLayerFrameLayout.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/ColorDrawable.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/DraggableDrawer.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/FloatScroller.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/MenuDrawer.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/NoClickThroughFrameLayout.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/OverlayDrawer.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/PeekInterpolator.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/Position.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/Scroller.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/SinusoidalInterpolator.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/SlideDrawable.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/SlidingDrawer.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/SmoothInterpolator.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/StaticDrawer.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/ViewHelper.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/compat/
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/compat/ActionBarHelper.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/compat/ActionBarHelperCompat.java
+* menudrawer/menudrawer/src/net/simonvt/menudrawer/compat/ActionBarHelperNative.java
+* menudrawer/settings.gradle
+* proguard.cfg
+* pulltorefresh.iml
+* pulltorefresh/
+* pulltorefresh/.git
+* pulltorefresh/.gitignore
+* pulltorefresh/LICENSE
+* pulltorefresh/README.md
+* pulltorefresh/extras/
+* pulltorefresh/extras/PullToRefreshListFragment/
+* pulltorefresh/extras/PullToRefreshListFragment/AndroidManifest.xml
+* pulltorefresh/extras/PullToRefreshListFragment/LICENSE
+* pulltorefresh/extras/PullToRefreshListFragment/libs/
+* pulltorefresh/extras/PullToRefreshListFragment/libs/android-support-v4.jar
+* pulltorefresh/extras/PullToRefreshListFragment/pom.xml
+* pulltorefresh/extras/PullToRefreshListFragment/project.properties
+* pulltorefresh/extras/PullToRefreshListFragment/res/
+* pulltorefresh/extras/PullToRefreshListFragment/res/layout/
+* pulltorefresh/extras/PullToRefreshListFragment/res/layout/need_this_for_maven.xml
+* pulltorefresh/extras/PullToRefreshListFragment/src/
+* pulltorefresh/extras/PullToRefreshListFragment/src/com/
+* pulltorefresh/extras/PullToRefreshListFragment/src/com/handmark/
+* pulltorefresh/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/
+* pulltorefresh/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/
+* pulltorefresh/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/
+* pulltorefresh/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshBaseListFragment.java
+* pulltorefresh/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshExpandableListFragment.java
+* pulltorefresh/extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshListFragment.java
+* pulltorefresh/extras/PullToRefreshViewPager/
+* pulltorefresh/extras/PullToRefreshViewPager/AndroidManifest.xml
+* pulltorefresh/extras/PullToRefreshViewPager/ant.properties
+* pulltorefresh/extras/PullToRefreshViewPager/libs/
+* pulltorefresh/extras/PullToRefreshViewPager/libs/android-support-v4.jar
+* pulltorefresh/extras/PullToRefreshViewPager/pom.xml
+* pulltorefresh/extras/PullToRefreshViewPager/proguard-project.txt
+* pulltorefresh/extras/PullToRefreshViewPager/project.properties
+* pulltorefresh/extras/PullToRefreshViewPager/res/
+* pulltorefresh/extras/PullToRefreshViewPager/res/layout/
+* pulltorefresh/extras/PullToRefreshViewPager/res/layout/need_this_for_maven.xml
+* pulltorefresh/extras/PullToRefreshViewPager/res/values/
+* pulltorefresh/extras/PullToRefreshViewPager/res/values/ids.xml
+* pulltorefresh/extras/PullToRefreshViewPager/src/
+* pulltorefresh/extras/PullToRefreshViewPager/src/com/
+* pulltorefresh/extras/PullToRefreshViewPager/src/com/handmark/
+* pulltorefresh/extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/
+* pulltorefresh/extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/
+* pulltorefresh/extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/
+* pulltorefresh/extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java
+* pulltorefresh/extras/pom.xml
+* pulltorefresh/header_graphic.png
+* pulltorefresh/library/
+* pulltorefresh/library/AndroidManifest.xml
+* pulltorefresh/library/LICENSE
+* pulltorefresh/library/pom.xml
+* pulltorefresh/library/project.properties
+* pulltorefresh/library/res/
+* pulltorefresh/library/res/anim/
+* pulltorefresh/library/res/anim/slide_in_from_bottom.xml
+* pulltorefresh/library/res/anim/slide_in_from_top.xml
+* pulltorefresh/library/res/anim/slide_out_to_bottom.xml
+* pulltorefresh/library/res/anim/slide_out_to_top.xml
+* pulltorefresh/library/res/drawable-hdpi/
+* pulltorefresh/library/res/drawable-hdpi/default_ptr_flip.png
+* pulltorefresh/library/res/drawable-hdpi/default_ptr_rotate.png
+* pulltorefresh/library/res/drawable-hdpi/indicator_arrow.png
+* pulltorefresh/library/res/drawable-mdpi/
+* pulltorefresh/library/res/drawable-mdpi/default_ptr_flip.png
+* pulltorefresh/library/res/drawable-mdpi/default_ptr_rotate.png
+* pulltorefresh/library/res/drawable-mdpi/indicator_arrow.png
+* pulltorefresh/library/res/drawable-xhdpi/
+* pulltorefresh/library/res/drawable-xhdpi/default_ptr_flip.png
+* pulltorefresh/library/res/drawable-xhdpi/default_ptr_rotate.png
+* pulltorefresh/library/res/drawable-xhdpi/indicator_arrow.png
+* pulltorefresh/library/res/drawable/
+* pulltorefresh/library/res/drawable/indicator_bg_bottom.xml
+* pulltorefresh/library/res/drawable/indicator_bg_top.xml
+* pulltorefresh/library/res/layout/
+* pulltorefresh/library/res/layout/pull_to_refresh_header_horizontal.xml
+* pulltorefresh/library/res/layout/pull_to_refresh_header_vertical.xml
+* pulltorefresh/library/res/values-ar/
+* pulltorefresh/library/res/values-ar/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-cs/
+* pulltorefresh/library/res/values-cs/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-de/
+* pulltorefresh/library/res/values-de/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-es/
+* pulltorefresh/library/res/values-es/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-fi/
+* pulltorefresh/library/res/values-fi/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-fr/
+* pulltorefresh/library/res/values-fr/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-he/
+* pulltorefresh/library/res/values-he/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-it/
+* pulltorefresh/library/res/values-it/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-iw/
+* pulltorefresh/library/res/values-iw/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-ja/
+* pulltorefresh/library/res/values-ja/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-ko/
+* pulltorefresh/library/res/values-ko/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-nl/
+* pulltorefresh/library/res/values-nl/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-pl/
+* pulltorefresh/library/res/values-pl/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-pt-rBR/
+* pulltorefresh/library/res/values-pt-rBR/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-pt/
+* pulltorefresh/library/res/values-pt/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-ro/
+* pulltorefresh/library/res/values-ro/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-ru/
+* pulltorefresh/library/res/values-ru/pull_refresh_strings.xml
+* pulltorefresh/library/res/values-zh/
+* pulltorefresh/library/res/values-zh/pull_refresh_strings.xml
+* pulltorefresh/library/res/values/
+* pulltorefresh/library/res/values/attrs.xml
+* pulltorefresh/library/res/values/dimens.xml
+* pulltorefresh/library/res/values/ids.xml
+* pulltorefresh/library/res/values/pull_refresh_strings.xml
+* pulltorefresh/library/src/
+* pulltorefresh/library/src/com/
+* pulltorefresh/library/src/com/handmark/
+* pulltorefresh/library/src/com/handmark/pulltorefresh/
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/ILoadingLayout.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/extras/
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/internal/
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/internal/Utils.java
+* pulltorefresh/library/src/com/handmark/pulltorefresh/library/internal/ViewCompat.java
+* pulltorefresh/pom.xml
+* pulltorefresh/sample/
+* pulltorefresh/sample/AndroidManifest.xml
+* pulltorefresh/sample/LICENSE
+* pulltorefresh/sample/assets/
+* pulltorefresh/sample/assets/ptr_webview2_sample.html
+* pulltorefresh/sample/libs/
+* pulltorefresh/sample/libs/android-support-v4.jar
+* pulltorefresh/sample/pom.xml
+* pulltorefresh/sample/project.properties
+* pulltorefresh/sample/res/
+* pulltorefresh/sample/res/drawable-hdpi/
+* pulltorefresh/sample/res/drawable-hdpi/android.png
+* pulltorefresh/sample/res/drawable-hdpi/icon.png
+* pulltorefresh/sample/res/drawable-ldpi/
+* pulltorefresh/sample/res/drawable-ldpi/icon.png
+* pulltorefresh/sample/res/drawable-mdpi/
+* pulltorefresh/sample/res/drawable-mdpi/icon.png
+* pulltorefresh/sample/res/drawable-nodpi/
+* pulltorefresh/sample/res/drawable-nodpi/wallpaper.jpg
+* pulltorefresh/sample/res/drawable-xhdpi/
+* pulltorefresh/sample/res/drawable-xhdpi/android.png
+* pulltorefresh/sample/res/drawable/
+* pulltorefresh/sample/res/drawable/icon.png
+* pulltorefresh/sample/res/layout/
+* pulltorefresh/sample/res/layout/activity_ptr_expandable_list.xml
+* pulltorefresh/sample/res/layout/activity_ptr_grid.xml
+* pulltorefresh/sample/res/layout/activity_ptr_horizontalscrollview.xml
+* pulltorefresh/sample/res/layout/activity_ptr_list.xml
+* pulltorefresh/sample/res/layout/activity_ptr_list_fragment.xml
+* pulltorefresh/sample/res/layout/activity_ptr_list_in_vp.xml
+* pulltorefresh/sample/res/layout/activity_ptr_scrollview.xml
+* pulltorefresh/sample/res/layout/activity_ptr_viewpager.xml
+* pulltorefresh/sample/res/layout/activity_ptr_webview.xml
+* pulltorefresh/sample/res/layout/activity_ptr_webview2.xml
+* pulltorefresh/sample/res/layout/layout_listview_in_viewpager.xml
+* pulltorefresh/sample/res/raw/
+* pulltorefresh/sample/res/raw/pull_event.mp3
+* pulltorefresh/sample/res/raw/refreshing_sound.mp3
+* pulltorefresh/sample/res/raw/reset_sound.mp3
+* pulltorefresh/sample/res/values/
+* pulltorefresh/sample/res/values/strings.xml
+* pulltorefresh/sample/res/values/styles.xml
+* pulltorefresh/sample/src/
+* pulltorefresh/sample/src/com/
+* pulltorefresh/sample/src/com/handmark/
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/samples/
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshGridActivity.java
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshHorizontalScrollViewActivity.java
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListFragmentActivity.java
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListInViewPagerActivity.java
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshScrollViewActivity.java
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshViewPagerActivity.java
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshWebView2Activity.java
+* pulltorefresh/sample/src/com/handmark/pulltorefresh/samples/PullToRefreshWebViewActivity.java
+* subsonic.keystore
+From library:
+* .gitignore
+* ant.properties
+* build.xml
+* pom.xml
+* proguard-project.txt
+From menudrawer:
+* build.gradle
+From pulltorefresh:
+* .git
+* .gitignore
+* LICENSE
+* README.md
+* extras/
+* extras/PullToRefreshListFragment/
+* extras/PullToRefreshListFragment/AndroidManifest.xml
+* extras/PullToRefreshListFragment/LICENSE
+* extras/PullToRefreshListFragment/libs/
+* extras/PullToRefreshListFragment/libs/android-support-v4.jar
+* extras/PullToRefreshListFragment/pom.xml
+* extras/PullToRefreshListFragment/project.properties
+* extras/PullToRefreshListFragment/res/
+* extras/PullToRefreshListFragment/res/layout/
+* extras/PullToRefreshListFragment/res/layout/need_this_for_maven.xml
+* extras/PullToRefreshListFragment/src/
+* extras/PullToRefreshListFragment/src/com/
+* extras/PullToRefreshListFragment/src/com/handmark/
+* extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/
+* extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/
+* extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/
+* extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshBaseListFragment.java
+* extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshExpandableListFragment.java
+* extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshListFragment.java
+* extras/PullToRefreshViewPager/
+* extras/PullToRefreshViewPager/AndroidManifest.xml
+* extras/PullToRefreshViewPager/ant.properties
+* extras/PullToRefreshViewPager/libs/
+* extras/PullToRefreshViewPager/libs/android-support-v4.jar
+* extras/PullToRefreshViewPager/pom.xml
+* extras/PullToRefreshViewPager/proguard-project.txt
+* extras/PullToRefreshViewPager/project.properties
+* extras/PullToRefreshViewPager/res/
+* extras/PullToRefreshViewPager/res/layout/
+* extras/PullToRefreshViewPager/res/layout/need_this_for_maven.xml
+* extras/PullToRefreshViewPager/res/values/
+* extras/PullToRefreshViewPager/res/values/ids.xml
+* extras/PullToRefreshViewPager/src/
+* extras/PullToRefreshViewPager/src/com/
+* extras/PullToRefreshViewPager/src/com/handmark/
+* extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/
+* extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/
+* extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/
+* extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java
+* extras/pom.xml
+* header_graphic.png
+* library/
+* library/AndroidManifest.xml
+* library/LICENSE
+* library/pom.xml
+* library/project.properties
+* library/res/
+* library/res/anim/
+* library/res/anim/slide_in_from_bottom.xml
+* library/res/anim/slide_in_from_top.xml
+* library/res/anim/slide_out_to_bottom.xml
+* library/res/anim/slide_out_to_top.xml
+* library/res/drawable-hdpi/
+* library/res/drawable-hdpi/default_ptr_flip.png
+* library/res/drawable-hdpi/default_ptr_rotate.png
+* library/res/drawable-hdpi/indicator_arrow.png
+* library/res/drawable-mdpi/
+* library/res/drawable-mdpi/default_ptr_flip.png
+* library/res/drawable-mdpi/default_ptr_rotate.png
+* library/res/drawable-mdpi/indicator_arrow.png
+* library/res/drawable-xhdpi/
+* library/res/drawable-xhdpi/default_ptr_flip.png
+* library/res/drawable-xhdpi/default_ptr_rotate.png
+* library/res/drawable-xhdpi/indicator_arrow.png
+* library/res/drawable/
+* library/res/drawable/indicator_bg_bottom.xml
+* library/res/drawable/indicator_bg_top.xml
+* library/res/layout/
+* library/res/layout/pull_to_refresh_header_horizontal.xml
+* library/res/layout/pull_to_refresh_header_vertical.xml
+* library/res/values-ar/
+* library/res/values-ar/pull_refresh_strings.xml
+* library/res/values-cs/
+* library/res/values-cs/pull_refresh_strings.xml
+* library/res/values-de/
+* library/res/values-de/pull_refresh_strings.xml
+* library/res/values-es/
+* library/res/values-es/pull_refresh_strings.xml
+* library/res/values-fi/
+* library/res/values-fi/pull_refresh_strings.xml
+* library/res/values-fr/
+* library/res/values-fr/pull_refresh_strings.xml
+* library/res/values-he/
+* library/res/values-he/pull_refresh_strings.xml
+* library/res/values-it/
+* library/res/values-it/pull_refresh_strings.xml
+* library/res/values-iw/
+* library/res/values-iw/pull_refresh_strings.xml
+* library/res/values-ja/
+* library/res/values-ja/pull_refresh_strings.xml
+* library/res/values-ko/
+* library/res/values-ko/pull_refresh_strings.xml
+* library/res/values-nl/
+* library/res/values-nl/pull_refresh_strings.xml
+* library/res/values-pl/
+* library/res/values-pl/pull_refresh_strings.xml
+* library/res/values-pt-rBR/
+* library/res/values-pt-rBR/pull_refresh_strings.xml
+* library/res/values-pt/
+* library/res/values-pt/pull_refresh_strings.xml
+* library/res/values-ro/
+* library/res/values-ro/pull_refresh_strings.xml
+* library/res/values-ru/
+* library/res/values-ru/pull_refresh_strings.xml
+* library/res/values-zh/
+* library/res/values-zh/pull_refresh_strings.xml
+* library/res/values/
+* library/res/values/attrs.xml
+* library/res/values/dimens.xml
+* library/res/values/ids.xml
+* library/res/values/pull_refresh_strings.xml
+* library/src/
+* library/src/com/
+* library/src/com/handmark/
+* library/src/com/handmark/pulltorefresh/
+* library/src/com/handmark/pulltorefresh/library/
+* library/src/com/handmark/pulltorefresh/library/ILoadingLayout.java
+* library/src/com/handmark/pulltorefresh/library/IPullToRefresh.java
+* library/src/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java
+* library/src/com/handmark/pulltorefresh/library/OverscrollHelper.java
+* library/src/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java
+* library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java
+* library/src/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java
+* library/src/com/handmark/pulltorefresh/library/PullToRefreshGridView.java
+* library/src/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java
+* library/src/com/handmark/pulltorefresh/library/PullToRefreshListView.java
+* library/src/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java
+* library/src/com/handmark/pulltorefresh/library/PullToRefreshWebView.java
+* library/src/com/handmark/pulltorefresh/library/extras/
+* library/src/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java
+* library/src/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java
+* library/src/com/handmark/pulltorefresh/library/internal/
+* library/src/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java
+* library/src/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java
+* library/src/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java
+* library/src/com/handmark/pulltorefresh/library/internal/LoadingLayout.java
+* library/src/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java
+* library/src/com/handmark/pulltorefresh/library/internal/Utils.java
+* library/src/com/handmark/pulltorefresh/library/internal/ViewCompat.java
+* pom.xml
+* sample/
+* sample/AndroidManifest.xml
+* sample/LICENSE
+* sample/assets/
+* sample/assets/ptr_webview2_sample.html
+* sample/libs/
+* sample/libs/android-support-v4.jar
+* sample/pom.xml
+* sample/project.properties
+* sample/res/
+* sample/res/drawable-hdpi/
+* sample/res/drawable-hdpi/android.png
+* sample/res/drawable-hdpi/icon.png
+* sample/res/drawable-ldpi/
+* sample/res/drawable-ldpi/icon.png
+* sample/res/drawable-mdpi/
+* sample/res/drawable-mdpi/icon.png
+* sample/res/drawable-nodpi/
+* sample/res/drawable-nodpi/wallpaper.jpg
+* sample/res/drawable-xhdpi/
+* sample/res/drawable-xhdpi/android.png
+* sample/res/drawable/
+* sample/res/drawable/icon.png
+* sample/res/layout/
+* sample/res/layout/activity_ptr_expandable_list.xml
+* sample/res/layout/activity_ptr_grid.xml
+* sample/res/layout/activity_ptr_horizontalscrollview.xml
+* sample/res/layout/activity_ptr_list.xml
+* sample/res/layout/activity_ptr_list_fragment.xml
+* sample/res/layout/activity_ptr_list_in_vp.xml
+* sample/res/layout/activity_ptr_scrollview.xml
+* sample/res/layout/activity_ptr_viewpager.xml
+* sample/res/layout/activity_ptr_webview.xml
+* sample/res/layout/activity_ptr_webview2.xml
+* sample/res/layout/layout_listview_in_viewpager.xml
+* sample/res/raw/
+* sample/res/raw/pull_event.mp3
+* sample/res/raw/refreshing_sound.mp3
+* sample/res/raw/reset_sound.mp3
+* sample/res/values/
+* sample/res/values/strings.xml
+* sample/res/values/styles.xml
+* sample/src/
+* sample/src/com/
+* sample/src/com/handmark/
+* sample/src/com/handmark/pulltorefresh/
+* sample/src/com/handmark/pulltorefresh/samples/
+* sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java
+* sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java
+* sample/src/com/handmark/pulltorefresh/samples/PullToRefreshGridActivity.java
+* sample/src/com/handmark/pulltorefresh/samples/PullToRefreshHorizontalScrollViewActivity.java
+* sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java
+* sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListFragmentActivity.java
+* sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListInViewPagerActivity.java
+* sample/src/com/handmark/pulltorefresh/samples/PullToRefreshScrollViewActivity.java
+* sample/src/com/handmark/pulltorefresh/samples/PullToRefreshViewPagerActivity.java
+* sample/src/com/handmark/pulltorefresh/samples/PullToRefreshWebView2Activity.java
+* sample/src/com/handmark/pulltorefresh/samples/PullToRefreshWebViewActivity.java
+
+Replaced Jars with Dependencies:
+--------------------------------
+The importer recognized the following .jar files as third party
+libraries and replaced them with Gradle dependencies instead. This has
+the advantage that more explicit version information is known, and the
+libraries can be updated automatically. However, it is possible that
+the .jar file in your project was of an older version than the
+dependency we picked, which could render the project not compileable.
+You can disable the jar replacement in the import wizard and try again:
+
+android-support-v4.jar => com.android.support:support-v4:18.0.0
+
+Moved Files:
+------------
+Android Gradle projects use a different directory structure than ADT
+Eclipse projects. Here's how the projects were restructured:
+
+In library:
+* AndroidManifest.xml => library/src/main/AndroidManifest.xml
+* res/ => library/src/main/res/
+* src/ => library/src/main/java/
+In menudrawer:
+* AndroidManifest.xml => menudrawer/src/main/AndroidManifest.xml
+* res/ => menudrawer/src/main/res/
+* src/ => menudrawer/src/main/java/
+In UltraSonic:
+* AndroidManifest.xml => ultraSonic/src/main/AndroidManifest.xml
+* assets/ => ultraSonic/src/main/assets/
+* lint.xml => ultraSonic/lint.xml
+* res/ => ultraSonic/src/main/res/
+* src/ => ultraSonic/src/main/java/
+
+Next Steps:
+-----------
+You can now build the project. The Gradle project needs network
+connectivity to download dependencies.
+
+Bugs:
+-----
+If for some reason your project does not build, and you determine that
+it is due to a bug or limitation of the Eclipse to Gradle importer,
+please file a bug at http://b.android.com with category
+Component-Tools.
+
+(This import summary is for your information only, and can be deleted
+after import once you are satisfied with the results.)
diff --git a/library/build.gradle b/library/build.gradle
new file mode 100644
index 00000000..b2a13c3c
--- /dev/null
+++ b/library/build.gradle
@@ -0,0 +1,22 @@
+apply plugin: 'com.android.library'
+
+android {
+ compileSdkVersion 22
+ buildToolsVersion "22.0.1"
+
+ defaultConfig {
+ minSdkVersion 7
+ targetSdkVersion 22
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
+ }
+ }
+}
+
+dependencies {
+ compile 'com.android.support:support-v4:18.0.0'
+}
diff --git a/library/library.iml b/library/library.iml
new file mode 100644
index 00000000..f31c808d
--- /dev/null
+++ b/library/library.iml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..f0ef29f3
--- /dev/null
+++ b/library/src/main/AndroidManifest.xml
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/library/src/main/java/com/mobeta/android/dslv/DragSortController.java b/library/src/main/java/com/mobeta/android/dslv/DragSortController.java
new file mode 100644
index 00000000..41d477e9
--- /dev/null
+++ b/library/src/main/java/com/mobeta/android/dslv/DragSortController.java
@@ -0,0 +1,468 @@
+package com.mobeta.android.dslv;
+
+import android.graphics.Point;
+import android.view.GestureDetector;
+import android.view.HapticFeedbackConstants;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.widget.AdapterView;
+
+/**
+ * Class that starts and stops item drags on a {@link DragSortListView}
+ * based on touch gestures. This class also inherits from
+ * {@link SimpleFloatViewManager}, which provides basic float View
+ * creation.
+ *
+ * An instance of this class is meant to be passed to the methods
+ * {@link DragSortListView#setTouchListener()} and
+ * {@link DragSortListView#setFloatViewManager()} of your
+ * {@link DragSortListView} instance.
+ */
+public class DragSortController extends SimpleFloatViewManager implements View.OnTouchListener, GestureDetector.OnGestureListener {
+
+ /**
+ * Drag init mode enum.
+ */
+ public static final int ON_DOWN = 0;
+ public static final int ON_DRAG = 1;
+ public static final int ON_LONG_PRESS = 2;
+
+ private int mDragInitMode = ON_DOWN;
+
+ private boolean mSortEnabled = true;
+
+ /**
+ * Remove mode enum.
+ */
+ public static final int CLICK_REMOVE = 0;
+ public static final int FLING_REMOVE = 1;
+
+ /**
+ * The current remove mode.
+ */
+ private int mRemoveMode;
+
+ private boolean mRemoveEnabled = false;
+ private boolean mIsRemoving = false;
+
+ private GestureDetector mDetector;
+
+ private GestureDetector mFlingRemoveDetector;
+
+ private int mTouchSlop;
+
+ public static final int MISS = -1;
+
+ private int mHitPos = MISS;
+ private int mFlingHitPos = MISS;
+
+ private int mClickRemoveHitPos = MISS;
+
+ private int[] mTempLoc = new int[2];
+
+ private int mItemX;
+ private int mItemY;
+
+ private int mCurrX;
+ private int mCurrY;
+
+ private boolean mDragging = false;
+
+ private float mFlingSpeed = 500f;
+
+ private int mDragHandleId;
+
+ private int mClickRemoveId;
+
+ private int mFlingHandleId;
+ private boolean mCanDrag;
+
+ private DragSortListView mDslv;
+ private int mPositionX;
+
+ /**
+ * Calls {@link #DragSortController(DragSortListView, int)} with a
+ * 0 drag handle id, FLING_RIGHT_REMOVE remove mode,
+ * and ON_DOWN drag init. By default, sorting is enabled, and
+ * removal is disabled.
+ *
+ * @param dslv The DSLV instance
+ */
+ public DragSortController(DragSortListView dslv) {
+ this(dslv, 0, ON_DOWN, FLING_REMOVE);
+ }
+
+ public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode, int removeMode) {
+ this(dslv, dragHandleId, dragInitMode, removeMode, 0);
+ }
+
+ public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode, int removeMode, int clickRemoveId) {
+ this(dslv, dragHandleId, dragInitMode, removeMode, clickRemoveId, 0);
+ }
+
+ /**
+ * By default, sorting is enabled, and removal is disabled.
+ *
+ * @param dslv The DSLV instance
+ * @param dragHandleId The resource id of the View that represents
+ * the drag handle in a list item.
+ */
+ public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode,
+ int removeMode, int clickRemoveId, int flingHandleId) {
+ super(dslv);
+ mDslv = dslv;
+ mDetector = new GestureDetector(dslv.getContext(), this);
+ mFlingRemoveDetector = new GestureDetector(dslv.getContext(), mFlingRemoveListener);
+ mFlingRemoveDetector.setIsLongpressEnabled(false);
+ mTouchSlop = ViewConfiguration.get(dslv.getContext()).getScaledTouchSlop();
+ mDragHandleId = dragHandleId;
+ mClickRemoveId = clickRemoveId;
+ mFlingHandleId = flingHandleId;
+ setRemoveMode(removeMode);
+ setDragInitMode(dragInitMode);
+ }
+
+
+ public int getDragInitMode() {
+ return mDragInitMode;
+ }
+
+ /**
+ * Set how a drag is initiated. Needs to be one of
+ * {@link ON_DOWN}, {@link ON_DRAG}, or {@link ON_LONG_PRESS}.
+ *
+ * @param mode The drag init mode.
+ */
+ public void setDragInitMode(int mode) {
+ mDragInitMode = mode;
+ }
+
+ /**
+ * Enable/Disable list item sorting. Disabling is useful if only item
+ * removal is desired. Prevents drags in the vertical direction.
+ *
+ * @param enabled Set true to enable list
+ * item sorting.
+ */
+ public void setSortEnabled(boolean enabled) {
+ mSortEnabled = enabled;
+ }
+
+ public boolean isSortEnabled() {
+ return mSortEnabled;
+ }
+
+ /**
+ * One of {@link CLICK_REMOVE}, {@link FLING_RIGHT_REMOVE},
+ * {@link FLING_LEFT_REMOVE},
+ * {@link SLIDE_RIGHT_REMOVE}, or {@link SLIDE_LEFT_REMOVE}.
+ */
+ public void setRemoveMode(int mode) {
+ mRemoveMode = mode;
+ }
+
+ public int getRemoveMode() {
+ return mRemoveMode;
+ }
+
+ /**
+ * Enable/Disable item removal without affecting remove mode.
+ */
+ public void setRemoveEnabled(boolean enabled) {
+ mRemoveEnabled = enabled;
+ }
+
+ public boolean isRemoveEnabled() {
+ return mRemoveEnabled;
+ }
+
+ /**
+ * Set the resource id for the View that represents the drag
+ * handle in a list item.
+ *
+ * @param id An android resource id.
+ */
+ public void setDragHandleId(int id) {
+ mDragHandleId = id;
+ }
+
+ /**
+ * Set the resource id for the View that represents the fling
+ * handle in a list item.
+ *
+ * @param id An android resource id.
+ */
+ public void setFlingHandleId(int id) {
+ mFlingHandleId = id;
+ }
+
+ /**
+ * Set the resource id for the View that represents click
+ * removal button.
+ *
+ * @param id An android resource id.
+ */
+ public void setClickRemoveId(int id) {
+ mClickRemoveId = id;
+ }
+
+ /**
+ * Sets flags to restrict certain motions of the floating View
+ * based on DragSortController settings (such as remove mode).
+ * Starts the drag on the DragSortListView.
+ *
+ * @param position The list item position (includes headers).
+ * @param deltaX Touch x-coord minus left edge of floating View.
+ * @param deltaY Touch y-coord minus top edge of floating View.
+ *
+ * @return True if drag started, false otherwise.
+ */
+ public boolean startDrag(int position, int deltaX, int deltaY) {
+
+ int dragFlags = 0;
+ if (mSortEnabled && !mIsRemoving) {
+ dragFlags |= DragSortListView.DRAG_POS_Y | DragSortListView.DRAG_NEG_Y;
+ }
+ if (mRemoveEnabled && mIsRemoving) {
+ dragFlags |= DragSortListView.DRAG_POS_X;
+ dragFlags |= DragSortListView.DRAG_NEG_X;
+ }
+
+ mDragging = mDslv.startDrag(position - mDslv.getHeaderViewsCount(), dragFlags, deltaX,
+ deltaY);
+ return mDragging;
+ }
+
+ @Override
+ public boolean onTouch(View v, MotionEvent ev) {
+ if (!mDslv.isDragEnabled() || mDslv.listViewIntercepted()) {
+ return false;
+ }
+
+ mDetector.onTouchEvent(ev);
+ if (mRemoveEnabled && mDragging && mRemoveMode == FLING_REMOVE) {
+ mFlingRemoveDetector.onTouchEvent(ev);
+ }
+
+ int action = ev.getAction() & MotionEvent.ACTION_MASK;
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ mCurrX = (int) ev.getX();
+ mCurrY = (int) ev.getY();
+ break;
+ case MotionEvent.ACTION_UP:
+ if (mRemoveEnabled && mIsRemoving) {
+ int x = mPositionX >= 0 ? mPositionX : -mPositionX;
+ int removePoint = mDslv.getWidth() / 2;
+ if (x > removePoint) {
+ mDslv.stopDragWithVelocity(true, 0);
+ }
+ }
+ case MotionEvent.ACTION_CANCEL:
+ mIsRemoving = false;
+ mDragging = false;
+ break;
+ }
+
+ return false;
+ }
+
+ /**
+ * Overrides to provide fading when slide removal is enabled.
+ */
+ @Override
+ public void onDragFloatView(View floatView, Point position, Point touch) {
+
+ if (mRemoveEnabled && mIsRemoving) {
+ mPositionX = position.x;
+ }
+ }
+
+ /**
+ * Get the position to start dragging based on the ACTION_DOWN
+ * MotionEvent. This function simply calls
+ * {@link #dragHandleHitPosition(MotionEvent)}. Override
+ * to change drag handle behavior;
+ * this function is called internally when an ACTION_DOWN
+ * event is detected.
+ *
+ * @param ev The ACTION_DOWN MotionEvent.
+ *
+ * @return The list position to drag if a drag-init gesture is
+ * detected; MISS if unsuccessful.
+ */
+ public int startDragPosition(MotionEvent ev) {
+ return dragHandleHitPosition(ev);
+ }
+
+ public int startFlingPosition(MotionEvent ev) {
+ return mRemoveMode == FLING_REMOVE ? flingHandleHitPosition(ev) : MISS;
+ }
+
+ /**
+ * Checks for the touch of an item's drag handle (specified by
+ * {@link #setDragHandleId(int)}), and returns that item's position
+ * if a drag handle touch was detected.
+ *
+ * @param ev The ACTION_DOWN MotionEvent.
+
+ * @return The list position of the item whose drag handle was
+ * touched; MISS if unsuccessful.
+ */
+ public int dragHandleHitPosition(MotionEvent ev) {
+ return viewIdHitPosition(ev, mDragHandleId);
+ }
+
+ public int flingHandleHitPosition(MotionEvent ev) {
+ return viewIdHitPosition(ev, mFlingHandleId);
+ }
+
+ public int viewIdHitPosition(MotionEvent ev, int id) {
+ final int x = (int) ev.getX();
+ final int y = (int) ev.getY();
+
+ int touchPos = mDslv.pointToPosition(x, y); // includes headers/footers
+
+ final int numHeaders = mDslv.getHeaderViewsCount();
+ final int numFooters = mDslv.getFooterViewsCount();
+ final int count = mDslv.getCount();
+
+ // Log.d("mobeta", "touch down on position " + itemnum);
+ // We're only interested if the touch was on an
+ // item that's not a header or footer.
+ if (touchPos != AdapterView.INVALID_POSITION && touchPos >= numHeaders
+ && touchPos < (count - numFooters)) {
+ final View item = mDslv.getChildAt(touchPos - mDslv.getFirstVisiblePosition());
+ final int rawX = (int) ev.getRawX();
+ final int rawY = (int) ev.getRawY();
+
+ View dragBox = id == 0 ? item : (View) item.findViewById(id);
+ if (dragBox != null) {
+ dragBox.getLocationOnScreen(mTempLoc);
+
+ if (rawX > mTempLoc[0] && rawY > mTempLoc[1] &&
+ rawX < mTempLoc[0] + dragBox.getWidth() &&
+ rawY < mTempLoc[1] + dragBox.getHeight()) {
+
+ mItemX = item.getLeft();
+ mItemY = item.getTop();
+
+ return touchPos;
+ }
+ }
+ }
+
+ return MISS;
+ }
+
+ @Override
+ public boolean onDown(MotionEvent ev) {
+ if (mRemoveEnabled && mRemoveMode == CLICK_REMOVE) {
+ mClickRemoveHitPos = viewIdHitPosition(ev, mClickRemoveId);
+ }
+
+ mHitPos = startDragPosition(ev);
+ if (mHitPos != MISS && mDragInitMode == ON_DOWN) {
+ startDrag(mHitPos, (int) ev.getX() - mItemX, (int) ev.getY() - mItemY);
+ }
+
+ mIsRemoving = false;
+ mCanDrag = true;
+ mPositionX = 0;
+ mFlingHitPos = startFlingPosition(ev);
+
+ return true;
+ }
+
+ @Override
+ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
+
+ final int x1 = (int) e1.getX();
+ final int y1 = (int) e1.getY();
+ final int x2 = (int) e2.getX();
+ final int y2 = (int) e2.getY();
+ final int deltaX = x2 - mItemX;
+ final int deltaY = y2 - mItemY;
+
+ if (mCanDrag && !mDragging && (mHitPos != MISS || mFlingHitPos != MISS)) {
+ if (mHitPos != MISS) {
+ if (mDragInitMode == ON_DRAG && Math.abs(y2 - y1) > mTouchSlop && mSortEnabled) {
+ startDrag(mHitPos, deltaX, deltaY);
+ }
+ else if (mDragInitMode != ON_DOWN && Math.abs(x2 - x1) > mTouchSlop && mRemoveEnabled)
+ {
+ mIsRemoving = true;
+ startDrag(mFlingHitPos, deltaX, deltaY);
+ }
+ } else if (mFlingHitPos != MISS) {
+ if (Math.abs(x2 - x1) > mTouchSlop && mRemoveEnabled) {
+ mIsRemoving = true;
+ startDrag(mFlingHitPos, deltaX, deltaY);
+ } else if (Math.abs(y2 - y1) > mTouchSlop) {
+ mCanDrag = false; // if started to scroll the list then
+ // don't allow sorting nor fling-removing
+ }
+ }
+ }
+ // return whatever
+ return false;
+ }
+
+ @Override
+ public void onLongPress(MotionEvent e) {
+ // Log.d("mobeta", "lift listener long pressed");
+ if (mHitPos != MISS && mDragInitMode == ON_LONG_PRESS) {
+ mDslv.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
+ startDrag(mHitPos, mCurrX - mItemX, mCurrY - mItemY);
+ }
+ }
+
+ // complete the OnGestureListener interface
+ @Override
+ public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
+ return false;
+ }
+
+ // complete the OnGestureListener interface
+ @Override
+ public boolean onSingleTapUp(MotionEvent ev) {
+ if (mRemoveEnabled && mRemoveMode == CLICK_REMOVE) {
+ if (mClickRemoveHitPos != MISS) {
+ mDslv.removeItem(mClickRemoveHitPos - mDslv.getHeaderViewsCount());
+ }
+ }
+ return true;
+ }
+
+ // complete the OnGestureListener interface
+ @Override
+ public void onShowPress(MotionEvent ev) {
+ // do nothing
+ }
+
+ private GestureDetector.OnGestureListener mFlingRemoveListener =
+ new GestureDetector.SimpleOnGestureListener() {
+ @Override
+ public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
+ float velocityY) {
+ // Log.d("mobeta", "on fling remove called");
+ if (mRemoveEnabled && mIsRemoving) {
+ int w = mDslv.getWidth();
+ int minPos = w / 5;
+ if (velocityX > mFlingSpeed) {
+ if (mPositionX > -minPos) {
+ mDslv.stopDragWithVelocity(true, velocityX);
+ }
+ } else if (velocityX < -mFlingSpeed) {
+ if (mPositionX < minPos) {
+ mDslv.stopDragWithVelocity(true, velocityX);
+ }
+ }
+ mIsRemoving = false;
+ }
+ return false;
+ }
+ };
+
+}
diff --git a/library/src/main/java/com/mobeta/android/dslv/DragSortCursorAdapter.java b/library/src/main/java/com/mobeta/android/dslv/DragSortCursorAdapter.java
new file mode 100644
index 00000000..267c6f86
--- /dev/null
+++ b/library/src/main/java/com/mobeta/android/dslv/DragSortCursorAdapter.java
@@ -0,0 +1,241 @@
+package com.mobeta.android.dslv;
+
+import java.util.ArrayList;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.util.SparseIntArray;
+import android.view.View;
+import android.view.ViewGroup;
+import android.support.v4.widget.CursorAdapter;
+
+
+/**
+ * A subclass of {@link android.widget.CursorAdapter} that provides
+ * reordering of the elements in the Cursor based on completed
+ * drag-sort operations. The reordering is a simple mapping of
+ * list positions into Cursor positions (the Cursor is unchanged).
+ * To persist changes made by drag-sorts, one can retrieve the
+ * mapping with the {@link #getCursorPositions()} method, which
+ * returns the reordered list of Cursor positions.
+ *
+ * An instance of this class is passed
+ * to {@link DragSortListView#setAdapter(ListAdapter)} and, since
+ * this class implements the {@link DragSortListView.DragSortListener}
+ * interface, it is automatically set as the DragSortListener for
+ * the DragSortListView instance.
+ */
+public abstract class DragSortCursorAdapter extends CursorAdapter implements DragSortListView.DragSortListener {
+
+ public static final int REMOVED = -1;
+
+ /**
+ * Key is ListView position, value is Cursor position
+ */
+ private SparseIntArray mListMapping = new SparseIntArray();
+
+ private ArrayList mRemovedCursorPositions = new ArrayList();
+
+ public DragSortCursorAdapter(Context context, Cursor c) {
+ super(context, c);
+ }
+
+ public DragSortCursorAdapter(Context context, Cursor c, boolean autoRequery) {
+ super(context, c, autoRequery);
+ }
+
+ public DragSortCursorAdapter(Context context, Cursor c, int flags) {
+ super(context, c, flags);
+ }
+
+ /**
+ * Swaps Cursor and clears list-Cursor mapping.
+ *
+ * @see android.widget.CursorAdapter#swapCursor(android.database.Cursor)
+ */
+ @Override
+ public Cursor swapCursor(Cursor newCursor) {
+ Cursor old = super.swapCursor(newCursor);
+ resetMappings();
+ return old;
+ }
+
+ /**
+ * Changes Cursor and clears list-Cursor mapping.
+ *
+ * @see android.widget.CursorAdapter#changeCursor(android.database.Cursor)
+ */
+ @Override
+ public void changeCursor(Cursor cursor) {
+ super.changeCursor(cursor);
+ resetMappings();
+ }
+
+ /**
+ * Resets list-cursor mapping.
+ */
+ public void reset() {
+ resetMappings();
+ notifyDataSetChanged();
+ }
+
+ private void resetMappings() {
+ mListMapping.clear();
+ mRemovedCursorPositions.clear();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return super.getItem(mListMapping.get(position, position));
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return super.getItemId(mListMapping.get(position, position));
+ }
+
+ @Override
+ public View getDropDownView(int position, View convertView, ViewGroup parent) {
+ return super.getDropDownView(mListMapping.get(position, position), convertView, parent);
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ return super.getView(mListMapping.get(position, position), convertView, parent);
+ }
+
+ /**
+ * On drop, this updates the mapping between Cursor positions
+ * and ListView positions. The Cursor is unchanged. Retrieve
+ * the current mapping with {@link getCursorPositions()}.
+ *
+ * @see DragSortListView.DropListener#drop(int, int)
+ */
+ @Override
+ public void drop(int from, int to) {
+ if (from != to) {
+ int cursorFrom = mListMapping.get(from, from);
+
+ if (from > to) {
+ for (int i = from; i > to; --i) {
+ mListMapping.put(i, mListMapping.get(i - 1, i - 1));
+ }
+ } else {
+ for (int i = from; i < to; ++i) {
+ mListMapping.put(i, mListMapping.get(i + 1, i + 1));
+ }
+ }
+ mListMapping.put(to, cursorFrom);
+
+ cleanMapping();
+ notifyDataSetChanged();
+ }
+ }
+
+ /**
+ * On remove, this updates the mapping between Cursor positions
+ * and ListView positions. The Cursor is unchanged. Retrieve
+ * the current mapping with {@link getCursorPositions()}.
+ *
+ * @see DragSortListView.RemoveListener#remove(int)
+ */
+ @Override
+ public void remove(int which) {
+ int cursorPos = mListMapping.get(which, which);
+ if (!mRemovedCursorPositions.contains(cursorPos)) {
+ mRemovedCursorPositions.add(cursorPos);
+ }
+
+ int newCount = getCount();
+ for (int i = which; i < newCount; ++i) {
+ mListMapping.put(i, mListMapping.get(i + 1, i + 1));
+ }
+
+ mListMapping.delete(newCount);
+
+ cleanMapping();
+ notifyDataSetChanged();
+ }
+
+ /**
+ * Does nothing. Just completes DragSortListener interface.
+ */
+ @Override
+ public void drag(int from, int to) {
+ // do nothing
+ }
+
+ /**
+ * Remove unnecessary mappings from sparse array.
+ */
+ private void cleanMapping() {
+ ArrayList toRemove = new ArrayList();
+
+ int size = mListMapping.size();
+ for (int i = 0; i < size; ++i) {
+ if (mListMapping.keyAt(i) == mListMapping.valueAt(i)) {
+ toRemove.add(mListMapping.keyAt(i));
+ }
+ }
+
+ size = toRemove.size();
+ for (int i = 0; i < size; ++i) {
+ mListMapping.delete(toRemove.get(i));
+ }
+ }
+
+ @Override
+ public int getCount() {
+ return super.getCount() - mRemovedCursorPositions.size();
+ }
+
+ /**
+ * Get the Cursor position mapped to by the provided list position
+ * (given all previously handled drag-sort
+ * operations).
+ *
+ * @param position List position
+ *
+ * @return The mapped-to Cursor position
+ */
+ public int getCursorPosition(int position) {
+ return mListMapping.get(position, position);
+ }
+
+ /**
+ * Get the current order of Cursor positions presented by the
+ * list.
+ */
+ public ArrayList getCursorPositions() {
+ ArrayList result = new ArrayList();
+
+ for (int i = 0; i < getCount(); ++i) {
+ result.add(mListMapping.get(i, i));
+ }
+
+ return result;
+ }
+
+ /**
+ * Get the list position mapped to by the provided Cursor position.
+ * If the provided Cursor position has been removed by a drag-sort,
+ * this returns {@link #REMOVED}.
+ *
+ * @param cursorPosition A Cursor position
+ * @return The mapped-to list position or REMOVED
+ */
+ public int getListPosition(int cursorPosition) {
+ if (mRemovedCursorPositions.contains(cursorPosition)) {
+ return REMOVED;
+ }
+
+ int index = mListMapping.indexOfValue(cursorPosition);
+ if (index < 0) {
+ return cursorPosition;
+ } else {
+ return mListMapping.keyAt(index);
+ }
+ }
+
+
+}
diff --git a/library/src/main/java/com/mobeta/android/dslv/DragSortItemView.java b/library/src/main/java/com/mobeta/android/dslv/DragSortItemView.java
new file mode 100644
index 00000000..cef7b82b
--- /dev/null
+++ b/library/src/main/java/com/mobeta/android/dslv/DragSortItemView.java
@@ -0,0 +1,100 @@
+package com.mobeta.android.dslv;
+
+import android.content.Context;
+import android.view.Gravity;
+import android.view.View;
+import android.view.View.MeasureSpec;
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.util.Log;
+
+/**
+ * Lightweight ViewGroup that wraps list items obtained from user's
+ * ListAdapter. ItemView expects a single child that has a definite
+ * height (i.e. the child's layout height is not MATCH_PARENT).
+ * The width of
+ * ItemView will always match the width of its child (that is,
+ * the width MeasureSpec given to ItemView is passed directly
+ * to the child, and the ItemView measured width is set to the
+ * child's measured width). The height of ItemView can be anything;
+ * the
+ *
+ *
+ * The purpose of this class is to optimize slide
+ * shuffle animations.
+ */
+public class DragSortItemView extends ViewGroup {
+
+ private int mGravity = Gravity.TOP;
+
+ public DragSortItemView(Context context) {
+ super(context);
+
+ // always init with standard ListView layout params
+ setLayoutParams(new AbsListView.LayoutParams(
+ ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+
+ //setClipChildren(true);
+ }
+
+ public void setGravity(int gravity) {
+ mGravity = gravity;
+ }
+
+ public int getGravity() {
+ return mGravity;
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ final View child = getChildAt(0);
+
+ if (child == null) {
+ return;
+ }
+
+ if (mGravity == Gravity.TOP) {
+ child.layout(0, 0, getMeasuredWidth(), child.getMeasuredHeight());
+ } else {
+ child.layout(0, getMeasuredHeight() - child.getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight());
+ }
+ }
+
+ /**
+ *
+ */
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+
+ int height = MeasureSpec.getSize(heightMeasureSpec);
+ int width = MeasureSpec.getSize(widthMeasureSpec);
+
+ int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+
+ final View child = getChildAt(0);
+ if (child == null) {
+ setMeasuredDimension(0, width);
+ return;
+ }
+
+ if (child.isLayoutRequested()) {
+ // Always let child be as tall as it wants.
+ measureChild(child, widthMeasureSpec,
+ MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
+ }
+
+ if (heightMode == MeasureSpec.UNSPECIFIED) {
+ ViewGroup.LayoutParams lp = getLayoutParams();
+
+ if (lp.height > 0) {
+ height = lp.height;
+ } else {
+ height = child.getMeasuredHeight();
+ }
+ }
+
+ setMeasuredDimension(width, height);
+ }
+
+}
diff --git a/library/src/main/java/com/mobeta/android/dslv/DragSortItemViewCheckable.java b/library/src/main/java/com/mobeta/android/dslv/DragSortItemViewCheckable.java
new file mode 100644
index 00000000..27d612e0
--- /dev/null
+++ b/library/src/main/java/com/mobeta/android/dslv/DragSortItemViewCheckable.java
@@ -0,0 +1,55 @@
+package com.mobeta.android.dslv;
+
+import android.content.Context;
+import android.view.Gravity;
+import android.view.View;
+import android.view.View.MeasureSpec;
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.widget.Checkable;
+import android.util.Log;
+
+/**
+ * Lightweight ViewGroup that wraps list items obtained from user's
+ * ListAdapter. ItemView expects a single child that has a definite
+ * height (i.e. the child's layout height is not MATCH_PARENT).
+ * The width of
+ * ItemView will always match the width of its child (that is,
+ * the width MeasureSpec given to ItemView is passed directly
+ * to the child, and the ItemView measured width is set to the
+ * child's measured width). The height of ItemView can be anything;
+ * the
+ *
+ *
+ * The purpose of this class is to optimize slide
+ * shuffle animations.
+ */
+public class DragSortItemViewCheckable extends DragSortItemView implements Checkable {
+
+ public DragSortItemViewCheckable(Context context) {
+ super(context);
+ }
+
+ @Override
+ public boolean isChecked() {
+ View child = getChildAt(0);
+ if (child instanceof Checkable)
+ return ((Checkable) child).isChecked();
+ else
+ return false;
+ }
+
+ @Override
+ public void setChecked(boolean checked) {
+ View child = getChildAt(0);
+ if (child instanceof Checkable)
+ ((Checkable) child).setChecked(checked);
+ }
+
+ @Override
+ public void toggle() {
+ View child = getChildAt(0);
+ if (child instanceof Checkable)
+ ((Checkable) child).toggle();
+ }
+}
diff --git a/library/src/main/java/com/mobeta/android/dslv/DragSortListView.java b/library/src/main/java/com/mobeta/android/dslv/DragSortListView.java
new file mode 100644
index 00000000..4f8ec744
--- /dev/null
+++ b/library/src/main/java/com/mobeta/android/dslv/DragSortListView.java
@@ -0,0 +1,3073 @@
+/*
+ * DragSortListView.
+ *
+ * A subclass of the Android ListView component that enables drag
+ * and drop re-ordering of list items.
+ *
+ * Copyright 2012 Carl Bauer
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.mobeta.android.dslv;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.database.DataSetObserver;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Point;
+import android.graphics.drawable.Drawable;
+import android.os.Environment;
+import android.os.SystemClock;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.SparseBooleanArray;
+import android.util.SparseIntArray;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.widget.BaseAdapter;
+import android.widget.Checkable;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * ListView subclass that mediates drag and drop resorting of items.
+ *
+ *
+ * @author heycosmo
+ *
+ */
+public class DragSortListView extends ListView {
+
+
+ /**
+ * The View that floats above the ListView and represents
+ * the dragged item.
+ */
+ private View mFloatView;
+
+ /**
+ * The float View location. First based on touch location
+ * and given deltaX and deltaY. Then restricted by callback
+ * to FloatViewManager.onDragFloatView(). Finally restricted
+ * by bounds of DSLV.
+ */
+ private Point mFloatLoc = new Point();
+
+ private Point mTouchLoc = new Point();
+
+ /**
+ * The middle (in the y-direction) of the floating View.
+ */
+ private int mFloatViewMid;
+
+ /**
+ * Flag to make sure float View isn't measured twice
+ */
+ private boolean mFloatViewOnMeasured = false;
+
+ /**
+ * Watch the Adapter for data changes. Cancel a drag if
+ * coincident with a change.
+ */
+ private DataSetObserver mObserver;
+
+ /**
+ * Transparency for the floating View (XML attribute).
+ */
+ private float mFloatAlpha = 1.0f;
+ private float mCurrFloatAlpha = 1.0f;
+
+ /**
+ * While drag-sorting, the current position of the floating
+ * View. If dropped, the dragged item will land in this position.
+ */
+ private int mFloatPos;
+
+ /**
+ * The first expanded ListView position that helps represent
+ * the drop slot tracking the floating View.
+ */
+ private int mFirstExpPos;
+
+ /**
+ * The second expanded ListView position that helps represent
+ * the drop slot tracking the floating View. This can equal
+ * mFirstExpPos if there is no slide shuffle occurring; otherwise
+ * it is equal to mFirstExpPos + 1.
+ */
+ private int mSecondExpPos;
+
+ /**
+ * Flag set if slide shuffling is enabled.
+ */
+ private boolean mAnimate = false;
+
+ /**
+ * The user dragged from this position.
+ */
+ private int mSrcPos;
+
+ /**
+ * Offset (in x) within the dragged item at which the user
+ * picked it up (or first touched down with the digitalis).
+ */
+ private int mDragDeltaX;
+
+ /**
+ * Offset (in y) within the dragged item at which the user
+ * picked it up (or first touched down with the digitalis).
+ */
+ private int mDragDeltaY;
+
+
+ /**
+ * The difference (in x) between screen coordinates and coordinates
+ * in this view.
+ */
+ private int mOffsetX;
+
+ /**
+ * The difference (in y) between screen coordinates and coordinates
+ * in this view.
+ */
+ private int mOffsetY;
+
+ /**
+ * A listener that receives callbacks whenever the floating View
+ * hovers over a new position.
+ */
+ private DragListener mDragListener;
+
+ /**
+ * A listener that receives a callback when the floating View
+ * is dropped.
+ */
+ private DropListener mDropListener;
+
+ /**
+ * A listener that receives a callback when the floating View
+ * (or more precisely the originally dragged item) is removed
+ * by one of the provided gestures.
+ */
+ private RemoveListener mRemoveListener;
+
+ /**
+ * Enable/Disable item dragging
+ *
+ * @attr name dslv:drag_enabled
+ */
+ private boolean mDragEnabled = true;
+
+ /**
+ * Drag state enum.
+ */
+ private final static int IDLE = 0;
+ private final static int REMOVING = 1;
+ private final static int DROPPING = 2;
+ private final static int STOPPED = 3;
+ private final static int DRAGGING = 4;
+
+ private int mDragState = IDLE;
+
+ /**
+ * Height in pixels to which the originally dragged item
+ * is collapsed during a drag-sort. Currently, this value
+ * must be greater than zero.
+ */
+ private int mItemHeightCollapsed = 1;
+
+ /**
+ * Height of the floating View. Stored for the purpose of
+ * providing the tracking drop slot.
+ */
+ private int mFloatViewHeight;
+
+ /**
+ * Convenience member. See above.
+ */
+ private int mFloatViewHeightHalf;
+
+ /**
+ * Save the given width spec for use in measuring children
+ */
+ private int mWidthMeasureSpec = 0;
+
+ /**
+ * Sample Views ultimately used for calculating the height
+ * of ListView items that are off-screen.
+ */
+ private View[] mSampleViewTypes = new View[1];
+
+ /**
+ * Drag-scroll encapsulator!
+ */
+ private DragScroller mDragScroller;
+
+ /**
+ * Determines the start of the upward drag-scroll region
+ * at the top of the ListView. Specified by a fraction
+ * of the ListView height, thus screen resolution agnostic.
+ */
+ private float mDragUpScrollStartFrac = 1.0f / 3.0f;
+
+ /**
+ * Determines the start of the downward drag-scroll region
+ * at the bottom of the ListView. Specified by a fraction
+ * of the ListView height, thus screen resolution agnostic.
+ */
+ private float mDragDownScrollStartFrac = 1.0f / 3.0f;
+
+ /**
+ * The following are calculated from the above fracs.
+ */
+ private int mUpScrollStartY;
+ private int mDownScrollStartY;
+ private float mDownScrollStartYF;
+ private float mUpScrollStartYF;
+
+ /**
+ * Calculated from above above and current ListView height.
+ */
+ private float mDragUpScrollHeight;
+
+ /**
+ * Calculated from above above and current ListView height.
+ */
+ private float mDragDownScrollHeight;
+
+ /**
+ * Maximum drag-scroll speed in pixels per ms. Only used with
+ * default linear drag-scroll profile.
+ */
+ private float mMaxScrollSpeed = 0.5f;
+
+ /**
+ * Defines the scroll speed during a drag-scroll. User can
+ * provide their own; this default is a simple linear profile
+ * where scroll speed increases linearly as the floating View
+ * nears the top/bottom of the ListView.
+ */
+ private DragScrollProfile mScrollProfile = new DragScrollProfile() {
+ @Override
+ public float getSpeed(float w, long t) {
+ return mMaxScrollSpeed * w;
+ }
+ };
+
+ /**
+ * Current touch x.
+ */
+ private int mX;
+
+ /**
+ * Current touch y.
+ */
+ private int mY;
+
+ /**
+ * Last touch x.
+ */
+ private int mLastX;
+
+ /**
+ * Last touch y.
+ */
+ private int mLastY;
+
+ /**
+ * The touch y-coord at which drag started
+ */
+ private int mDragStartY;
+
+ /**
+ * Drag flag bit. Floating View can move in the positive
+ * x direction.
+ */
+ public final static int DRAG_POS_X = 0x1;
+
+ /**
+ * Drag flag bit. Floating View can move in the negative
+ * x direction.
+ */
+ public final static int DRAG_NEG_X = 0x2;
+
+ /**
+ * Drag flag bit. Floating View can move in the positive
+ * y direction. This is subtle. What this actually means is
+ * that, if enabled, the floating View can be dragged below its starting
+ * position. Remove in favor of upper-bounding item position?
+ */
+ public final static int DRAG_POS_Y = 0x4;
+
+ /**
+ * Drag flag bit. Floating View can move in the negative
+ * y direction. This is subtle. What this actually means is
+ * that the floating View can be dragged above its starting
+ * position. Remove in favor of lower-bounding item position?
+ */
+ public final static int DRAG_NEG_Y = 0x8;
+
+ /**
+ * Flags that determine limits on the motion of the
+ * floating View. See flags above.
+ */
+ private int mDragFlags = 0;
+
+ /**
+ * Last call to an on*TouchEvent was a call to
+ * onInterceptTouchEvent.
+ */
+ private boolean mLastCallWasIntercept = false;
+
+ /**
+ * A touch event is in progress.
+ */
+ private boolean mInTouchEvent = false;
+
+ /**
+ * Let the user customize the floating View.
+ */
+ private FloatViewManager mFloatViewManager = null;
+
+ /**
+ * Given to ListView to cancel its action when a drag-sort
+ * begins.
+ */
+ private MotionEvent mCancelEvent;
+
+ /**
+ * Enum telling where to cancel the ListView action when a
+ * drag-sort begins
+ */
+ private static final int NO_CANCEL = 0;
+ private static final int ON_TOUCH_EVENT = 1;
+ private static final int ON_INTERCEPT_TOUCH_EVENT = 2;
+
+ /**
+ * Where to cancel the ListView action when a
+ * drag-sort begins
+ */
+ private int mCancelMethod = NO_CANCEL;
+
+ /**
+ * Determines when a slide shuffle animation starts. That is,
+ * defines how close to the edge of the drop slot the floating
+ * View must be to initiate the slide.
+ */
+ private float mSlideRegionFrac = 0.25f;
+
+ /**
+ * Number between 0 and 1 indicating the relative location of
+ * a sliding item (only used if drag-sort animations
+ * are turned on). Nearly 1 means the item is
+ * at the top of the slide region (nearly full blank item
+ * is directly below).
+ */
+ private float mSlideFrac = 0.0f;
+
+ /**
+ * Wraps the user-provided ListAdapter. This is used to wrap each
+ * item View given by the user inside another View (currenly
+ * a RelativeLayout) which
+ * expands and collapses to simulate the item shuffling.
+ */
+ private AdapterWrapper mAdapterWrapper;
+
+ /**
+ * Turn on custom debugger.
+ */
+ private boolean mTrackDragSort = false;
+
+ /**
+ * Debugging class.
+ */
+ private DragSortTracker mDragSortTracker;
+
+ /**
+ * Needed for adjusting item heights from within layoutChildren
+ */
+ private boolean mBlockLayoutRequests = false;
+
+ /**
+ * Set to true when a down event happens during drag sort;
+ * for example, when drag finish animations are
+ * playing.
+ */
+ private boolean mIgnoreTouchEvent = false;
+
+ /**
+ * Caches DragSortItemView child heights. Sometimes DSLV has to
+ * know the height of an offscreen item. Since ListView virtualizes
+ * these, DSLV must get the item from the ListAdapter to obtain
+ * its height. That process can be expensive, but often the same
+ * offscreen item will be requested many times in a row. Once an
+ * offscreen item height is calculated, we cache it in this guy.
+ * Actually, we cache the height of the child of the
+ * DragSortItemView since the item height changes often during a
+ * drag-sort.
+ */
+ private static final int sCacheSize = 3;
+ private HeightCache mChildHeightCache = new HeightCache(sCacheSize);
+
+ private RemoveAnimator mRemoveAnimator;
+
+ private LiftAnimator mLiftAnimator;
+
+ private DropAnimator mDropAnimator;
+
+ private boolean mUseRemoveVelocity;
+ private float mRemoveVelocityX = 0;
+
+ public DragSortListView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ int defaultDuration = 150;
+ int removeAnimDuration = defaultDuration; // ms
+ int dropAnimDuration = defaultDuration; // ms
+
+ if (attrs != null) {
+ TypedArray a = getContext().obtainStyledAttributes(attrs,
+ R.styleable.DragSortListView, 0, 0);
+
+ mItemHeightCollapsed = Math.max(1, a.getDimensionPixelSize(
+ R.styleable.DragSortListView_collapsed_height, 1));
+
+ mTrackDragSort = a.getBoolean(
+ R.styleable.DragSortListView_track_drag_sort, false);
+
+ if (mTrackDragSort) {
+ mDragSortTracker = new DragSortTracker();
+ }
+
+ // alpha between 0 and 255, 0=transparent, 255=opaque
+ mFloatAlpha = a.getFloat(R.styleable.DragSortListView_float_alpha, mFloatAlpha);
+ mCurrFloatAlpha = mFloatAlpha;
+
+ mDragEnabled = a.getBoolean(R.styleable.DragSortListView_drag_enabled, mDragEnabled);
+
+ mSlideRegionFrac = Math.max(0.0f,
+ Math.min(1.0f, 1.0f - a.getFloat(
+ R.styleable.DragSortListView_slide_shuffle_speed,
+ 0.75f)));
+
+ mAnimate = mSlideRegionFrac > 0.0f;
+
+ float frac = a.getFloat(
+ R.styleable.DragSortListView_drag_scroll_start,
+ mDragUpScrollStartFrac);
+
+ setDragScrollStart(frac);
+
+ mMaxScrollSpeed = a.getFloat(
+ R.styleable.DragSortListView_max_drag_scroll_speed,
+ mMaxScrollSpeed);
+
+ removeAnimDuration = a.getInt(
+ R.styleable.DragSortListView_remove_animation_duration,
+ removeAnimDuration);
+
+ dropAnimDuration = a.getInt(
+ R.styleable.DragSortListView_drop_animation_duration,
+ dropAnimDuration);
+
+ boolean useDefault = a.getBoolean(
+ R.styleable.DragSortListView_use_default_controller,
+ true);
+
+ if (useDefault) {
+ boolean removeEnabled = a.getBoolean(
+ R.styleable.DragSortListView_remove_enabled,
+ false);
+ int removeMode = a.getInt(
+ R.styleable.DragSortListView_remove_mode,
+ DragSortController.FLING_REMOVE);
+ boolean sortEnabled = a.getBoolean(
+ R.styleable.DragSortListView_sort_enabled,
+ true);
+ int dragInitMode = a.getInt(
+ R.styleable.DragSortListView_drag_start_mode,
+ DragSortController.ON_DOWN);
+ int dragHandleId = a.getResourceId(
+ R.styleable.DragSortListView_drag_handle_id,
+ 0);
+ int flingHandleId = a.getResourceId(
+ R.styleable.DragSortListView_fling_handle_id,
+ 0);
+ int clickRemoveId = a.getResourceId(
+ R.styleable.DragSortListView_click_remove_id,
+ 0);
+ int bgColor = a.getColor(
+ R.styleable.DragSortListView_float_background_color,
+ Color.BLACK);
+
+ DragSortController controller = new DragSortController(
+ this, dragHandleId, dragInitMode, removeMode,
+ clickRemoveId, flingHandleId);
+ controller.setRemoveEnabled(removeEnabled);
+ controller.setSortEnabled(sortEnabled);
+ controller.setBackgroundColor(bgColor);
+
+ mFloatViewManager = controller;
+ setOnTouchListener(controller);
+ }
+
+ a.recycle();
+ }
+
+ mDragScroller = new DragScroller();
+
+ float smoothness = 0.5f;
+ if (removeAnimDuration > 0) {
+ mRemoveAnimator = new RemoveAnimator(smoothness, removeAnimDuration);
+ }
+ // mLiftAnimator = new LiftAnimator(smoothness, 100);
+ if (dropAnimDuration > 0) {
+ mDropAnimator = new DropAnimator(smoothness, dropAnimDuration);
+ }
+
+ mCancelEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0f, 0f, 0f, 0f, 0, 0f,
+ 0f, 0, 0);
+
+ // construct the dataset observer
+ mObserver = new DataSetObserver() {
+ private void cancel() {
+ if (mDragState == DRAGGING) {
+ cancelDrag();
+ }
+ }
+
+ @Override
+ public void onChanged() {
+ cancel();
+ }
+
+ @Override
+ public void onInvalidated() {
+ cancel();
+ }
+ };
+ }
+
+ /**
+ * Usually called from a FloatViewManager. The float alpha
+ * will be reset to the xml-defined value every time a drag
+ * is stopped.
+ */
+ public void setFloatAlpha(float alpha) {
+ mCurrFloatAlpha = alpha;
+ }
+
+ public float getFloatAlpha() {
+ return mCurrFloatAlpha;
+ }
+
+ /**
+ * Set maximum drag scroll speed in positions/second. Only applies
+ * if using default ScrollSpeedProfile.
+ *
+ * @param max Maximum scroll speed.
+ */
+ public void setMaxScrollSpeed(float max) {
+ mMaxScrollSpeed = max;
+ }
+
+ /**
+ * For each DragSortListView Listener interface implemented by
+ * adapter, this method calls the appropriate
+ * set*Listener method with adapter as the argument.
+ *
+ * @param adapter The ListAdapter providing data to back
+ * DragSortListView.
+ *
+ * @see android.widget.ListView#setAdapter(android.widget.ListAdapter)
+ */
+ @Override
+ public void setAdapter(ListAdapter adapter) {
+ if (adapter != null) {
+ mAdapterWrapper = new AdapterWrapper(adapter);
+ adapter.registerDataSetObserver(mObserver);
+
+ if (adapter instanceof DropListener) {
+ setDropListener((DropListener) adapter);
+ }
+ if (adapter instanceof DragListener) {
+ setDragListener((DragListener) adapter);
+ }
+ if (adapter instanceof RemoveListener) {
+ setRemoveListener((RemoveListener) adapter);
+ }
+ } else {
+ mAdapterWrapper = null;
+ }
+
+ super.setAdapter(mAdapterWrapper);
+ }
+
+ /**
+ * As opposed to {@link ListView#getAdapter()}, which returns
+ * a heavily wrapped ListAdapter (DragSortListView wraps the
+ * input ListAdapter {\emph and} ListView wraps the wrapped one).
+ *
+ * @return The ListAdapter set as the argument of {@link setAdapter()}
+ */
+ public ListAdapter getInputAdapter() {
+ if (mAdapterWrapper == null) {
+ return null;
+ } else {
+ return mAdapterWrapper.getAdapter();
+ }
+ }
+
+ private class AdapterWrapper extends BaseAdapter {
+ private ListAdapter mAdapter;
+
+ public AdapterWrapper(ListAdapter adapter) {
+ super();
+ mAdapter = adapter;
+
+ mAdapter.registerDataSetObserver(new DataSetObserver() {
+ public void onChanged() {
+ notifyDataSetChanged();
+ }
+
+ public void onInvalidated() {
+ notifyDataSetInvalidated();
+ }
+ });
+ }
+
+ public ListAdapter getAdapter() {
+ return mAdapter;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return mAdapter.getItemId(position);
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return mAdapter.getItem(position);
+ }
+
+ @Override
+ public int getCount() {
+ return mAdapter.getCount();
+ }
+
+ @Override
+ public boolean areAllItemsEnabled() {
+ return mAdapter.areAllItemsEnabled();
+ }
+
+ @Override
+ public boolean isEnabled(int position) {
+ return mAdapter.isEnabled(position);
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return mAdapter.getItemViewType(position);
+ }
+
+ @Override
+ public int getViewTypeCount() {
+ return mAdapter.getViewTypeCount();
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return mAdapter.hasStableIds();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return mAdapter.isEmpty();
+ }
+
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+
+ DragSortItemView v;
+ View child;
+ // Log.d("mobeta",
+ // "getView: position="+position+" convertView="+convertView);
+ if (convertView != null) {
+ v = (DragSortItemView) convertView;
+ View oldChild = v.getChildAt(0);
+
+ child = mAdapter.getView(position, oldChild, DragSortListView.this);
+ if (child != oldChild) {
+ // shouldn't get here if user is reusing convertViews
+ // properly
+ if (oldChild != null) {
+ v.removeViewAt(0);
+ }
+ v.addView(child);
+ }
+ } else {
+ child = mAdapter.getView(position, null, DragSortListView.this);
+ if (child instanceof Checkable) {
+ v = new DragSortItemViewCheckable(getContext());
+ } else {
+ v = new DragSortItemView(getContext());
+ }
+ v.setLayoutParams(new AbsListView.LayoutParams(
+ ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+ v.addView(child);
+ }
+
+ // Set the correct item height given drag state; passed
+ // View needs to be measured if measurement is required.
+ adjustItem(position + getHeaderViewsCount(), v, true);
+
+ return v;
+ }
+ }
+
+ private void drawDivider(int expPosition, Canvas canvas) {
+
+ final Drawable divider = getDivider();
+ final int dividerHeight = getDividerHeight();
+ // Log.d("mobeta", "div="+divider+" divH="+dividerHeight);
+
+ if (divider != null && dividerHeight != 0) {
+ final ViewGroup expItem = (ViewGroup) getChildAt(expPosition
+ - getFirstVisiblePosition());
+ if (expItem != null) {
+ final int l = getPaddingLeft();
+ final int r = getWidth() - getPaddingRight();
+ final int t;
+ final int b;
+
+ final int childHeight = expItem.getChildAt(0).getHeight();
+
+ if (expPosition > mSrcPos) {
+ t = expItem.getTop() + childHeight;
+ b = t + dividerHeight;
+ } else {
+ b = expItem.getBottom() - childHeight;
+ t = b - dividerHeight;
+ }
+ // Log.d("mobeta", "l="+l+" t="+t+" r="+r+" b="+b);
+
+ // Have to clip to support ColorDrawable on <= Gingerbread
+ canvas.save();
+ canvas.clipRect(l, t, r, b);
+ divider.setBounds(l, t, r, b);
+ divider.draw(canvas);
+ canvas.restore();
+ }
+ }
+ }
+
+ @Override
+ protected void dispatchDraw(Canvas canvas) {
+ super.dispatchDraw(canvas);
+
+ if (mDragState != IDLE) {
+ // draw the divider over the expanded item
+ if (mFirstExpPos != mSrcPos) {
+ drawDivider(mFirstExpPos, canvas);
+ }
+ if (mSecondExpPos != mFirstExpPos && mSecondExpPos != mSrcPos) {
+ drawDivider(mSecondExpPos, canvas);
+ }
+ }
+
+ if (mFloatView != null) {
+ // draw the float view over everything
+ final int w = mFloatView.getWidth();
+ final int h = mFloatView.getHeight();
+
+ int x = mFloatLoc.x;
+
+ int width = getWidth();
+ if (x < 0)
+ x = -x;
+ float alphaMod;
+ if (x < width) {
+ alphaMod = ((float) (width - x)) / ((float) width);
+ alphaMod *= alphaMod;
+ } else {
+ alphaMod = 0;
+ }
+
+ final int alpha = (int) (255f * mCurrFloatAlpha * alphaMod);
+
+ canvas.save();
+ // Log.d("mobeta", "clip rect bounds: " + canvas.getClipBounds());
+ canvas.translate(mFloatLoc.x, mFloatLoc.y);
+ canvas.clipRect(0, 0, w, h);
+
+ // Log.d("mobeta", "clip rect bounds: " + canvas.getClipBounds());
+ canvas.saveLayerAlpha(0, 0, w, h, alpha, Canvas.ALL_SAVE_FLAG);
+ mFloatView.draw(canvas);
+ canvas.restore();
+ canvas.restore();
+ }
+ }
+
+ private int getItemHeight(int position) {
+ View v = getChildAt(position - getFirstVisiblePosition());
+
+ if (v != null) {
+ // item is onscreen, just get the height of the View
+ return v.getHeight();
+ } else {
+ // item is offscreen. get child height and calculate
+ // item height based on current shuffle state
+ return calcItemHeight(position, getChildHeight(position));
+ }
+ }
+
+ private void printPosData() {
+ Log.d("mobeta", "mSrcPos=" + mSrcPos + " mFirstExpPos=" + mFirstExpPos + " mSecondExpPos="
+ + mSecondExpPos);
+ }
+
+ private class HeightCache {
+
+ private SparseIntArray mMap;
+ private ArrayList mOrder;
+ private int mMaxSize;
+
+ public HeightCache(int size) {
+ mMap = new SparseIntArray(size);
+ mOrder = new ArrayList(size);
+ mMaxSize = size;
+ }
+
+ /**
+ * Add item height at position if doesn't already exist.
+ */
+ public void add(int position, int height) {
+ int currHeight = mMap.get(position, -1);
+ if (currHeight != height) {
+ if (currHeight == -1) {
+ if (mMap.size() == mMaxSize) {
+ // remove oldest entry
+ mMap.delete(mOrder.remove(0));
+ }
+ } else {
+ // move position to newest slot
+ mOrder.remove((Integer) position);
+ }
+ mMap.put(position, height);
+ mOrder.add(position);
+ }
+ }
+
+ public int get(int position) {
+ return mMap.get(position, -1);
+ }
+
+ public void clear() {
+ mMap.clear();
+ mOrder.clear();
+ }
+
+ }
+
+ /**
+ * Get the shuffle edge for item at position when top of
+ * item is at y-coord top. Assumes that current item heights
+ * are consistent with current float view location and
+ * thus expanded positions and slide fraction. i.e. Should not be
+ * called between update of expanded positions/slide fraction
+ * and layoutChildren.
+ *
+ * @param position
+ * @param top
+ * @param height Height of item at position. If -1, this function
+ * calculates this height.
+ *
+ * @return Shuffle line between position-1 and position (for
+ * the given view of the list; that is, for when top of item at
+ * position has y-coord of given `top`). If
+ * floating View (treated as horizontal line) is dropped
+ * immediately above this line, it lands in position-1. If
+ * dropped immediately below this line, it lands in position.
+ */
+ private int getShuffleEdge(int position, int top) {
+
+ final int numHeaders = getHeaderViewsCount();
+ final int numFooters = getFooterViewsCount();
+
+ // shuffle edges are defined between items that can be
+ // dragged; there are N-1 of them if there are N draggable
+ // items.
+
+ if (position <= numHeaders || (position >= getCount() - numFooters)) {
+ return top;
+ }
+
+ int divHeight = getDividerHeight();
+
+ int edge;
+
+ int maxBlankHeight = mFloatViewHeight - mItemHeightCollapsed;
+ int childHeight = getChildHeight(position);
+ int itemHeight = getItemHeight(position);
+
+ // first calculate top of item given that floating View is
+ // centered over src position
+ int otop = top;
+ if (mSecondExpPos <= mSrcPos) {
+ // items are expanded on and/or above the source position
+
+ if (position == mSecondExpPos && mFirstExpPos != mSecondExpPos) {
+ if (position == mSrcPos) {
+ otop = top + itemHeight - mFloatViewHeight;
+ } else {
+ int blankHeight = itemHeight - childHeight;
+ otop = top + blankHeight - maxBlankHeight;
+ }
+ } else if (position > mSecondExpPos && position <= mSrcPos) {
+ otop = top - maxBlankHeight;
+ }
+
+ } else {
+ // items are expanded on and/or below the source position
+
+ if (position > mSrcPos && position <= mFirstExpPos) {
+ otop = top + maxBlankHeight;
+ } else if (position == mSecondExpPos && mFirstExpPos != mSecondExpPos) {
+ int blankHeight = itemHeight - childHeight;
+ otop = top + blankHeight;
+ }
+ }
+
+ // otop is set
+ if (position <= mSrcPos) {
+ edge = otop + (mFloatViewHeight - divHeight - getChildHeight(position - 1)) / 2;
+ } else {
+ edge = otop + (childHeight - divHeight - mFloatViewHeight) / 2;
+ }
+
+ return edge;
+ }
+
+ private boolean updatePositions() {
+
+ final int first = getFirstVisiblePosition();
+ int startPos = mFirstExpPos;
+ View startView = getChildAt(startPos - first);
+
+ if (startView == null) {
+ startPos = first + getChildCount() / 2;
+ startView = getChildAt(startPos - first);
+ }
+ int startTop = startView.getTop();
+
+ int itemHeight = startView.getHeight();
+
+ int edge = getShuffleEdge(startPos, startTop);
+ int lastEdge = edge;
+
+ int divHeight = getDividerHeight();
+
+ // Log.d("mobeta", "float mid="+mFloatViewMid);
+
+ int itemPos = startPos;
+ int itemTop = startTop;
+ if (mFloatViewMid < edge) {
+ // scanning up for float position
+ // Log.d("mobeta", " edge="+edge);
+ while (itemPos >= 0) {
+ itemPos--;
+ itemHeight = getItemHeight(itemPos);
+
+ if (itemPos == 0) {
+ edge = itemTop - divHeight - itemHeight;
+ break;
+ }
+
+ itemTop -= itemHeight + divHeight;
+ edge = getShuffleEdge(itemPos, itemTop);
+ // Log.d("mobeta", " edge="+edge);
+
+ if (mFloatViewMid >= edge) {
+ break;
+ }
+
+ lastEdge = edge;
+ }
+ } else {
+ // scanning down for float position
+ // Log.d("mobeta", " edge="+edge);
+ final int count = getCount();
+ while (itemPos < count) {
+ if (itemPos == count - 1) {
+ edge = itemTop + divHeight + itemHeight;
+ break;
+ }
+
+ itemTop += divHeight + itemHeight;
+ itemHeight = getItemHeight(itemPos + 1);
+ edge = getShuffleEdge(itemPos + 1, itemTop);
+ // Log.d("mobeta", " edge="+edge);
+
+ // test for hit
+ if (mFloatViewMid < edge) {
+ break;
+ }
+
+ lastEdge = edge;
+ itemPos++;
+ }
+ }
+
+ final int numHeaders = getHeaderViewsCount();
+ final int numFooters = getFooterViewsCount();
+
+ boolean updated = false;
+
+ int oldFirstExpPos = mFirstExpPos;
+ int oldSecondExpPos = mSecondExpPos;
+ float oldSlideFrac = mSlideFrac;
+
+ if (mAnimate) {
+ int edgeToEdge = Math.abs(edge - lastEdge);
+
+ int edgeTop, edgeBottom;
+ if (mFloatViewMid < edge) {
+ edgeBottom = edge;
+ edgeTop = lastEdge;
+ } else {
+ edgeTop = edge;
+ edgeBottom = lastEdge;
+ }
+ // Log.d("mobeta", "edgeTop="+edgeTop+" edgeBot="+edgeBottom);
+
+ int slideRgnHeight = (int) (0.5f * mSlideRegionFrac * edgeToEdge);
+ float slideRgnHeightF = (float) slideRgnHeight;
+ int slideEdgeTop = edgeTop + slideRgnHeight;
+ int slideEdgeBottom = edgeBottom - slideRgnHeight;
+
+ // Three regions
+ if (mFloatViewMid < slideEdgeTop) {
+ mFirstExpPos = itemPos - 1;
+ mSecondExpPos = itemPos;
+ mSlideFrac = 0.5f * ((float) (slideEdgeTop - mFloatViewMid)) / slideRgnHeightF;
+ // Log.d("mobeta",
+ // "firstExp="+mFirstExpPos+" secExp="+mSecondExpPos+" slideFrac="+mSlideFrac);
+ } else if (mFloatViewMid < slideEdgeBottom) {
+ mFirstExpPos = itemPos;
+ mSecondExpPos = itemPos;
+ } else {
+ mFirstExpPos = itemPos;
+ mSecondExpPos = itemPos + 1;
+ mSlideFrac = 0.5f * (1.0f + ((float) (edgeBottom - mFloatViewMid))
+ / slideRgnHeightF);
+ // Log.d("mobeta",
+ // "firstExp="+mFirstExpPos+" secExp="+mSecondExpPos+" slideFrac="+mSlideFrac);
+ }
+
+ } else {
+ mFirstExpPos = itemPos;
+ mSecondExpPos = itemPos;
+ }
+
+ // correct for headers and footers
+ if (mFirstExpPos < numHeaders) {
+ itemPos = numHeaders;
+ mFirstExpPos = itemPos;
+ mSecondExpPos = itemPos;
+ } else if (mSecondExpPos >= getCount() - numFooters) {
+ itemPos = getCount() - numFooters - 1;
+ mFirstExpPos = itemPos;
+ mSecondExpPos = itemPos;
+ }
+
+ if (mFirstExpPos != oldFirstExpPos || mSecondExpPos != oldSecondExpPos
+ || mSlideFrac != oldSlideFrac) {
+ updated = true;
+ }
+
+ if (itemPos != mFloatPos) {
+ if (mDragListener != null) {
+ mDragListener.drag(mFloatPos - numHeaders, itemPos - numHeaders);
+ }
+
+ mFloatPos = itemPos;
+ updated = true;
+ }
+
+ return updated;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ if (mTrackDragSort) {
+ mDragSortTracker.appendState();
+ }
+ }
+
+ private class SmoothAnimator implements Runnable {
+ protected long mStartTime;
+
+ private float mDurationF;
+
+ private float mAlpha;
+ private float mA, mB, mC, mD;
+
+ private boolean mCanceled;
+
+ public SmoothAnimator(float smoothness, int duration) {
+ mAlpha = smoothness;
+ mDurationF = (float) duration;
+ mA = mD = 1f / (2f * mAlpha * (1f - mAlpha));
+ mB = mAlpha / (2f * (mAlpha - 1f));
+ mC = 1f / (1f - mAlpha);
+ }
+
+ public float transform(float frac) {
+ if (frac < mAlpha) {
+ return mA * frac * frac;
+ } else if (frac < 1f - mAlpha) {
+ return mB + mC * frac;
+ } else {
+ return 1f - mD * (frac - 1f) * (frac - 1f);
+ }
+ }
+
+ public void start() {
+ mStartTime = SystemClock.uptimeMillis();
+ mCanceled = false;
+ onStart();
+ post(this);
+ }
+
+ public void cancel() {
+ mCanceled = true;
+ }
+
+ public void onStart() {
+ // stub
+ }
+
+ public void onUpdate(float frac, float smoothFrac) {
+ // stub
+ }
+
+ public void onStop() {
+ // stub
+ }
+
+ @Override
+ public void run() {
+ if (mCanceled) {
+ return;
+ }
+
+ float fraction = ((float) (SystemClock.uptimeMillis() - mStartTime)) / mDurationF;
+
+ if (fraction >= 1f) {
+ onUpdate(1f, 1f);
+ onStop();
+ } else {
+ onUpdate(fraction, transform(fraction));
+ post(this);
+ }
+ }
+ }
+
+ /**
+ * Centers floating View under touch point.
+ */
+ private class LiftAnimator extends SmoothAnimator {
+
+ private float mInitDragDeltaY;
+ private float mFinalDragDeltaY;
+
+ public LiftAnimator(float smoothness, int duration) {
+ super(smoothness, duration);
+ }
+
+ @Override
+ public void onStart() {
+ mInitDragDeltaY = mDragDeltaY;
+ mFinalDragDeltaY = mFloatViewHeightHalf;
+ }
+
+ @Override
+ public void onUpdate(float frac, float smoothFrac) {
+ if (mDragState != DRAGGING) {
+ cancel();
+ } else {
+ mDragDeltaY = (int) (smoothFrac * mFinalDragDeltaY + (1f - smoothFrac)
+ * mInitDragDeltaY);
+ mFloatLoc.y = mY - mDragDeltaY;
+ doDragFloatView(true);
+ }
+ }
+ }
+
+ /**
+ * Centers floating View over drop slot before destroying.
+ */
+ private class DropAnimator extends SmoothAnimator {
+
+ private int mDropPos;
+ private int srcPos;
+ private float mInitDeltaY;
+ private float mInitDeltaX;
+
+ public DropAnimator(float smoothness, int duration) {
+ super(smoothness, duration);
+ }
+
+ @Override
+ public void onStart() {
+ mDropPos = mFloatPos;
+ srcPos = mSrcPos;
+ mDragState = DROPPING;
+ mInitDeltaY = mFloatLoc.y - getTargetY();
+ mInitDeltaX = mFloatLoc.x - getPaddingLeft();
+ }
+
+ private int getTargetY() {
+ final int first = getFirstVisiblePosition();
+ final int otherAdjust = (mItemHeightCollapsed + getDividerHeight()) / 2;
+ View v = getChildAt(mDropPos - first);
+ int targetY = -1;
+ if (v != null) {
+ if (mDropPos == srcPos) {
+ targetY = v.getTop();
+ } else if (mDropPos < srcPos) {
+ // expanded down
+ targetY = v.getTop() - otherAdjust;
+ } else {
+ // expanded up
+ targetY = v.getBottom() + otherAdjust - mFloatViewHeight;
+ }
+ } else {
+ // drop position is not on screen?? no animation
+ cancel();
+ }
+
+ return targetY;
+ }
+
+ @Override
+ public void onUpdate(float frac, float smoothFrac) {
+ final int targetY = getTargetY();
+ final int targetX = getPaddingLeft();
+ final float deltaY = mFloatLoc.y - targetY;
+ final float deltaX = mFloatLoc.x - targetX;
+ final float f = 1f - smoothFrac;
+ if (f < Math.abs(deltaY / mInitDeltaY) || f < Math.abs(deltaX / mInitDeltaX)) {
+ mFloatLoc.y = targetY + (int) (mInitDeltaY * f);
+ mFloatLoc.x = getPaddingLeft() + (int) (mInitDeltaX * f);
+ doDragFloatView(true);
+ }
+ }
+
+ @Override
+ public void onStop() {
+ dropFloatView();
+ }
+
+ }
+
+ /**
+ * Collapses expanded items.
+ */
+ private class RemoveAnimator extends SmoothAnimator {
+
+ private float mFloatLocX;
+ private float mFirstStartBlank;
+ private float mSecondStartBlank;
+
+ private int mFirstChildHeight = -1;
+ private int mSecondChildHeight = -1;
+
+ private int mFirstPos;
+ private int mSecondPos;
+ private int srcPos;
+
+ public RemoveAnimator(float smoothness, int duration) {
+ super(smoothness, duration);
+ }
+
+ @Override
+ public void onStart() {
+ mFirstChildHeight = -1;
+ mSecondChildHeight = -1;
+ mFirstPos = mFirstExpPos;
+ mSecondPos = mSecondExpPos;
+ srcPos = mSrcPos;
+ mDragState = REMOVING;
+
+ mFloatLocX = mFloatLoc.x;
+ if (mUseRemoveVelocity) {
+ float minVelocity = 2f * getWidth();
+ if (mRemoveVelocityX == 0) {
+ mRemoveVelocityX = (mFloatLocX < 0 ? -1 : 1) * minVelocity;
+ } else {
+ minVelocity *= 2;
+ if (mRemoveVelocityX < 0 && mRemoveVelocityX > -minVelocity)
+ mRemoveVelocityX = -minVelocity;
+ else if (mRemoveVelocityX > 0 && mRemoveVelocityX < minVelocity)
+ mRemoveVelocityX = minVelocity;
+ }
+ } else {
+ destroyFloatView();
+ }
+ }
+
+ @Override
+ public void onUpdate(float frac, float smoothFrac) {
+ float f = 1f - smoothFrac;
+
+ final int firstVis = getFirstVisiblePosition();
+ View item = getChildAt(mFirstPos - firstVis);
+ ViewGroup.LayoutParams lp;
+ int blank;
+
+ if (mUseRemoveVelocity) {
+ float dt = (float) (SystemClock.uptimeMillis() - mStartTime) / 1000;
+ if (dt == 0)
+ return;
+ float dx = mRemoveVelocityX * dt;
+ int w = getWidth();
+ mRemoveVelocityX += (mRemoveVelocityX > 0 ? 1 : -1) * dt * w;
+ mFloatLocX += dx;
+ mFloatLoc.x = (int) mFloatLocX;
+ if (mFloatLocX < w && mFloatLocX > -w) {
+ mStartTime = SystemClock.uptimeMillis();
+ doDragFloatView(true);
+ return;
+ }
+ }
+
+ if (item != null) {
+ if (mFirstChildHeight == -1) {
+ mFirstChildHeight = getChildHeight(mFirstPos, item, false);
+ mFirstStartBlank = (float) (item.getHeight() - mFirstChildHeight);
+ }
+ blank = Math.max((int) (f * mFirstStartBlank), 1);
+ lp = item.getLayoutParams();
+ lp.height = mFirstChildHeight + blank;
+ item.setLayoutParams(lp);
+ }
+ if (mSecondPos != mFirstPos) {
+ item = getChildAt(mSecondPos - firstVis);
+ if (item != null) {
+ if (mSecondChildHeight == -1) {
+ mSecondChildHeight = getChildHeight(mSecondPos, item, false);
+ mSecondStartBlank = (float) (item.getHeight() - mSecondChildHeight);
+ }
+ blank = Math.max((int) (f * mSecondStartBlank), 1);
+ lp = item.getLayoutParams();
+ lp.height = mSecondChildHeight + blank;
+ item.setLayoutParams(lp);
+ }
+ }
+ }
+
+ @Override
+ public void onStop() {
+ doRemoveItem();
+ }
+ }
+
+ public void removeItem(int which) {
+
+ mUseRemoveVelocity = false;
+ removeItem(which, 0);
+ }
+
+ /**
+ * Removes an item from the list and animates the removal.
+ *
+ * @param which Position to remove (NOTE: headers/footers ignored!
+ * this is a position in your input ListAdapter).
+ * @param velocityX
+ */
+ public void removeItem(int which, float velocityX) {
+ if (mDragState == IDLE || mDragState == DRAGGING) {
+
+ if (mDragState == IDLE) {
+ // called from outside drag-sort
+ mSrcPos = getHeaderViewsCount() + which;
+ mFirstExpPos = mSrcPos;
+ mSecondExpPos = mSrcPos;
+ mFloatPos = mSrcPos;
+ View v = getChildAt(mSrcPos - getFirstVisiblePosition());
+ if (v != null) {
+ v.setVisibility(View.INVISIBLE);
+ }
+ }
+
+ mDragState = REMOVING;
+ mRemoveVelocityX = velocityX;
+
+ if (mInTouchEvent) {
+ switch (mCancelMethod) {
+ case ON_TOUCH_EVENT:
+ super.onTouchEvent(mCancelEvent);
+ break;
+ case ON_INTERCEPT_TOUCH_EVENT:
+ super.onInterceptTouchEvent(mCancelEvent);
+ break;
+ }
+ }
+
+ if (mRemoveAnimator != null) {
+ mRemoveAnimator.start();
+ } else {
+ doRemoveItem(which);
+ }
+ }
+ }
+
+ /**
+ * Move an item, bypassing the drag-sort process. Simply calls
+ * through to {@link DropListener#drop(int, int)}.
+ *
+ * @param from Position to move (NOTE: headers/footers ignored!
+ * this is a position in your input ListAdapter).
+ * @param to Target position (NOTE: headers/footers ignored!
+ * this is a position in your input ListAdapter).
+ */
+ public void moveItem(int from, int to) {
+ if (mDropListener != null) {
+ final int count = getInputAdapter().getCount();
+ if (from >= 0 && from < count && to >= 0 && to < count) {
+ mDropListener.drop(from, to);
+ }
+ }
+ }
+
+ /**
+ * Cancel a drag. Calls {@link #stopDrag(boolean, boolean)} with
+ * true as the first argument.
+ */
+ public void cancelDrag() {
+ if (mDragState == DRAGGING) {
+ mDragScroller.stopScrolling(true);
+ destroyFloatView();
+ clearPositions();
+ adjustAllItems();
+
+ if (mInTouchEvent) {
+ mDragState = STOPPED;
+ } else {
+ mDragState = IDLE;
+ }
+ }
+ }
+
+ private void clearPositions() {
+ mSrcPos = -1;
+ mFirstExpPos = -1;
+ mSecondExpPos = -1;
+ mFloatPos = -1;
+ }
+
+ private void dropFloatView() {
+ // must set to avoid cancelDrag being called from the
+ // DataSetObserver
+ mDragState = DROPPING;
+
+ if (mDropListener != null && mFloatPos >= 0 && mFloatPos < getCount()) {
+ final int numHeaders = getHeaderViewsCount();
+ mDropListener.drop(mSrcPos - numHeaders, mFloatPos - numHeaders);
+ }
+
+ destroyFloatView();
+
+ adjustOnReorder();
+ clearPositions();
+ adjustAllItems();
+
+ // now the drag is done
+ if (mInTouchEvent) {
+ mDragState = STOPPED;
+ } else {
+ mDragState = IDLE;
+ }
+ }
+
+ private void doRemoveItem() {
+ doRemoveItem(mSrcPos - getHeaderViewsCount());
+ }
+
+ /**
+ * Removes dragged item from the list. Calls RemoveListener.
+ */
+ private void doRemoveItem(int which) {
+ // must set to avoid cancelDrag being called from the
+ // DataSetObserver
+ mDragState = REMOVING;
+
+ // end it
+ if (mRemoveListener != null) {
+ mRemoveListener.remove(which);
+ }
+
+ destroyFloatView();
+
+ adjustOnReorder();
+ clearPositions();
+
+ // now the drag is done
+ if (mInTouchEvent) {
+ mDragState = STOPPED;
+ } else {
+ mDragState = IDLE;
+ }
+ }
+
+ private void adjustOnReorder() {
+ final int firstPos = getFirstVisiblePosition();
+ // Log.d("mobeta", "first="+firstPos+" src="+mSrcPos);
+ if (mSrcPos < firstPos) {
+ // collapsed src item is off screen;
+ // adjust the scroll after item heights have been fixed
+ View v = getChildAt(0);
+ int top = 0;
+ if (v != null) {
+ top = v.getTop();
+ }
+ // Log.d("mobeta", "top="+top+" fvh="+mFloatViewHeight);
+ setSelectionFromTop(firstPos - 1, top - getPaddingTop());
+ }
+ }
+
+ /**
+ * Stop a drag in progress. Pass true if you would
+ * like to remove the dragged item from the list.
+ *
+ * @param remove Remove the dragged item from the list. Calls
+ * a registered RemoveListener, if one exists. Otherwise, calls
+ * the DropListener, if one exists.
+ *
+ * @return True if the stop was successful. False if there is
+ * no floating View.
+ */
+ public boolean stopDrag(boolean remove) {
+ mUseRemoveVelocity = false;
+ return stopDrag(remove, 0);
+ }
+
+ public boolean stopDragWithVelocity(boolean remove, float velocityX) {
+
+ mUseRemoveVelocity = true;
+ return stopDrag(remove, velocityX);
+ }
+
+ public boolean stopDrag(boolean remove, float velocityX) {
+ if (mFloatView != null) {
+ mDragScroller.stopScrolling(true);
+
+ if (remove) {
+ removeItem(mSrcPos - getHeaderViewsCount(), velocityX);
+ } else {
+ if (mDropAnimator != null) {
+ mDropAnimator.start();
+ } else {
+ dropFloatView();
+ }
+ }
+
+ if (mTrackDragSort) {
+ mDragSortTracker.stopTracking();
+ }
+
+ return true;
+ } else {
+ // stop failed
+ return false;
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ if (mIgnoreTouchEvent) {
+ mIgnoreTouchEvent = false;
+ return false;
+ }
+
+ if (!mDragEnabled) {
+ return super.onTouchEvent(ev);
+ }
+
+ boolean more = false;
+
+ boolean lastCallWasIntercept = mLastCallWasIntercept;
+ mLastCallWasIntercept = false;
+
+ if (!lastCallWasIntercept) {
+ saveTouchCoords(ev);
+ }
+
+ // if (mFloatView != null) {
+ if (mDragState == DRAGGING) {
+ onDragTouchEvent(ev);
+ more = true; // give us more!
+ } else {
+ // what if float view is null b/c we dropped in middle
+ // of drag touch event?
+
+ // if (mDragState != STOPPED) {
+ if (mDragState == IDLE) {
+ if (super.onTouchEvent(ev)) {
+ more = true;
+ }
+ }
+
+ int action = ev.getAction() & MotionEvent.ACTION_MASK;
+
+ switch (action) {
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ doActionUpOrCancel();
+ break;
+ default:
+ if (more) {
+ mCancelMethod = ON_TOUCH_EVENT;
+ }
+ }
+ }
+
+ return more;
+ }
+
+ private void doActionUpOrCancel() {
+ mCancelMethod = NO_CANCEL;
+ mInTouchEvent = false;
+ if (mDragState == STOPPED) {
+ mDragState = IDLE;
+ }
+ mCurrFloatAlpha = mFloatAlpha;
+ mListViewIntercepted = false;
+ mChildHeightCache.clear();
+ }
+
+ private void saveTouchCoords(MotionEvent ev) {
+ int action = ev.getAction() & MotionEvent.ACTION_MASK;
+ if (action != MotionEvent.ACTION_DOWN) {
+ mLastX = mX;
+ mLastY = mY;
+ }
+ mX = (int) ev.getX();
+ mY = (int) ev.getY();
+ if (action == MotionEvent.ACTION_DOWN) {
+ mLastX = mX;
+ mLastY = mY;
+ }
+ mOffsetX = (int) ev.getRawX() - mX;
+ mOffsetY = (int) ev.getRawY() - mY;
+ }
+
+ public boolean listViewIntercepted() {
+ return mListViewIntercepted;
+ }
+
+ private boolean mListViewIntercepted = false;
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ if (!mDragEnabled) {
+ return super.onInterceptTouchEvent(ev);
+ }
+
+ saveTouchCoords(ev);
+ mLastCallWasIntercept = true;
+
+ int action = ev.getAction() & MotionEvent.ACTION_MASK;
+
+ if (action == MotionEvent.ACTION_DOWN) {
+ if (mDragState != IDLE) {
+ // intercept and ignore
+ mIgnoreTouchEvent = true;
+ return true;
+ }
+ mInTouchEvent = true;
+ }
+
+ boolean intercept = false;
+
+ // the following deals with calls to super.onInterceptTouchEvent
+ if (mFloatView != null) {
+ // super's touch event canceled in startDrag
+ intercept = true;
+ } else {
+ if (super.onInterceptTouchEvent(ev)) {
+ mListViewIntercepted = true;
+ intercept = true;
+ }
+
+ switch (action) {
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ doActionUpOrCancel();
+ break;
+ default:
+ if (intercept) {
+ mCancelMethod = ON_TOUCH_EVENT;
+ } else {
+ mCancelMethod = ON_INTERCEPT_TOUCH_EVENT;
+ }
+ }
+ }
+
+ if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+ mInTouchEvent = false;
+ }
+
+ return intercept;
+ }
+
+ /**
+ * Set the width of each drag scroll region by specifying
+ * a fraction of the ListView height.
+ *
+ * @param heightFraction Fraction of ListView height. Capped at
+ * 0.5f.
+ *
+ */
+ public void setDragScrollStart(float heightFraction) {
+ setDragScrollStarts(heightFraction, heightFraction);
+ }
+
+ /**
+ * Set the width of each drag scroll region by specifying
+ * a fraction of the ListView height.
+ *
+ * @param upperFrac Fraction of ListView height for up-scroll bound.
+ * Capped at 0.5f.
+ * @param lowerFrac Fraction of ListView height for down-scroll bound.
+ * Capped at 0.5f.
+ *
+ */
+ public void setDragScrollStarts(float upperFrac, float lowerFrac) {
+ if (lowerFrac > 0.5f) {
+ mDragDownScrollStartFrac = 0.5f;
+ } else {
+ mDragDownScrollStartFrac = lowerFrac;
+ }
+
+ if (upperFrac > 0.5f) {
+ mDragUpScrollStartFrac = 0.5f;
+ } else {
+ mDragUpScrollStartFrac = upperFrac;
+ }
+
+ if (getHeight() != 0) {
+ updateScrollStarts();
+ }
+ }
+
+ private void continueDrag(int x, int y) {
+
+ // proposed position
+ mFloatLoc.x = x - mDragDeltaX;
+ mFloatLoc.y = y - mDragDeltaY;
+
+ doDragFloatView(true);
+
+ int minY = Math.min(y, mFloatViewMid + mFloatViewHeightHalf);
+ int maxY = Math.max(y, mFloatViewMid - mFloatViewHeightHalf);
+
+ // get the current scroll direction
+ int currentScrollDir = mDragScroller.getScrollDir();
+
+ if (minY > mLastY && minY > mDownScrollStartY && currentScrollDir != DragScroller.DOWN) {
+ // dragged down, it is below the down scroll start and it is not
+ // scrolling up
+
+ if (currentScrollDir != DragScroller.STOP) {
+ // moved directly from up scroll to down scroll
+ mDragScroller.stopScrolling(true);
+ }
+
+ // start scrolling down
+ mDragScroller.startScrolling(DragScroller.DOWN);
+ } else if (maxY < mLastY && maxY < mUpScrollStartY && currentScrollDir != DragScroller.UP) {
+ // dragged up, it is above the up scroll start and it is not
+ // scrolling up
+
+ if (currentScrollDir != DragScroller.STOP) {
+ // moved directly from down scroll to up scroll
+ mDragScroller.stopScrolling(true);
+ }
+
+ // start scrolling up
+ mDragScroller.startScrolling(DragScroller.UP);
+ }
+ else if (maxY >= mUpScrollStartY && minY <= mDownScrollStartY
+ && mDragScroller.isScrolling()) {
+ // not in the upper nor in the lower drag-scroll regions but it is
+ // still scrolling
+
+ mDragScroller.stopScrolling(true);
+ }
+ }
+
+ private void updateScrollStarts() {
+ final int padTop = getPaddingTop();
+ final int listHeight = getHeight() - padTop - getPaddingBottom();
+ float heightF = (float) listHeight;
+
+ mUpScrollStartYF = padTop + mDragUpScrollStartFrac * heightF;
+ mDownScrollStartYF = padTop + (1.0f - mDragDownScrollStartFrac) * heightF;
+
+ mUpScrollStartY = (int) mUpScrollStartYF;
+ mDownScrollStartY = (int) mDownScrollStartYF;
+
+ mDragUpScrollHeight = mUpScrollStartYF - padTop;
+ mDragDownScrollHeight = padTop + listHeight - mDownScrollStartYF;
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ updateScrollStarts();
+ }
+
+ private void adjustAllItems() {
+ final int first = getFirstVisiblePosition();
+ final int last = getLastVisiblePosition();
+
+ int begin = Math.max(0, getHeaderViewsCount() - first);
+ int end = Math.min(last - first, getCount() - 1 - getFooterViewsCount() - first);
+
+ for (int i = begin; i <= end; ++i) {
+ View v = getChildAt(i);
+ if (v != null) {
+ adjustItem(first + i, v, false);
+ }
+ }
+ }
+
+ private void adjustItem(int position) {
+ View v = getChildAt(position - getFirstVisiblePosition());
+
+ if (v != null) {
+ adjustItem(position, v, false);
+ }
+ }
+
+ /**
+ * Sets layout param height, gravity, and visibility on
+ * wrapped item.
+ */
+ private void adjustItem(int position, View v, boolean invalidChildHeight) {
+
+ // Adjust item height
+ ViewGroup.LayoutParams lp = v.getLayoutParams();
+ int height;
+ if (position != mSrcPos && position != mFirstExpPos && position != mSecondExpPos) {
+ height = ViewGroup.LayoutParams.WRAP_CONTENT;
+ } else {
+ height = calcItemHeight(position, v, invalidChildHeight);
+ }
+
+ if (height != lp.height) {
+ lp.height = height;
+ v.setLayoutParams(lp);
+ }
+
+ // Adjust item gravity
+ if (position == mFirstExpPos || position == mSecondExpPos) {
+ if (position < mSrcPos) {
+ ((DragSortItemView) v).setGravity(Gravity.BOTTOM);
+ } else if (position > mSrcPos) {
+ ((DragSortItemView) v).setGravity(Gravity.TOP);
+ }
+ }
+
+ // Finally adjust item visibility
+
+ int oldVis = v.getVisibility();
+ int vis = View.VISIBLE;
+
+ if (position == mSrcPos && mFloatView != null) {
+ vis = View.INVISIBLE;
+ }
+
+ if (vis != oldVis) {
+ v.setVisibility(vis);
+ }
+ }
+
+ private int getChildHeight(int position) {
+ if (position == mSrcPos) {
+ return 0;
+ }
+
+ View v = getChildAt(position - getFirstVisiblePosition());
+
+ if (v != null) {
+ // item is onscreen, therefore child height is valid,
+ // hence the "true"
+ return getChildHeight(position, v, false);
+ } else {
+ // item is offscreen
+ // first check cache for child height at this position
+ int childHeight = mChildHeightCache.get(position);
+ if (childHeight != -1) {
+ // Log.d("mobeta", "found child height in cache!");
+ return childHeight;
+ }
+
+ final ListAdapter adapter = getAdapter();
+ int type = adapter.getItemViewType(position);
+
+ // There might be a better place for checking for the following
+ final int typeCount = adapter.getViewTypeCount();
+ if (typeCount != mSampleViewTypes.length) {
+ mSampleViewTypes = new View[typeCount];
+ }
+
+ if (type >= 0) {
+ if (mSampleViewTypes[type] == null) {
+ v = adapter.getView(position, null, this);
+ mSampleViewTypes[type] = v;
+ } else {
+ v = adapter.getView(position, mSampleViewTypes[type], this);
+ }
+ } else {
+ // type is HEADER_OR_FOOTER or IGNORE
+ v = adapter.getView(position, null, this);
+ }
+
+ // current child height is invalid, hence "true" below
+ childHeight = getChildHeight(position, v, true);
+
+ // cache it because this could have been expensive
+ mChildHeightCache.add(position, childHeight);
+
+ return childHeight;
+ }
+ }
+
+ private int getChildHeight(int position, View item, boolean invalidChildHeight) {
+ if (position == mSrcPos) {
+ return 0;
+ }
+
+ View child;
+ if (position < getHeaderViewsCount() || position >= getCount() - getFooterViewsCount()) {
+ child = item;
+ } else {
+ child = ((ViewGroup) item).getChildAt(0);
+ }
+
+ ViewGroup.LayoutParams lp = child.getLayoutParams();
+
+ if (lp != null) {
+ if (lp.height > 0) {
+ return lp.height;
+ }
+ }
+
+ int childHeight = child.getHeight();
+
+ if (childHeight == 0 || invalidChildHeight) {
+ measureItem(child);
+ childHeight = child.getMeasuredHeight();
+ }
+
+ return childHeight;
+ }
+
+ private int calcItemHeight(int position, View item, boolean invalidChildHeight) {
+ return calcItemHeight(position, getChildHeight(position, item, invalidChildHeight));
+ }
+
+ private int calcItemHeight(int position, int childHeight) {
+
+ int divHeight = getDividerHeight();
+
+ boolean isSliding = mAnimate && mFirstExpPos != mSecondExpPos;
+ int maxNonSrcBlankHeight = mFloatViewHeight - mItemHeightCollapsed;
+ int slideHeight = (int) (mSlideFrac * maxNonSrcBlankHeight);
+
+ int height;
+
+ if (position == mSrcPos) {
+ if (mSrcPos == mFirstExpPos) {
+ if (isSliding) {
+ height = slideHeight + mItemHeightCollapsed;
+ } else {
+ height = mFloatViewHeight;
+ }
+ } else if (mSrcPos == mSecondExpPos) {
+ // if gets here, we know an item is sliding
+ height = mFloatViewHeight - slideHeight;
+ } else {
+ height = mItemHeightCollapsed;
+ }
+ } else if (position == mFirstExpPos) {
+ if (isSliding) {
+ height = childHeight + slideHeight;
+ } else {
+ height = childHeight + maxNonSrcBlankHeight;
+ }
+ } else if (position == mSecondExpPos) {
+ // we know an item is sliding (b/c 2ndPos != 1stPos)
+ height = childHeight + maxNonSrcBlankHeight - slideHeight;
+ } else {
+ height = childHeight;
+ }
+
+ return height;
+ }
+
+ @Override
+ public void requestLayout() {
+ if (!mBlockLayoutRequests) {
+ super.requestLayout();
+ }
+ }
+
+ private int adjustScroll(int movePos, View moveItem, int oldFirstExpPos, int oldSecondExpPos) {
+ int adjust = 0;
+
+ final int childHeight = getChildHeight(movePos);
+
+ int moveHeightBefore = moveItem.getHeight();
+ int moveHeightAfter = calcItemHeight(movePos, childHeight);
+
+ int moveBlankBefore = moveHeightBefore;
+ int moveBlankAfter = moveHeightAfter;
+ if (movePos != mSrcPos) {
+ moveBlankBefore -= childHeight;
+ moveBlankAfter -= childHeight;
+ }
+
+ int maxBlank = mFloatViewHeight;
+ if (mSrcPos != mFirstExpPos && mSrcPos != mSecondExpPos) {
+ maxBlank -= mItemHeightCollapsed;
+ }
+
+ if (movePos <= oldFirstExpPos) {
+ if (movePos > mFirstExpPos) {
+ adjust += maxBlank - moveBlankAfter;
+ }
+ } else if (movePos == oldSecondExpPos) {
+ if (movePos <= mFirstExpPos) {
+ adjust += moveBlankBefore - maxBlank;
+ } else if (movePos == mSecondExpPos) {
+ adjust += moveHeightBefore - moveHeightAfter;
+ } else {
+ adjust += moveBlankBefore;
+ }
+ } else {
+ if (movePos <= mFirstExpPos) {
+ adjust -= maxBlank;
+ } else if (movePos == mSecondExpPos) {
+ adjust -= moveBlankAfter;
+ }
+ }
+
+ return adjust;
+ }
+
+ private void measureItem(View item) {
+ ViewGroup.LayoutParams lp = item.getLayoutParams();
+ if (lp == null) {
+ lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ item.setLayoutParams(lp);
+ }
+ int wspec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec, getListPaddingLeft()
+ + getListPaddingRight(), lp.width);
+ int hspec;
+ if (lp.height > 0) {
+ hspec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY);
+ } else {
+ hspec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ }
+ item.measure(wspec, hspec);
+ }
+
+ private void measureFloatView() {
+ if (mFloatView != null) {
+ measureItem(mFloatView);
+ mFloatViewHeight = mFloatView.getMeasuredHeight();
+ mFloatViewHeightHalf = mFloatViewHeight / 2;
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ // Log.d("mobeta", "onMeasure called");
+ if (mFloatView != null) {
+ if (mFloatView.isLayoutRequested()) {
+ measureFloatView();
+ }
+ mFloatViewOnMeasured = true; // set to false after layout
+ }
+ mWidthMeasureSpec = widthMeasureSpec;
+ }
+
+ @Override
+ protected void layoutChildren() {
+ super.layoutChildren();
+
+ if (mFloatView != null) {
+ if (mFloatView.isLayoutRequested() && !mFloatViewOnMeasured) {
+ // Have to measure here when usual android measure
+ // pass is skipped. This happens during a drag-sort
+ // when layoutChildren is called directly.
+ measureFloatView();
+ }
+ mFloatView.layout(0, 0, mFloatView.getMeasuredWidth(), mFloatView.getMeasuredHeight());
+ mFloatViewOnMeasured = false;
+ }
+ }
+
+ protected boolean onDragTouchEvent(MotionEvent ev) {
+ // we are in a drag
+ int action = ev.getAction() & MotionEvent.ACTION_MASK;
+
+ switch (ev.getAction() & MotionEvent.ACTION_MASK) {
+ case MotionEvent.ACTION_CANCEL:
+ if (mDragState == DRAGGING) {
+ cancelDrag();
+ }
+ doActionUpOrCancel();
+ break;
+ case MotionEvent.ACTION_UP:
+ // Log.d("mobeta", "calling stopDrag from onDragTouchEvent");
+ if (mDragState == DRAGGING) {
+ stopDrag(false);
+ }
+ doActionUpOrCancel();
+ break;
+ case MotionEvent.ACTION_MOVE:
+ continueDrag((int) ev.getX(), (int) ev.getY());
+ break;
+ }
+
+ return true;
+ }
+
+ private boolean mFloatViewInvalidated = false;
+
+ private void invalidateFloatView() {
+ mFloatViewInvalidated = true;
+ }
+
+ /**
+ * Start a drag of item at position using the
+ * registered FloatViewManager. Calls through
+ * to {@link #startDrag(int,View,int,int,int)} after obtaining
+ * the floating View from the FloatViewManager.
+ *
+ * @param position Item to drag.
+ * @param dragFlags Flags that restrict some movements of the
+ * floating View. For example, set dragFlags |=
+ * ~{@link #DRAG_NEG_X} to allow dragging the floating
+ * View in all directions except off the screen to the left.
+ * @param deltaX Offset in x of the touch coordinate from the
+ * left edge of the floating View (i.e. touch-x minus float View
+ * left).
+ * @param deltaY Offset in y of the touch coordinate from the
+ * top edge of the floating View (i.e. touch-y minus float View
+ * top).
+ *
+ * @return True if the drag was started, false otherwise. This
+ * startDrag will fail if we are not currently in
+ * a touch event, there is no registered FloatViewManager,
+ * or the FloatViewManager returns a null View.
+ */
+ public boolean startDrag(int position, int dragFlags, int deltaX, int deltaY) {
+ if (!mInTouchEvent || mFloatViewManager == null) {
+ return false;
+ }
+
+ View v = mFloatViewManager.onCreateFloatView(position);
+
+ if (v == null) {
+ return false;
+ } else {
+ return startDrag(position, v, dragFlags, deltaX, deltaY);
+ }
+
+ }
+
+ /**
+ * Start a drag of item at position without using
+ * a FloatViewManager.
+ *
+ * @param position Item to drag.
+ * @param floatView Floating View.
+ * @param dragFlags Flags that restrict some movements of the
+ * floating View. For example, set dragFlags |=
+ * ~{@link #DRAG_NEG_X} to allow dragging the floating
+ * View in all directions except off the screen to the left.
+ * @param deltaX Offset in x of the touch coordinate from the
+ * left edge of the floating View (i.e. touch-x minus float View
+ * left).
+ * @param deltaY Offset in y of the touch coordinate from the
+ * top edge of the floating View (i.e. touch-y minus float View
+ * top).
+ *
+ * @return True if the drag was started, false otherwise. This
+ * startDrag will fail if we are not currently in
+ * a touch event, floatView is null, or there is
+ * a drag in progress.
+ */
+ public boolean startDrag(int position, View floatView, int dragFlags, int deltaX, int deltaY) {
+ if (mDragState != IDLE || !mInTouchEvent || mFloatView != null || floatView == null
+ || !mDragEnabled) {
+ return false;
+ }
+
+ if (getParent() != null) {
+ getParent().requestDisallowInterceptTouchEvent(true);
+ }
+
+ int pos = position + getHeaderViewsCount();
+ mFirstExpPos = pos;
+ mSecondExpPos = pos;
+ mSrcPos = pos;
+ mFloatPos = pos;
+
+ // mDragState = dragType;
+ mDragState = DRAGGING;
+ mDragFlags = 0;
+ mDragFlags |= dragFlags;
+
+ mFloatView = floatView;
+ measureFloatView(); // sets mFloatViewHeight
+
+ mDragDeltaX = deltaX;
+ mDragDeltaY = deltaY;
+ mDragStartY = mY;
+
+ // updateFloatView(mX - mDragDeltaX, mY - mDragDeltaY);
+ mFloatLoc.x = mX - mDragDeltaX;
+ mFloatLoc.y = mY - mDragDeltaY;
+
+ // set src item invisible
+ final View srcItem = getChildAt(mSrcPos - getFirstVisiblePosition());
+
+ if (srcItem != null) {
+ srcItem.setVisibility(View.INVISIBLE);
+ }
+
+ if (mTrackDragSort) {
+ mDragSortTracker.startTracking();
+ }
+
+ // once float view is created, events are no longer passed
+ // to ListView
+ switch (mCancelMethod) {
+ case ON_TOUCH_EVENT:
+ super.onTouchEvent(mCancelEvent);
+ break;
+ case ON_INTERCEPT_TOUCH_EVENT:
+ super.onInterceptTouchEvent(mCancelEvent);
+ break;
+ }
+
+ requestLayout();
+
+ if (mLiftAnimator != null) {
+ mLiftAnimator.start();
+ }
+
+ return true;
+ }
+
+ private void doDragFloatView(boolean forceInvalidate) {
+ int movePos = getFirstVisiblePosition() + getChildCount() / 2;
+ View moveItem = getChildAt(getChildCount() / 2);
+
+ if (moveItem == null) {
+ return;
+ }
+
+ doDragFloatView(movePos, moveItem, forceInvalidate);
+ }
+
+ private void doDragFloatView(int movePos, View moveItem, boolean forceInvalidate) {
+ mBlockLayoutRequests = true;
+
+ updateFloatView();
+
+ int oldFirstExpPos = mFirstExpPos;
+ int oldSecondExpPos = mSecondExpPos;
+
+ boolean updated = updatePositions();
+
+ if (updated) {
+ adjustAllItems();
+ int scroll = adjustScroll(movePos, moveItem, oldFirstExpPos, oldSecondExpPos);
+ // Log.d("mobeta", " adjust scroll="+scroll);
+
+ setSelectionFromTop(movePos, moveItem.getTop() + scroll - getPaddingTop());
+ layoutChildren();
+ }
+
+ if (updated || forceInvalidate) {
+ invalidate();
+ }
+
+ mBlockLayoutRequests = false;
+ }
+
+ /**
+ * Sets float View location based on suggested values and
+ * constraints set in mDragFlags.
+ */
+ private void updateFloatView() {
+
+ if (mFloatViewManager != null) {
+ mTouchLoc.set(mX, mY);
+ mFloatViewManager.onDragFloatView(mFloatView, mFloatLoc, mTouchLoc);
+ }
+
+ final int floatX = mFloatLoc.x;
+ final int floatY = mFloatLoc.y;
+
+ // restrict x motion
+ int padLeft = getPaddingLeft();
+ if ((mDragFlags & DRAG_POS_X) == 0 && floatX > padLeft) {
+ mFloatLoc.x = padLeft;
+ } else if ((mDragFlags & DRAG_NEG_X) == 0 && floatX < padLeft) {
+ mFloatLoc.x = padLeft;
+ }
+
+ // keep floating view from going past bottom of last header view
+ final int numHeaders = getHeaderViewsCount();
+ final int numFooters = getFooterViewsCount();
+ final int firstPos = getFirstVisiblePosition();
+ final int lastPos = getLastVisiblePosition();
+
+ // Log.d("mobeta",
+ // "nHead="+numHeaders+" nFoot="+numFooters+" first="+firstPos+" last="+lastPos);
+ int topLimit = getPaddingTop();
+ if (firstPos < numHeaders) {
+ topLimit = getChildAt(numHeaders - firstPos - 1).getBottom();
+ }
+ if ((mDragFlags & DRAG_NEG_Y) == 0) {
+ if (firstPos <= mSrcPos) {
+ topLimit = Math.max(getChildAt(mSrcPos - firstPos).getTop(), topLimit);
+ }
+ }
+ // bottom limit is top of first footer View or
+ // bottom of last item in list
+ int bottomLimit = getHeight() - getPaddingBottom();
+ if (lastPos >= getCount() - numFooters - 1) {
+ bottomLimit = getChildAt(getCount() - numFooters - 1 - firstPos).getBottom();
+ }
+ if ((mDragFlags & DRAG_POS_Y) == 0) {
+ if (lastPos >= mSrcPos) {
+ bottomLimit = Math.min(getChildAt(mSrcPos - firstPos).getBottom(), bottomLimit);
+ }
+ }
+
+ // Log.d("mobeta", "dragView top=" + (y - mDragDeltaY));
+ // Log.d("mobeta", "limit=" + limit);
+ // Log.d("mobeta", "mDragDeltaY=" + mDragDeltaY);
+
+ if (floatY < topLimit) {
+ mFloatLoc.y = topLimit;
+ } else if (floatY + mFloatViewHeight > bottomLimit) {
+ mFloatLoc.y = bottomLimit - mFloatViewHeight;
+ }
+
+ // get y-midpoint of floating view (constrained to ListView bounds)
+ mFloatViewMid = mFloatLoc.y + mFloatViewHeightHalf;
+ }
+
+ private void destroyFloatView() {
+ if (mFloatView != null) {
+ mFloatView.setVisibility(GONE);
+ if (mFloatViewManager != null) {
+ mFloatViewManager.onDestroyFloatView(mFloatView);
+ }
+ mFloatView = null;
+ invalidate();
+ }
+ }
+
+ /**
+ * Interface for customization of the floating View appearance
+ * and dragging behavior. Implement
+ * your own and pass it to {@link #setFloatViewManager}. If
+ * your own is not passed, the default {@link SimpleFloatViewManager}
+ * implementation is used.
+ */
+ public interface FloatViewManager {
+ /**
+ * Return the floating View for item at position.
+ * DragSortListView will measure and layout this View for you,
+ * so feel free to just inflate it. You can help DSLV by
+ * setting some {@link ViewGroup.LayoutParams} on this View;
+ * otherwise it will set some for you (with a width of FILL_PARENT
+ * and a height of WRAP_CONTENT).
+ *
+ * @param position Position of item to drag (NOTE:
+ * position excludes header Views; thus, if you
+ * want to call {@link ListView#getChildAt(int)}, you will need
+ * to add {@link ListView#getHeaderViewsCount()} to the index).
+ *
+ * @return The View you wish to display as the floating View.
+ */
+ public View onCreateFloatView(int position);
+
+ /**
+ * Called whenever the floating View is dragged. Float View
+ * properties can be changed here. Also, the upcoming location
+ * of the float View can be altered by setting
+ * location.x and location.y.
+ *
+ * @param floatView The floating View.
+ * @param location The location (top-left; relative to DSLV
+ * top-left) at which the float
+ * View would like to appear, given the current touch location
+ * and the offset provided in {@link DragSortListView#startDrag}.
+ * @param touch The current touch location (relative to DSLV
+ * top-left).
+ * @param pendingScroll
+ */
+ public void onDragFloatView(View floatView, Point location, Point touch);
+
+ /**
+ * Called when the float View is dropped; lets you perform
+ * any necessary cleanup. The internal DSLV floating View
+ * reference is set to null immediately after this is called.
+ *
+ * @param floatView The floating View passed to
+ * {@link #onCreateFloatView(int)}.
+ */
+ public void onDestroyFloatView(View floatView);
+ }
+
+ public void setFloatViewManager(FloatViewManager manager) {
+ mFloatViewManager = manager;
+ }
+
+ public void setDragListener(DragListener l) {
+ mDragListener = l;
+ }
+
+ /**
+ * Allows for easy toggling between a DragSortListView
+ * and a regular old ListView. If enabled, items are
+ * draggable, where the drag init mode determines how
+ * items are lifted (see {@link setDragInitMode(int)}).
+ * If disabled, items cannot be dragged.
+ *
+ * @param enabled Set true to enable list
+ * item dragging
+ */
+ public void setDragEnabled(boolean enabled) {
+ mDragEnabled = enabled;
+ }
+
+ public boolean isDragEnabled() {
+ return mDragEnabled;
+ }
+
+ /**
+ * This better reorder your ListAdapter! DragSortListView does not do this
+ * for you; doesn't make sense to. Make sure
+ * {@link BaseAdapter#notifyDataSetChanged()} or something like it is called
+ * in your implementation. Furthermore, if you have a choiceMode other than
+ * none and the ListAdapter does not return true for
+ * {@link ListAdapter#hasStableIds()}, you will need to call
+ * {@link #moveCheckState(int, int)} to move the check boxes along with the
+ * list items.
+ *
+ * @param l
+ */
+ public void setDropListener(DropListener l) {
+ mDropListener = l;
+ }
+
+ /**
+ * Probably a no-brainer, but make sure that your remove listener
+ * calls {@link BaseAdapter#notifyDataSetChanged()} or something like it.
+ * When an item removal occurs, DragSortListView
+ * relies on a redraw of all the items to recover invisible views
+ * and such. Strictly speaking, if you remove something, your dataset
+ * has changed...
+ *
+ * @param l
+ */
+ public void setRemoveListener(RemoveListener l) {
+ mRemoveListener = l;
+ }
+
+ public interface DragListener {
+ public void drag(int from, int to);
+ }
+
+ /**
+ * Your implementation of this has to reorder your ListAdapter!
+ * Make sure to call
+ * {@link BaseAdapter#notifyDataSetChanged()} or something like it
+ * in your implementation.
+ *
+ * @author heycosmo
+ *
+ */
+ public interface DropListener {
+ public void drop(int from, int to);
+ }
+
+ /**
+ * Make sure to call
+ * {@link BaseAdapter#notifyDataSetChanged()} or something like it
+ * in your implementation.
+ *
+ * @author heycosmo
+ *
+ */
+ public interface RemoveListener {
+ public void remove(int which);
+ }
+
+ public interface DragSortListener extends DropListener, DragListener, RemoveListener {
+ }
+
+ public void setDragSortListener(DragSortListener l) {
+ setDropListener(l);
+ setDragListener(l);
+ setRemoveListener(l);
+ }
+
+ /**
+ * Completely custom scroll speed profile. Default increases linearly
+ * with position and is constant in time. Create your own by implementing
+ * {@link DragSortListView.DragScrollProfile}.
+ *
+ * @param ssp
+ */
+ public void setDragScrollProfile(DragScrollProfile ssp) {
+ if (ssp != null) {
+ mScrollProfile = ssp;
+ }
+ }
+
+ /**
+ * Use this to move the check state of an item from one position to another
+ * in a drop operation. If you have a choiceMode which is not none, this
+ * method must be called when the order of items changes in an underlying
+ * adapter which does not have stable IDs (see
+ * {@link ListAdapter#hasStableIds()}). This is because without IDs, the
+ * ListView has no way of knowing which items have moved where, and cannot
+ * update the check state accordingly.
+ *
+ * A word of warning about a "feature" in Android that you may run into when
+ * dealing with movable list items: for an adapter that does have
+ * stable IDs, ListView will attempt to locate each item based on its ID and
+ * move the check state from the item's old position to the new position —
+ * which is all fine and good (and removes the need for calling this
+ * function), except for the half-baked approach. Apparently to save time in
+ * the naive algorithm used, ListView will only search for an ID in the
+ * close neighborhood of the old position. If the user moves an item too far
+ * (specifically, more than 20 rows away), ListView will give up and just
+ * force the item to be unchecked. So if there is a reasonable chance that
+ * the user will move items more than 20 rows away from the original
+ * position, you may wish to use an adapter with unstable IDs and call this
+ * method manually instead.
+ *
+ * @param from
+ * @param to
+ */
+ public void moveCheckState(int from, int to) {
+ // This method runs in O(n log n) time (n being the number of list
+ // items). The bottleneck is the call to AbsListView.setItemChecked,
+ // which is O(log n) because of the binary search involved in calling
+ // SparseBooleanArray.put().
+ //
+ // To improve on the average time, we minimize the number of calls to
+ // setItemChecked by only calling it for items that actually have a
+ // changed state. This is achieved by building a list containing the
+ // start and end of the "runs" of checked items, and then moving the
+ // runs. Note that moving an item from A to B is essentially a rotation
+ // of the range of items in [A, B]. Let's say we have
+ // . . U V X Y Z . .
+ // and move U after Z. This is equivalent to a rotation one step to the
+ // left within the range you are moving across:
+ // . . V X Y Z U . .
+ //
+ // So, to perform the move we enumerate all the runs within the move
+ // range, then rotate each run one step to the left or right (depending
+ // on move direction). For example, in the list:
+ // X X . X X X . X
+ // we have two runs. One begins at the last item of the list and wraps
+ // around to the beginning, ending at position 1. The second begins at
+ // position 3 and ends at position 5. To rotate a run, regardless of
+ // length, we only need to set a check mark at one end of the run, and
+ // clear a check mark at the other end:
+ // X . X X X . X X
+ SparseBooleanArray cip = getCheckedItemPositions();
+ int rangeStart = from;
+ int rangeEnd = to;
+ if (to < from) {
+ rangeStart = to;
+ rangeEnd = from;
+ }
+ rangeEnd += 1;
+
+ int[] runStart = new int[cip.size()];
+ int[] runEnd = new int[cip.size()];
+ int runCount = buildRunList(cip, rangeStart, rangeEnd, runStart, runEnd);
+ if (runCount == 1 && (runStart[0] == runEnd[0])) {
+ // Special case where all items are checked, we can never set any
+ // item to false like we do below.
+ return;
+ }
+
+ if (from < to) {
+ for (int i = 0; i != runCount; i++) {
+ setItemChecked(rotate(runStart[i], -1, rangeStart, rangeEnd), true);
+ setItemChecked(rotate(runEnd[i], -1, rangeStart, rangeEnd), false);
+ }
+
+ } else {
+ for (int i = 0; i != runCount; i++) {
+ setItemChecked(runStart[i], false);
+ setItemChecked(runEnd[i], true);
+ }
+ }
+ }
+
+ /**
+ * Use this when an item has been deleted, to move the check state of all
+ * following items up one step. If you have a choiceMode which is not none,
+ * this method must be called when the order of items changes in an
+ * underlying adapter which does not have stable IDs (see
+ * {@link ListAdapter#hasStableIds()}). This is because without IDs, the
+ * ListView has no way of knowing which items have moved where, and cannot
+ * update the check state accordingly.
+ *
+ * See also further comments on {@link #moveCheckState(int, int)}.
+ *
+ * @param position
+ */
+ public void removeCheckState(int position) {
+ SparseBooleanArray cip = getCheckedItemPositions();
+
+ if (cip.size() == 0)
+ return;
+ int[] runStart = new int[cip.size()];
+ int[] runEnd = new int[cip.size()];
+ int rangeStart = position;
+ int rangeEnd = cip.keyAt(cip.size() - 1) + 1;
+ int runCount = buildRunList(cip, rangeStart, rangeEnd, runStart, runEnd);
+ for (int i = 0; i != runCount; i++) {
+ if (!(runStart[i] == position || (runEnd[i] < runStart[i] && runEnd[i] > position))) {
+ // Only set a new check mark in front of this run if it does
+ // not contain the deleted position. If it does, we only need
+ // to make it one check mark shorter at the end.
+ setItemChecked(rotate(runStart[i], -1, rangeStart, rangeEnd), true);
+ }
+ setItemChecked(rotate(runEnd[i], -1, rangeStart, rangeEnd), false);
+ }
+ }
+
+ private static int buildRunList(SparseBooleanArray cip, int rangeStart,
+ int rangeEnd, int[] runStart, int[] runEnd) {
+ int runCount = 0;
+
+ int i = findFirstSetIndex(cip, rangeStart, rangeEnd);
+ if (i == -1)
+ return 0;
+
+ int position = cip.keyAt(i);
+ int currentRunStart = position;
+ int currentRunEnd = currentRunStart + 1;
+ for (i++; i < cip.size() && (position = cip.keyAt(i)) < rangeEnd; i++) {
+ if (!cip.valueAt(i)) // not checked => not interesting
+ continue;
+ if (position == currentRunEnd) {
+ currentRunEnd++;
+ } else {
+ runStart[runCount] = currentRunStart;
+ runEnd[runCount] = currentRunEnd;
+ runCount++;
+ currentRunStart = position;
+ currentRunEnd = position + 1;
+ }
+ }
+
+ if (currentRunEnd == rangeEnd) {
+ // rangeStart and rangeEnd are equivalent positions so to be
+ // consistent we translate them to the same integer value. That way
+ // we can check whether a run covers the entire range by just
+ // checking if the start equals the end position.
+ currentRunEnd = rangeStart;
+ }
+ runStart[runCount] = currentRunStart;
+ runEnd[runCount] = currentRunEnd;
+ runCount++;
+
+ if (runCount > 1) {
+ if (runStart[0] == rangeStart && runEnd[runCount - 1] == rangeStart) {
+ // The last run ends at the end of the range, and the first run
+ // starts at the beginning of the range. So they are actually
+ // part of the same run, except they wrap around the end of the
+ // range. To avoid adjacent runs, we need to merge them.
+ runStart[0] = runStart[runCount - 1];
+ runCount--;
+ }
+ }
+ return runCount;
+ }
+
+ private static int rotate(int value, int offset, int lowerBound, int upperBound) {
+ int windowSize = upperBound - lowerBound;
+
+ value += offset;
+ if (value < lowerBound) {
+ value += windowSize;
+ } else if (value >= upperBound) {
+ value -= windowSize;
+ }
+ return value;
+ }
+
+ private static int findFirstSetIndex(SparseBooleanArray sba, int rangeStart, int rangeEnd) {
+ int size = sba.size();
+ int i = insertionIndexForKey(sba, rangeStart);
+ while (i < size && sba.keyAt(i) < rangeEnd && !sba.valueAt(i))
+ i++;
+ if (i == size || sba.keyAt(i) >= rangeEnd)
+ return -1;
+ return i;
+ }
+
+ private static int insertionIndexForKey(SparseBooleanArray sba, int key) {
+ int low = 0;
+ int high = sba.size();
+ while (high - low > 0) {
+ int middle = (low + high) >> 1;
+ if (sba.keyAt(middle) < key)
+ low = middle + 1;
+ else
+ high = middle;
+ }
+ return low;
+ }
+
+ /**
+ * Interface for controlling
+ * scroll speed as a function of touch position and time. Use
+ * {@link DragSortListView#setDragScrollProfile(DragScrollProfile)} to
+ * set custom profile.
+ *
+ * @author heycosmo
+ *
+ */
+ public interface DragScrollProfile {
+ /**
+ * Return a scroll speed in pixels/millisecond. Always return a
+ * positive number.
+ *
+ * @param w Normalized position in scroll region (i.e. w \in [0,1]).
+ * Small w typically means slow scrolling.
+ * @param t Time (in milliseconds) since start of scroll (handy if you
+ * want scroll acceleration).
+ * @return Scroll speed at position w and time t in pixels/ms.
+ */
+ float getSpeed(float w, long t);
+ }
+
+ private class DragScroller implements Runnable {
+
+ private boolean mAbort;
+
+ private long mPrevTime;
+ private long mCurrTime;
+
+ private int dy;
+ private float dt;
+ private long tStart;
+ private int scrollDir;
+
+ public final static int STOP = -1;
+ public final static int UP = 0;
+ public final static int DOWN = 1;
+
+ private float mScrollSpeed; // pixels per ms
+
+ private boolean mScrolling = false;
+
+ private int mLastHeader;
+ private int mFirstFooter;
+
+ public boolean isScrolling() {
+ return mScrolling;
+ }
+
+ public int getScrollDir() {
+ return mScrolling ? scrollDir : STOP;
+ }
+
+ public DragScroller() {
+ }
+
+ public void startScrolling(int dir) {
+ if (!mScrolling) {
+ // Debug.startMethodTracing("dslv-scroll");
+ mAbort = false;
+ mScrolling = true;
+ tStart = SystemClock.uptimeMillis();
+ mPrevTime = tStart;
+ scrollDir = dir;
+ post(this);
+ }
+ }
+
+ public void stopScrolling(boolean now) {
+ if (now) {
+ DragSortListView.this.removeCallbacks(this);
+ mScrolling = false;
+ } else {
+ mAbort = true;
+ }
+
+ // Debug.stopMethodTracing();
+ }
+
+ @Override
+ public void run() {
+ if (mAbort) {
+ mScrolling = false;
+ return;
+ }
+
+ // Log.d("mobeta", "scroll");
+
+ final int first = getFirstVisiblePosition();
+ final int last = getLastVisiblePosition();
+ final int count = getCount();
+ final int padTop = getPaddingTop();
+ final int listHeight = getHeight() - padTop - getPaddingBottom();
+
+ int minY = Math.min(mY, mFloatViewMid + mFloatViewHeightHalf);
+ int maxY = Math.max(mY, mFloatViewMid - mFloatViewHeightHalf);
+
+ if (scrollDir == UP) {
+ View v = getChildAt(0);
+ // Log.d("mobeta", "vtop="+v.getTop()+" padtop="+padTop);
+ if (v == null) {
+ mScrolling = false;
+ return;
+ } else {
+ if (first == 0 && v.getTop() == padTop) {
+ mScrolling = false;
+ return;
+ }
+ }
+ mScrollSpeed = mScrollProfile.getSpeed((mUpScrollStartYF - maxY)
+ / mDragUpScrollHeight, mPrevTime);
+ } else {
+ View v = getChildAt(last - first);
+ if (v == null) {
+ mScrolling = false;
+ return;
+ } else {
+ if (last == count - 1 && v.getBottom() <= listHeight + padTop) {
+ mScrolling = false;
+ return;
+ }
+ }
+ mScrollSpeed = -mScrollProfile.getSpeed((minY - mDownScrollStartYF)
+ / mDragDownScrollHeight, mPrevTime);
+ }
+
+ mCurrTime = SystemClock.uptimeMillis();
+ dt = (float) (mCurrTime - mPrevTime);
+
+ // dy is change in View position of a list item; i.e. positive dy
+ // means user is scrolling up (list item moves down the screen,
+ // remember
+ // y=0 is at top of View).
+ dy = (int) Math.round(mScrollSpeed * dt);
+
+ int movePos;
+ if (dy >= 0) {
+ dy = Math.min(listHeight, dy);
+ movePos = first;
+ } else {
+ dy = Math.max(-listHeight, dy);
+ movePos = last;
+ }
+
+ final View moveItem = getChildAt(movePos - first);
+ int top = moveItem.getTop() + dy;
+
+ if (movePos == 0 && top > padTop) {
+ top = padTop;
+ }
+
+ // always do scroll
+ mBlockLayoutRequests = true;
+
+ setSelectionFromTop(movePos, top - padTop);
+ DragSortListView.this.layoutChildren();
+ invalidate();
+
+ mBlockLayoutRequests = false;
+
+ // scroll means relative float View movement
+ doDragFloatView(movePos, moveItem, false);
+
+ mPrevTime = mCurrTime;
+ // Log.d("mobeta", " updated prevTime="+mPrevTime);
+
+ post(this);
+ }
+ }
+
+ private class DragSortTracker {
+ StringBuilder mBuilder = new StringBuilder();
+
+ File mFile;
+
+ private int mNumInBuffer = 0;
+ private int mNumFlushes = 0;
+
+ private boolean mTracking = false;
+
+ public DragSortTracker() {
+ File root = Environment.getExternalStorageDirectory();
+ mFile = new File(root, "dslv_state.txt");
+
+ if (!mFile.exists()) {
+ try {
+ mFile.createNewFile();
+ Log.d("mobeta", "file created");
+ } catch (IOException e) {
+ Log.w("mobeta", "Could not create dslv_state.txt");
+ Log.d("mobeta", e.getMessage());
+ }
+ }
+
+ }
+
+ public void startTracking() {
+ mBuilder.append("\n");
+ mNumFlushes = 0;
+ mTracking = true;
+ }
+
+ public void appendState() {
+ if (!mTracking) {
+ return;
+ }
+
+ mBuilder.append("\n");
+ final int children = getChildCount();
+ final int first = getFirstVisiblePosition();
+ mBuilder.append(" ");
+ for (int i = 0; i < children; ++i) {
+ mBuilder.append(first + i).append(",");
+ }
+ mBuilder.append("\n");
+
+ mBuilder.append(" ");
+ for (int i = 0; i < children; ++i) {
+ mBuilder.append(getChildAt(i).getTop()).append(",");
+ }
+ mBuilder.append("\n");
+ mBuilder.append(" ");
+ for (int i = 0; i < children; ++i) {
+ mBuilder.append(getChildAt(i).getBottom()).append(",");
+ }
+ mBuilder.append("\n");
+
+ mBuilder.append(" ").append(mFirstExpPos).append("\n");
+ mBuilder.append(" ")
+ .append(getItemHeight(mFirstExpPos) - getChildHeight(mFirstExpPos))
+ .append("\n");
+ mBuilder.append(" ").append(mSecondExpPos).append("\n");
+ mBuilder.append(" ")
+ .append(getItemHeight(mSecondExpPos) - getChildHeight(mSecondExpPos))
+ .append("\n");
+ mBuilder.append(" ").append(mSrcPos).append("\n");
+ mBuilder.append(" ").append(mFloatViewHeight + getDividerHeight())
+ .append("\n");
+ mBuilder.append(" ").append(getHeight()).append("\n");
+ mBuilder.append(" ").append(mLastY).append("\n");
+ mBuilder.append(" ").append(mFloatViewMid).append("\n");
+ mBuilder.append(" ");
+ for (int i = 0; i < children; ++i) {
+ mBuilder.append(getShuffleEdge(first + i, getChildAt(i).getTop())).append(",");
+ }
+ mBuilder.append("\n");
+
+ mBuilder.append("\n");
+ mNumInBuffer++;
+
+ if (mNumInBuffer > 1000) {
+ flush();
+ mNumInBuffer = 0;
+ }
+ }
+
+ public void flush() {
+ if (!mTracking) {
+ return;
+ }
+
+ // save to file on sdcard
+ try {
+ boolean append = true;
+ if (mNumFlushes == 0) {
+ append = false;
+ }
+ FileWriter writer = new FileWriter(mFile, append);
+
+ writer.write(mBuilder.toString());
+ mBuilder.delete(0, mBuilder.length());
+
+ writer.flush();
+ writer.close();
+
+ mNumFlushes++;
+ } catch (IOException e) {
+ // do nothing
+ }
+ }
+
+ public void stopTracking() {
+ if (mTracking) {
+ mBuilder.append("\n");
+ flush();
+ mTracking = false;
+ }
+ }
+
+ }
+
+}
diff --git a/library/src/main/java/com/mobeta/android/dslv/ResourceDragSortCursorAdapter.java b/library/src/main/java/com/mobeta/android/dslv/ResourceDragSortCursorAdapter.java
new file mode 100644
index 00000000..f2d08107
--- /dev/null
+++ b/library/src/main/java/com/mobeta/android/dslv/ResourceDragSortCursorAdapter.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.mobeta.android.dslv;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.LayoutInflater;
+
+// taken from v4 rev. 10 ResourceCursorAdapter.java
+
+/**
+ * Static library support version of the framework's {@link android.widget.ResourceCursorAdapter}.
+ * Used to write apps that run on platforms prior to Android 3.0. When running
+ * on Android 3.0 or above, this implementation is still used; it does not try
+ * to switch to the framework's implementation. See the framework SDK
+ * documentation for a class overview.
+ */
+public abstract class ResourceDragSortCursorAdapter extends DragSortCursorAdapter {
+ private int mLayout;
+
+ private int mDropDownLayout;
+
+ private LayoutInflater mInflater;
+
+ /**
+ * Constructor the enables auto-requery.
+ *
+ * @deprecated This option is discouraged, as it results in Cursor queries
+ * being performed on the application's UI thread and thus can cause poor
+ * responsiveness or even Application Not Responding errors. As an alternative,
+ * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.
+ *
+ * @param context The context where the ListView associated with this adapter is running
+ * @param layout resource identifier of a layout file that defines the views
+ * for this list item. Unless you override them later, this will
+ * define both the item views and the drop down views.
+ */
+ @Deprecated
+ public ResourceDragSortCursorAdapter(Context context, int layout, Cursor c) {
+ super(context, c);
+ mLayout = mDropDownLayout = layout;
+ mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ }
+
+ /**
+ * Constructor with default behavior as per
+ * {@link CursorAdapter#CursorAdapter(Context, Cursor, boolean)}; it is recommended
+ * you not use this, but instead {@link #ResourceCursorAdapter(Context, int, Cursor, int)}.
+ * When using this constructor, {@link #FLAG_REGISTER_CONTENT_OBSERVER}
+ * will always be set.
+ *
+ * @param context The context where the ListView associated with this adapter is running
+ * @param layout resource identifier of a layout file that defines the views
+ * for this list item. Unless you override them later, this will
+ * define both the item views and the drop down views.
+ * @param c The cursor from which to get the data.
+ * @param autoRequery If true the adapter will call requery() on the
+ * cursor whenever it changes so the most recent
+ * data is always displayed. Using true here is discouraged.
+ */
+ public ResourceDragSortCursorAdapter(Context context, int layout, Cursor c, boolean autoRequery) {
+ super(context, c, autoRequery);
+ mLayout = mDropDownLayout = layout;
+ mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ }
+
+ /**
+ * Standard constructor.
+ *
+ * @param context The context where the ListView associated with this adapter is running
+ * @param layout Resource identifier of a layout file that defines the views
+ * for this list item. Unless you override them later, this will
+ * define both the item views and the drop down views.
+ * @param c The cursor from which to get the data.
+ * @param flags Flags used to determine the behavior of the adapter,
+ * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}.
+ */
+ public ResourceDragSortCursorAdapter(Context context, int layout, Cursor c, int flags) {
+ super(context, c, flags);
+ mLayout = mDropDownLayout = layout;
+ mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ }
+
+ /**
+ * Inflates view(s) from the specified XML file.
+ *
+ * @see android.widget.CursorAdapter#newView(android.content.Context,
+ * android.database.Cursor, ViewGroup)
+ */
+ @Override
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ return mInflater.inflate(mLayout, parent, false);
+ }
+
+ @Override
+ public View newDropDownView(Context context, Cursor cursor, ViewGroup parent) {
+ return mInflater.inflate(mDropDownLayout, parent, false);
+ }
+
+ /**
+ *
Sets the layout resource of the item views.
+ *
+ * @param layout the layout resources used to create item views
+ */
+ public void setViewResource(int layout) {
+ mLayout = layout;
+ }
+
+ /**
+ *
Sets the layout resource of the drop down views.
+ *
+ * @param dropDownLayout the layout resources used to create drop down views
+ */
+ public void setDropDownViewResource(int dropDownLayout) {
+ mDropDownLayout = dropDownLayout;
+ }
+}
diff --git a/library/src/main/java/com/mobeta/android/dslv/SimpleDragSortCursorAdapter.java b/library/src/main/java/com/mobeta/android/dslv/SimpleDragSortCursorAdapter.java
new file mode 100644
index 00000000..7a76ea9d
--- /dev/null
+++ b/library/src/main/java/com/mobeta/android/dslv/SimpleDragSortCursorAdapter.java
@@ -0,0 +1,422 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.mobeta.android.dslv;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.view.View;
+import android.widget.TextView;
+import android.widget.ImageView;
+
+// taken from sdk/sources/android-16/android/widget/SimpleCursorAdapter.java
+
+/**
+ * An easy adapter to map columns from a cursor to TextViews or ImageViews
+ * defined in an XML file. You can specify which columns you want, which
+ * views you want to display the columns, and the XML file that defines
+ * the appearance of these views.
+ *
+ * Binding occurs in two phases. First, if a
+ * {@link android.widget.SimpleCursorAdapter.ViewBinder} is available,
+ * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)}
+ * is invoked. If the returned value is true, binding has occured. If the
+ * returned value is false and the view to bind is a TextView,
+ * {@link #setViewText(TextView, String)} is invoked. If the returned value
+ * is false and the view to bind is an ImageView,
+ * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate
+ * binding can be found, an {@link IllegalStateException} is thrown.
+ *
+ * If this adapter is used with filtering, for instance in an
+ * {@link android.widget.AutoCompleteTextView}, you can use the
+ * {@link android.widget.SimpleCursorAdapter.CursorToStringConverter} and the
+ * {@link android.widget.FilterQueryProvider} interfaces
+ * to get control over the filtering process. You can refer to
+ * {@link #convertToString(android.database.Cursor)} and
+ * {@link #runQueryOnBackgroundThread(CharSequence)} for more information.
+ */
+public class SimpleDragSortCursorAdapter extends ResourceDragSortCursorAdapter {
+ /**
+ * A list of columns containing the data to bind to the UI.
+ * This field should be made private, so it is hidden from the SDK.
+ * {@hide}
+ */
+ protected int[] mFrom;
+ /**
+ * A list of View ids representing the views to which the data must be bound.
+ * This field should be made private, so it is hidden from the SDK.
+ * {@hide}
+ */
+ protected int[] mTo;
+
+ private int mStringConversionColumn = -1;
+ private CursorToStringConverter mCursorToStringConverter;
+ private ViewBinder mViewBinder;
+
+ String[] mOriginalFrom;
+
+ /**
+ * Constructor the enables auto-requery.
+ *
+ * @deprecated This option is discouraged, as it results in Cursor queries
+ * being performed on the application's UI thread and thus can cause poor
+ * responsiveness or even Application Not Responding errors. As an alternative,
+ * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.
+ */
+ @Deprecated
+ public SimpleDragSortCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
+ super(context, layout, c);
+ mTo = to;
+ mOriginalFrom = from;
+ findColumns(c, from);
+ }
+
+ /**
+ * Standard constructor.
+ *
+ * @param context The context where the ListView associated with this
+ * SimpleListItemFactory is running
+ * @param layout resource identifier of a layout file that defines the views
+ * for this list item. The layout file should include at least
+ * those named views defined in "to"
+ * @param c The database cursor. Can be null if the cursor is not available yet.
+ * @param from A list of column names representing the data to bind to the UI. Can be null
+ * if the cursor is not available yet.
+ * @param to The views that should display column in the "from" parameter.
+ * These should all be TextViews. The first N views in this list
+ * are given the values of the first N columns in the from
+ * parameter. Can be null if the cursor is not available yet.
+ * @param flags Flags used to determine the behavior of the adapter,
+ * as per {@link CursorAdapter#CursorAdapter(Context, Cursor, int)}.
+ */
+ public SimpleDragSortCursorAdapter(Context context, int layout,
+ Cursor c, String[] from, int[] to, int flags) {
+ super(context, layout, c, flags);
+ mTo = to;
+ mOriginalFrom = from;
+ findColumns(c, from);
+ }
+
+ /**
+ * Binds all of the field names passed into the "to" parameter of the
+ * constructor with their corresponding cursor columns as specified in the
+ * "from" parameter.
+ *
+ * Binding occurs in two phases. First, if a
+ * {@link android.widget.SimpleCursorAdapter.ViewBinder} is available,
+ * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)}
+ * is invoked. If the returned value is true, binding has occured. If the
+ * returned value is false and the view to bind is a TextView,
+ * {@link #setViewText(TextView, String)} is invoked. If the returned value is
+ * false and the view to bind is an ImageView,
+ * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate
+ * binding can be found, an {@link IllegalStateException} is thrown.
+ *
+ * @throws IllegalStateException if binding cannot occur
+ *
+ * @see android.widget.CursorAdapter#bindView(android.view.View,
+ * android.content.Context, android.database.Cursor)
+ * @see #getViewBinder()
+ * @see #setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder)
+ * @see #setViewImage(ImageView, String)
+ * @see #setViewText(TextView, String)
+ */
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ final ViewBinder binder = mViewBinder;
+ final int count = mTo.length;
+ final int[] from = mFrom;
+ final int[] to = mTo;
+
+ for (int i = 0; i < count; i++) {
+ final View v = view.findViewById(to[i]);
+ if (v != null) {
+ boolean bound = false;
+ if (binder != null) {
+ bound = binder.setViewValue(v, cursor, from[i]);
+ }
+
+ if (!bound) {
+ String text = cursor.getString(from[i]);
+ if (text == null) {
+ text = "";
+ }
+
+ if (v instanceof TextView) {
+ setViewText((TextView) v, text);
+ } else if (v instanceof ImageView) {
+ setViewImage((ImageView) v, text);
+ } else {
+ throw new IllegalStateException(v.getClass().getName() + " is not a " +
+ " view that can be bounds by this SimpleCursorAdapter");
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the {@link ViewBinder} used to bind data to views.
+ *
+ * @return a ViewBinder or null if the binder does not exist
+ *
+ * @see #bindView(android.view.View, android.content.Context, android.database.Cursor)
+ * @see #setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder)
+ */
+ public ViewBinder getViewBinder() {
+ return mViewBinder;
+ }
+
+ /**
+ * Sets the binder used to bind data to views.
+ *
+ * @param viewBinder the binder used to bind data to views, can be null to
+ * remove the existing binder
+ *
+ * @see #bindView(android.view.View, android.content.Context, android.database.Cursor)
+ * @see #getViewBinder()
+ */
+ public void setViewBinder(ViewBinder viewBinder) {
+ mViewBinder = viewBinder;
+ }
+
+ /**
+ * Called by bindView() to set the image for an ImageView but only if
+ * there is no existing ViewBinder or if the existing ViewBinder cannot
+ * handle binding to an ImageView.
+ *
+ * By default, the value will be treated as an image resource. If the
+ * value cannot be used as an image resource, the value is used as an
+ * image Uri.
+ *
+ * Intended to be overridden by Adapters that need to filter strings
+ * retrieved from the database.
+ *
+ * @param v ImageView to receive an image
+ * @param value the value retrieved from the cursor
+ */
+ public void setViewImage(ImageView v, String value) {
+ try {
+ v.setImageResource(Integer.parseInt(value));
+ } catch (NumberFormatException nfe) {
+ v.setImageURI(Uri.parse(value));
+ }
+ }
+
+ /**
+ * Called by bindView() to set the text for a TextView but only if
+ * there is no existing ViewBinder or if the existing ViewBinder cannot
+ * handle binding to a TextView.
+ *
+ * Intended to be overridden by Adapters that need to filter strings
+ * retrieved from the database.
+ *
+ * @param v TextView to receive text
+ * @param text the text to be set for the TextView
+ */
+ public void setViewText(TextView v, String text) {
+ v.setText(text);
+ }
+
+ /**
+ * Return the index of the column used to get a String representation
+ * of the Cursor.
+ *
+ * @return a valid index in the current Cursor or -1
+ *
+ * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)
+ * @see #setStringConversionColumn(int)
+ * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)
+ * @see #getCursorToStringConverter()
+ */
+ public int getStringConversionColumn() {
+ return mStringConversionColumn;
+ }
+
+ /**
+ * Defines the index of the column in the Cursor used to get a String
+ * representation of that Cursor. The column is used to convert the
+ * Cursor to a String only when the current CursorToStringConverter
+ * is null.
+ *
+ * @param stringConversionColumn a valid index in the current Cursor or -1 to use the default
+ * conversion mechanism
+ *
+ * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)
+ * @see #getStringConversionColumn()
+ * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)
+ * @see #getCursorToStringConverter()
+ */
+ public void setStringConversionColumn(int stringConversionColumn) {
+ mStringConversionColumn = stringConversionColumn;
+ }
+
+ /**
+ * Returns the converter used to convert the filtering Cursor
+ * into a String.
+ *
+ * @return null if the converter does not exist or an instance of
+ * {@link android.widget.SimpleCursorAdapter.CursorToStringConverter}
+ *
+ * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)
+ * @see #getStringConversionColumn()
+ * @see #setStringConversionColumn(int)
+ * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)
+ */
+ public CursorToStringConverter getCursorToStringConverter() {
+ return mCursorToStringConverter;
+ }
+
+ /**
+ * Sets the converter used to convert the filtering Cursor
+ * into a String.
+ *
+ * @param cursorToStringConverter the Cursor to String converter, or
+ * null to remove the converter
+ *
+ * @see #setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter)
+ * @see #getStringConversionColumn()
+ * @see #setStringConversionColumn(int)
+ * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)
+ */
+ public void setCursorToStringConverter(CursorToStringConverter cursorToStringConverter) {
+ mCursorToStringConverter = cursorToStringConverter;
+ }
+
+ /**
+ * Returns a CharSequence representation of the specified Cursor as defined
+ * by the current CursorToStringConverter. If no CursorToStringConverter
+ * has been set, the String conversion column is used instead. If the
+ * conversion column is -1, the returned String is empty if the cursor
+ * is null or Cursor.toString().
+ *
+ * @param cursor the Cursor to convert to a CharSequence
+ *
+ * @return a non-null CharSequence representing the cursor
+ */
+ @Override
+ public CharSequence convertToString(Cursor cursor) {
+ if (mCursorToStringConverter != null) {
+ return mCursorToStringConverter.convertToString(cursor);
+ } else if (mStringConversionColumn > -1) {
+ return cursor.getString(mStringConversionColumn);
+ }
+
+ return super.convertToString(cursor);
+ }
+
+ /**
+ * Create a map from an array of strings to an array of column-id integers in cursor c.
+ * If c is null, the array will be discarded.
+ *
+ * @param c the cursor to find the columns from
+ * @param from the Strings naming the columns of interest
+ */
+ private void findColumns(Cursor c, String[] from) {
+ if (c != null) {
+ int i;
+ int count = from.length;
+ if (mFrom == null || mFrom.length != count) {
+ mFrom = new int[count];
+ }
+ for (i = 0; i < count; i++) {
+ mFrom[i] = c.getColumnIndexOrThrow(from[i]);
+ }
+ } else {
+ mFrom = null;
+ }
+ }
+
+ @Override
+ public Cursor swapCursor(Cursor c) {
+ // super.swapCursor() will notify observers before we have
+ // a valid mapping, make sure we have a mapping before this
+ // happens
+ findColumns(c, mOriginalFrom);
+ return super.swapCursor(c);
+ }
+
+ /**
+ * Change the cursor and change the column-to-view mappings at the same time.
+ *
+ * @param c The database cursor. Can be null if the cursor is not available yet.
+ * @param from A list of column names representing the data to bind to the UI. Can be null
+ * if the cursor is not available yet.
+ * @param to The views that should display column in the "from" parameter.
+ * These should all be TextViews. The first N views in this list
+ * are given the values of the first N columns in the from
+ * parameter. Can be null if the cursor is not available yet.
+ */
+ public void changeCursorAndColumns(Cursor c, String[] from, int[] to) {
+ mOriginalFrom = from;
+ mTo = to;
+ // super.changeCursor() will notify observers before we have
+ // a valid mapping, make sure we have a mapping before this
+ // happens
+ findColumns(c, mOriginalFrom);
+ super.changeCursor(c);
+ }
+
+ /**
+ * This class can be used by external clients of SimpleCursorAdapter
+ * to bind values fom the Cursor to views.
+ *
+ * You should use this class to bind values from the Cursor to views
+ * that are not directly supported by SimpleCursorAdapter or to
+ * change the way binding occurs for views supported by
+ * SimpleCursorAdapter.
+ *
+ * @see SimpleCursorAdapter#bindView(android.view.View, android.content.Context, android.database.Cursor)
+ * @see SimpleCursorAdapter#setViewImage(ImageView, String)
+ * @see SimpleCursorAdapter#setViewText(TextView, String)
+ */
+ public static interface ViewBinder {
+ /**
+ * Binds the Cursor column defined by the specified index to the specified view.
+ *
+ * When binding is handled by this ViewBinder, this method must return true.
+ * If this method returns false, SimpleCursorAdapter will attempts to handle
+ * the binding on its own.
+ *
+ * @param view the view to bind the data to
+ * @param cursor the cursor to get the data from
+ * @param columnIndex the column at which the data can be found in the cursor
+ *
+ * @return true if the data was bound to the view, false otherwise
+ */
+ boolean setViewValue(View view, Cursor cursor, int columnIndex);
+ }
+
+ /**
+ * This class can be used by external clients of SimpleCursorAdapter
+ * to define how the Cursor should be converted to a String.
+ *
+ * @see android.widget.CursorAdapter#convertToString(android.database.Cursor)
+ */
+ public static interface CursorToStringConverter {
+ /**
+ * Returns a CharSequence representing the specified Cursor.
+ *
+ * @param cursor the cursor for which a CharSequence representation
+ * is requested
+ *
+ * @return a non-null CharSequence representing the cursor
+ */
+ CharSequence convertToString(Cursor cursor);
+ }
+
+}
diff --git a/library/src/main/java/com/mobeta/android/dslv/SimpleFloatViewManager.java b/library/src/main/java/com/mobeta/android/dslv/SimpleFloatViewManager.java
new file mode 100644
index 00000000..af1df01c
--- /dev/null
+++ b/library/src/main/java/com/mobeta/android/dslv/SimpleFloatViewManager.java
@@ -0,0 +1,89 @@
+package com.mobeta.android.dslv;
+
+import android.graphics.Bitmap;
+import android.graphics.Point;
+import android.graphics.Color;
+import android.widget.ListView;
+import android.widget.ImageView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.util.Log;
+
+/**
+ * Simple implementation of the FloatViewManager class. Uses list
+ * items as they appear in the ListView to create the floating View.
+ */
+public class SimpleFloatViewManager implements DragSortListView.FloatViewManager {
+
+ private Bitmap mFloatBitmap;
+
+ private ImageView mImageView;
+
+ private int mFloatBGColor = Color.BLACK;
+
+ private ListView mListView;
+
+ public SimpleFloatViewManager(ListView lv) {
+ mListView = lv;
+ }
+
+ public void setBackgroundColor(int color) {
+ mFloatBGColor = color;
+ }
+
+ /**
+ * This simple implementation creates a Bitmap copy of the
+ * list item currently shown at ListView position.
+ */
+ @Override
+ public View onCreateFloatView(int position) {
+ // Guaranteed that this will not be null? I think so. Nope, got
+ // a NullPointerException once...
+ View v = mListView.getChildAt(position + mListView.getHeaderViewsCount() - mListView.getFirstVisiblePosition());
+
+ if (v == null) {
+ return null;
+ }
+
+ v.setPressed(false);
+
+ // Create a copy of the drawing cache so that it does not get
+ // recycled by the framework when the list tries to clean up memory
+ //v.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
+ v.setDrawingCacheEnabled(true);
+ mFloatBitmap = Bitmap.createBitmap(v.getDrawingCache());
+ v.setDrawingCacheEnabled(false);
+
+ if (mImageView == null) {
+ mImageView = new ImageView(mListView.getContext());
+ }
+ mImageView.setBackgroundColor(mFloatBGColor);
+ mImageView.setPadding(0, 0, 0, 0);
+ mImageView.setImageBitmap(mFloatBitmap);
+ mImageView.setLayoutParams(new ViewGroup.LayoutParams(v.getWidth(), v.getHeight()));
+
+ return mImageView;
+ }
+
+ /**
+ * This does nothing
+ */
+ @Override
+ public void onDragFloatView(View floatView, Point position, Point touch) {
+ // do nothing
+ }
+
+ /**
+ * Removes the Bitmap from the ImageView created in
+ * onCreateFloatView() and tells the system to recycle it.
+ */
+ @Override
+ public void onDestroyFloatView(View floatView) {
+ ((ImageView) floatView).setImageDrawable(null);
+
+ mFloatBitmap.recycle();
+ mFloatBitmap = null;
+ }
+
+}
+
diff --git a/library/src/main/res/values/dslv_attrs.xml b/library/src/main/res/values/dslv_attrs.xml
new file mode 100644
index 00000000..6c4d5d79
--- /dev/null
+++ b/library/src/main/res/values/dslv_attrs.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lint.xml b/lint.xml
deleted file mode 100644
index ee0eead5..00000000
--- a/lint.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/local.properties b/local.properties
index e9d3f6e0..0ee343d8 100644
--- a/local.properties
+++ b/local.properties
@@ -1,11 +1,7 @@
-## This file is automatically generated by Android Studio.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must *NOT* be checked into Version Control Systems,
+## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
-# For customization when using a Version Control System, please read the
-# header note.
-#Fri Dec 20 10:17:44 MST 2013
-sdk.dir=C\:/Program Files (x86)/Android/android-studio/sdk
+#
+#Sun Jul 26 16:04:03 CEST 2015
+sdk.dir=/home/ogarcia/Android/Sdk
diff --git a/menudrawer.iml b/menudrawer.iml
deleted file mode 100644
index 8937b1bb..00000000
--- a/menudrawer.iml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- file://D:/Data/Android/adt-bundle-windows/sdk/tools/proguard/proguard-android.txt
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/proguard.cfg b/proguard.cfg
deleted file mode 100644
index a39ba33d..00000000
--- a/proguard.cfg
+++ /dev/null
@@ -1,49 +0,0 @@
--optimizationpasses 5
--dontpreverify
--keepattributes SourceFile,LineNumberTable
--optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
--allowaccessmodification
--dontusemixedcaseclassnames
--dontskipnonpubliclibraryclasses
--verbose
-
--dontwarn android.support.**
--dontnote android.support.**
-
--keepattributes *Annotation*
-
--keep public class * extends android.app.Activity
--keep public class * extends android.app.Application
--keep public class * extends android.app.Service
--keep public class * extends android.content.BroadcastReceiver
--keep public class * extends android.content.ContentProvider
--keep public class * extends android.app.backup.BackupAgentHelper
--keep public class * extends android.preference.Preference
--keep public class com.handmark.pulltorefresh.library.PullToRefreshBase$AnimationStyle
--keep public class com.handmark.pulltorefresh.library.PullToRefreshBase$Mode
-
--keepclasseswithmembernames class * {
- native ;
-}
-
--keepclassmembers class * extends android.app.Activity {
- public void *(android.view.View);
-}
-
--keepclassmembers enum * {
- public static **[] values();
- public static ** valueOf(java.lang.String);
-}
-
--keep class * implements android.os.Parcelable {
- public static final android.os.Parcelable$Creator *;
-}
-
--keepclassmembers public class * extends android.view.View {
- void set*(***);
- *** get*();
-}
-
--keepclassmembers class **.R$* {
- public static ;
-}
\ No newline at end of file
diff --git a/project.properties b/project.properties
deleted file mode 100644
index 926cf3ea..00000000
--- a/project.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-19
-android.library=false
-android.library.reference.1=menudrawer/menudrawer
-android.library.reference.2=pulltorefresh
-android.library.reference.3=drag-sort-listview/library
-
-
diff --git a/pulltorefresh.iml b/pulltorefresh.iml
deleted file mode 100644
index 2fe0024f..00000000
--- a/pulltorefresh.iml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- file://D:/Data/Android/adt-bundle-windows/sdk/tools/proguard/proguard-android.txt
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 00000000..8e18db6d
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,4 @@
+include ':library'
+include ':menudrawer'
+include ':pulltorefresh'
+include ':ultraSonic'
diff --git a/subsonic.keystore b/subsonic.keystore
deleted file mode 100644
index b6223fea..00000000
Binary files a/subsonic.keystore and /dev/null differ
diff --git a/ultraSonic/build.gradle b/ultraSonic/build.gradle
new file mode 100644
index 00000000..28788a0b
--- /dev/null
+++ b/ultraSonic/build.gradle
@@ -0,0 +1,25 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 22
+ buildToolsVersion "22.0.1"
+
+ defaultConfig {
+ applicationId "com.thejoshwa.ultrasonic.androidapp"
+ minSdkVersion 14
+ targetSdkVersion 22
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
+ }
+ }
+}
+
+dependencies {
+ compile project(':menudrawer')
+ compile project(':pulltorefresh')
+ compile project(':library')
+}
diff --git a/ultraSonic/lint.xml b/ultraSonic/lint.xml
new file mode 100644
index 00000000..8423c0ef
--- /dev/null
+++ b/ultraSonic/lint.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/AndroidManifest.xml b/ultraSonic/src/main/AndroidManifest.xml
similarity index 100%
rename from AndroidManifest.xml
rename to ultraSonic/src/main/AndroidManifest.xml
diff --git a/assets/html/en/index.html b/ultraSonic/src/main/assets/html/en/index.html
similarity index 100%
rename from assets/html/en/index.html
rename to ultraSonic/src/main/assets/html/en/index.html
diff --git a/assets/html/fr/index.html b/ultraSonic/src/main/assets/html/fr/index.html
similarity index 100%
rename from assets/html/fr/index.html
rename to ultraSonic/src/main/assets/html/fr/index.html
diff --git a/assets/html/img/paypal.png b/ultraSonic/src/main/assets/html/img/paypal.png
similarity index 100%
rename from assets/html/img/paypal.png
rename to ultraSonic/src/main/assets/html/img/paypal.png
diff --git a/assets/html/img/ultrasonic.png b/ultraSonic/src/main/assets/html/img/ultrasonic.png
similarity index 100%
rename from assets/html/img/ultrasonic.png
rename to ultraSonic/src/main/assets/html/img/ultrasonic.png
diff --git a/assets/html/style.css b/ultraSonic/src/main/assets/html/style.css
similarity index 100%
rename from assets/html/style.css
rename to ultraSonic/src/main/assets/html/style.css
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/BookmarkActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/BookmarkActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/BookmarkActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/BookmarkActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/ChatActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/ChatActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/ChatActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/ChatActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/DownloadActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/DownloadActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/DownloadActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/DownloadActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/EqualizerActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/EqualizerActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/EqualizerActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/EqualizerActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/HelpActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/HelpActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/HelpActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/HelpActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/LyricsActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/LyricsActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/LyricsActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/LyricsActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/MainActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/MainActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/MainActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/MainActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/PreferenceResultActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/PreferenceResultActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/PreferenceResultActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/PreferenceResultActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/QueryReceiverActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/QueryReceiverActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/QueryReceiverActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/QueryReceiverActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/ResultActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/ResultActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/ResultActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/ResultActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SearchActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SearchActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/SearchActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SearchActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectAlbumActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SelectAlbumActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/SelectAlbumActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SelectAlbumActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectArtistActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SelectArtistActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/SelectArtistActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SelectArtistActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectGenreActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SelectGenreActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/SelectGenreActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SelectGenreActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectPlaylistActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SelectPlaylistActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/SelectPlaylistActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SelectPlaylistActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SettingsActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SettingsActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/SettingsActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SettingsActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/ShareActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/ShareActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/ShareActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/ShareActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SubsonicTabActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SubsonicTabActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/SubsonicTabActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/SubsonicTabActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/VoiceQueryReceiverActivity.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/VoiceQueryReceiverActivity.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/activity/VoiceQueryReceiverActivity.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/activity/VoiceQueryReceiverActivity.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/audiofx/EqualizerController.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/audiofx/EqualizerController.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/audiofx/EqualizerController.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/audiofx/EqualizerController.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/audiofx/VisualizerController.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/audiofx/VisualizerController.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/audiofx/VisualizerController.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/audiofx/VisualizerController.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/Artist.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Artist.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/Artist.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Artist.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/Bookmark.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Bookmark.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/Bookmark.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Bookmark.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/ChatMessage.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/ChatMessage.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/ChatMessage.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/ChatMessage.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/Genre.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Genre.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/Genre.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Genre.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/Indexes.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Indexes.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/Indexes.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Indexes.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/JukeboxStatus.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/JukeboxStatus.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/JukeboxStatus.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/JukeboxStatus.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/Lyrics.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Lyrics.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/Lyrics.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Lyrics.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/MusicDirectory.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/MusicDirectory.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/MusicDirectory.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/MusicDirectory.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/MusicFolder.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/MusicFolder.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/MusicFolder.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/MusicFolder.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/PlayerState.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/PlayerState.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/PlayerState.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/PlayerState.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/Playlist.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Playlist.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/Playlist.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Playlist.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/RepeatMode.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/RepeatMode.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/RepeatMode.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/RepeatMode.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/SearchCriteria.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/SearchCriteria.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/SearchCriteria.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/SearchCriteria.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/SearchResult.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/SearchResult.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/SearchResult.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/SearchResult.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/ServerInfo.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/ServerInfo.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/ServerInfo.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/ServerInfo.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/Share.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Share.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/Share.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Share.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/UserInfo.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/UserInfo.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/UserInfo.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/UserInfo.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/Version.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Version.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/domain/Version.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/domain/Version.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/provider/SearchSuggestionProvider.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/provider/SearchSuggestionProvider.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/provider/SearchSuggestionProvider.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/provider/SearchSuggestionProvider.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x1.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x1.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x1.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x1.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x2.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x2.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x2.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x2.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x3.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x3.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x3.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x3.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x4.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x4.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x4.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider4x4.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/receiver/A2dpIntentReceiver.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/receiver/A2dpIntentReceiver.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/receiver/A2dpIntentReceiver.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/receiver/A2dpIntentReceiver.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/receiver/BluetoothIntentReceiver.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/receiver/BluetoothIntentReceiver.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/receiver/BluetoothIntentReceiver.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/receiver/BluetoothIntentReceiver.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/receiver/MediaButtonIntentReceiver.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/receiver/MediaButtonIntentReceiver.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/receiver/MediaButtonIntentReceiver.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/receiver/MediaButtonIntentReceiver.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/CachedMusicService.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/CachedMusicService.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/CachedMusicService.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/CachedMusicService.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/DownloadFile.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/DownloadFile.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/DownloadFile.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/DownloadFile.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/DownloadService.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/DownloadService.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/DownloadService.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/DownloadService.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/DownloadServiceImpl.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/DownloadServiceImpl.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/DownloadServiceImpl.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/DownloadServiceImpl.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/DownloadServiceLifecycleSupport.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/DownloadServiceLifecycleSupport.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/DownloadServiceLifecycleSupport.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/DownloadServiceLifecycleSupport.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/JukeboxService.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/JukeboxService.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/JukeboxService.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/JukeboxService.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/MediaStoreService.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/MediaStoreService.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/MediaStoreService.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/MediaStoreService.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/MusicService.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/MusicService.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/MusicService.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/MusicService.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/MusicServiceFactory.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/MusicServiceFactory.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/MusicServiceFactory.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/MusicServiceFactory.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/OfflineException.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/OfflineException.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/OfflineException.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/OfflineException.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/OfflineMusicService.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/OfflineMusicService.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/OfflineMusicService.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/OfflineMusicService.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/RESTMusicService.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/RESTMusicService.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/RESTMusicService.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/RESTMusicService.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/Scrobbler.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/Scrobbler.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/Scrobbler.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/Scrobbler.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/ServerTooOldException.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/ServerTooOldException.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/ServerTooOldException.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/ServerTooOldException.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/AbstractParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/AbstractParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/AbstractParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/AbstractParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/AlbumListParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/AlbumListParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/AlbumListParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/AlbumListParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/BookmarkParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/BookmarkParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/BookmarkParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/BookmarkParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/ChatMessageParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/ChatMessageParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/ChatMessageParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/ChatMessageParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/ErrorParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/ErrorParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/ErrorParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/ErrorParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/GenreParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/GenreParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/GenreParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/GenreParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/IndexesParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/IndexesParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/IndexesParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/IndexesParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/JukeboxStatusParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/JukeboxStatusParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/JukeboxStatusParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/JukeboxStatusParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/LicenseParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/LicenseParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/LicenseParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/LicenseParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/LyricsParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/LyricsParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/LyricsParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/LyricsParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/MusicDirectoryEntryParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/MusicDirectoryEntryParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/MusicDirectoryEntryParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/MusicDirectoryEntryParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/MusicDirectoryParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/MusicDirectoryParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/MusicDirectoryParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/MusicDirectoryParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/MusicFoldersParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/MusicFoldersParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/MusicFoldersParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/MusicFoldersParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/PlaylistParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/PlaylistParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/PlaylistParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/PlaylistParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/PlaylistsParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/PlaylistsParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/PlaylistsParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/PlaylistsParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/RandomSongsParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/RandomSongsParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/RandomSongsParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/RandomSongsParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/SearchResult2Parser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/SearchResult2Parser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/SearchResult2Parser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/SearchResult2Parser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/SearchResultParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/SearchResultParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/SearchResultParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/SearchResultParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/ShareParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/ShareParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/ShareParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/ShareParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/SubsonicRESTException.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/SubsonicRESTException.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/SubsonicRESTException.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/SubsonicRESTException.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/UserInfoParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/UserInfoParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/UserInfoParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/UserInfoParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/parser/VersionParser.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/VersionParser.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/parser/VersionParser.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/parser/VersionParser.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/ssl/SSLSocketFactory.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/ssl/SSLSocketFactory.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/ssl/SSLSocketFactory.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/ssl/SSLSocketFactory.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/ssl/TrustManagerDecorator.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/ssl/TrustManagerDecorator.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/ssl/TrustManagerDecorator.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/ssl/TrustManagerDecorator.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/ssl/TrustSelfSignedStrategy.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/ssl/TrustSelfSignedStrategy.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/ssl/TrustSelfSignedStrategy.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/ssl/TrustSelfSignedStrategy.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/ssl/TrustStrategy.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/ssl/TrustStrategy.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/service/ssl/TrustStrategy.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/service/ssl/TrustStrategy.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/AlbumHeader.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/AlbumHeader.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/AlbumHeader.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/AlbumHeader.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/BackgroundTask.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/BackgroundTask.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/BackgroundTask.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/BackgroundTask.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/CacheCleaner.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/CacheCleaner.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/CacheCleaner.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/CacheCleaner.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/CancellableTask.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/CancellableTask.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/CancellableTask.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/CancellableTask.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/Constants.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/Constants.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/Constants.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/Constants.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/EntryByDiscAndTrackComparator.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/EntryByDiscAndTrackComparator.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/EntryByDiscAndTrackComparator.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/EntryByDiscAndTrackComparator.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/ErrorDialog.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/ErrorDialog.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/ErrorDialog.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/ErrorDialog.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/FileUtil.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/FileUtil.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/FileUtil.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/FileUtil.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/ImageLoader.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/ImageLoader.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/ImageLoader.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/ImageLoader.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/LRUCache.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/LRUCache.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/LRUCache.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/LRUCache.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/LoadingTask.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/LoadingTask.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/LoadingTask.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/LoadingTask.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/MergeAdapter.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/MergeAdapter.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/MergeAdapter.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/MergeAdapter.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/ModalBackgroundTask.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/ModalBackgroundTask.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/ModalBackgroundTask.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/ModalBackgroundTask.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/MyViewFlipper.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/MyViewFlipper.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/MyViewFlipper.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/MyViewFlipper.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/Pair.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/Pair.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/Pair.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/Pair.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/ProgressListener.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/ProgressListener.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/ProgressListener.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/ProgressListener.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/SackOfViewsAdapter.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/SackOfViewsAdapter.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/SackOfViewsAdapter.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/SackOfViewsAdapter.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/ShareDetails.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/ShareDetails.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/ShareDetails.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/ShareDetails.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/ShufflePlayBuffer.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/ShufflePlayBuffer.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/ShufflePlayBuffer.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/ShufflePlayBuffer.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/SilentBackgroundTask.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/SilentBackgroundTask.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/SilentBackgroundTask.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/SilentBackgroundTask.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/SimpleServiceBinder.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/SimpleServiceBinder.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/SimpleServiceBinder.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/SimpleServiceBinder.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/StreamProxy.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/StreamProxy.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/StreamProxy.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/StreamProxy.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/TabActivityBackgroundTask.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/TabActivityBackgroundTask.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/TabActivityBackgroundTask.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/TabActivityBackgroundTask.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/TimeLimitedCache.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/TimeLimitedCache.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/TimeLimitedCache.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/TimeLimitedCache.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpan.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/TimeSpan.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpan.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/TimeSpan.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPicker.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPicker.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPicker.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPicker.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPreference.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPreference.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPreference.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPreference.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/Util.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/Util.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/Util.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/Util.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/VideoPlayerType.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/VideoPlayerType.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/util/VideoPlayerType.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/util/VideoPlayerType.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/AlbumView.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/AlbumView.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/AlbumView.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/AlbumView.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/ArtistAdapter.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/ArtistAdapter.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/ArtistAdapter.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/ArtistAdapter.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/AutoRepeatButton.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/AutoRepeatButton.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/AutoRepeatButton.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/AutoRepeatButton.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/ChatAdapter.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/ChatAdapter.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/ChatAdapter.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/ChatAdapter.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/EntryAdapter.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/EntryAdapter.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/EntryAdapter.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/EntryAdapter.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/GenreAdapter.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/GenreAdapter.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/GenreAdapter.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/GenreAdapter.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/PlaylistAdapter.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/PlaylistAdapter.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/PlaylistAdapter.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/PlaylistAdapter.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/PlaylistView.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/PlaylistView.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/PlaylistView.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/PlaylistView.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/ShareAdapter.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/ShareAdapter.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/ShareAdapter.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/ShareAdapter.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/ShareView.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/ShareView.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/ShareView.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/ShareView.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/SongListAdapter.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/SongListAdapter.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/SongListAdapter.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/SongListAdapter.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/SongView.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/SongView.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/SongView.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/SongView.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/UpdateView.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/UpdateView.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/UpdateView.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/UpdateView.java
diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/VisualizerView.java b/ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/VisualizerView.java
similarity index 100%
rename from src/com/thejoshwa/ultrasonic/androidapp/view/VisualizerView.java
rename to ultraSonic/src/main/java/com/thejoshwa/ultrasonic/androidapp/view/VisualizerView.java
diff --git a/res/anim/push_down_in.xml b/ultraSonic/src/main/res/anim/push_down_in.xml
similarity index 100%
rename from res/anim/push_down_in.xml
rename to ultraSonic/src/main/res/anim/push_down_in.xml
diff --git a/res/anim/push_down_out.xml b/ultraSonic/src/main/res/anim/push_down_out.xml
similarity index 100%
rename from res/anim/push_down_out.xml
rename to ultraSonic/src/main/res/anim/push_down_out.xml
diff --git a/res/anim/push_up_in.xml b/ultraSonic/src/main/res/anim/push_up_in.xml
similarity index 100%
rename from res/anim/push_up_in.xml
rename to ultraSonic/src/main/res/anim/push_up_in.xml
diff --git a/res/anim/push_up_out.xml b/ultraSonic/src/main/res/anim/push_up_out.xml
similarity index 100%
rename from res/anim/push_up_out.xml
rename to ultraSonic/src/main/res/anim/push_up_out.xml
diff --git a/res/drawable-hdpi-v11/ic_stat_ultrasonic.png b/ultraSonic/src/main/res/drawable-hdpi-v11/ic_stat_ultrasonic.png
similarity index 100%
rename from res/drawable-hdpi-v11/ic_stat_ultrasonic.png
rename to ultraSonic/src/main/res/drawable-hdpi-v11/ic_stat_ultrasonic.png
diff --git a/res/drawable-hdpi-v14/menu_arrow.png b/ultraSonic/src/main/res/drawable-hdpi-v14/menu_arrow.png
similarity index 100%
rename from res/drawable-hdpi-v14/menu_arrow.png
rename to ultraSonic/src/main/res/drawable-hdpi-v14/menu_arrow.png
diff --git a/res/drawable-hdpi-v9/ic_stat_ultrasonic.png b/ultraSonic/src/main/res/drawable-hdpi-v9/ic_stat_ultrasonic.png
similarity index 100%
rename from res/drawable-hdpi-v9/ic_stat_ultrasonic.png
rename to ultraSonic/src/main/res/drawable-hdpi-v9/ic_stat_ultrasonic.png
diff --git a/res/drawable-hdpi/btn_check_off_focused_holo_dark.png b/ultraSonic/src/main/res/drawable-hdpi/btn_check_off_focused_holo_dark.png
similarity index 100%
rename from res/drawable-hdpi/btn_check_off_focused_holo_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/btn_check_off_focused_holo_dark.png
diff --git a/res/drawable-hdpi/btn_check_off_focused_holo_light.png b/ultraSonic/src/main/res/drawable-hdpi/btn_check_off_focused_holo_light.png
similarity index 100%
rename from res/drawable-hdpi/btn_check_off_focused_holo_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/btn_check_off_focused_holo_light.png
diff --git a/res/drawable-hdpi/btn_check_off_holo_dark.png b/ultraSonic/src/main/res/drawable-hdpi/btn_check_off_holo_dark.png
similarity index 100%
rename from res/drawable-hdpi/btn_check_off_holo_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/btn_check_off_holo_dark.png
diff --git a/res/drawable-hdpi/btn_check_off_holo_light.png b/ultraSonic/src/main/res/drawable-hdpi/btn_check_off_holo_light.png
similarity index 100%
rename from res/drawable-hdpi/btn_check_off_holo_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/btn_check_off_holo_light.png
diff --git a/res/drawable-hdpi/btn_check_on_focused_holo_dark.png b/ultraSonic/src/main/res/drawable-hdpi/btn_check_on_focused_holo_dark.png
similarity index 100%
rename from res/drawable-hdpi/btn_check_on_focused_holo_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/btn_check_on_focused_holo_dark.png
diff --git a/res/drawable-hdpi/btn_check_on_focused_holo_light.png b/ultraSonic/src/main/res/drawable-hdpi/btn_check_on_focused_holo_light.png
similarity index 100%
rename from res/drawable-hdpi/btn_check_on_focused_holo_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/btn_check_on_focused_holo_light.png
diff --git a/res/drawable-hdpi/btn_check_on_holo_dark.png b/ultraSonic/src/main/res/drawable-hdpi/btn_check_on_holo_dark.png
similarity index 100%
rename from res/drawable-hdpi/btn_check_on_holo_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/btn_check_on_holo_dark.png
diff --git a/res/drawable-hdpi/btn_check_on_holo_light.png b/ultraSonic/src/main/res/drawable-hdpi/btn_check_on_holo_light.png
similarity index 100%
rename from res/drawable-hdpi/btn_check_on_holo_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/btn_check_on_holo_light.png
diff --git a/res/drawable-hdpi/ic_drag_queue.9.png b/ultraSonic/src/main/res/drawable-hdpi/ic_drag_queue.png
similarity index 100%
rename from res/drawable-hdpi/ic_drag_queue.9.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_drag_queue.png
diff --git a/res/drawable-hdpi/ic_launcher.png b/ultraSonic/src/main/res/drawable-hdpi/ic_launcher.png
similarity index 100%
rename from res/drawable-hdpi/ic_launcher.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_launcher.png
diff --git a/res/drawable-hdpi/ic_menu_about_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_about_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_about_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_about_dark.png
diff --git a/res/drawable-hdpi/ic_menu_about_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_about_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_about_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_about_light.png
diff --git a/res/drawable-hdpi/ic_menu_add_to_queue_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_add_to_queue_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_add_to_queue_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_add_to_queue_dark.png
diff --git a/res/drawable-hdpi/ic_menu_add_to_queue_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_add_to_queue_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_add_to_queue_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_add_to_queue_light.png
diff --git a/res/drawable-hdpi/ic_menu_backward_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_backward_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_backward_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_backward_dark.png
diff --git a/res/drawable-hdpi/ic_menu_backward_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_backward_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_backward_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_backward_light.png
diff --git a/res/drawable-hdpi/ic_menu_bookmark_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_bookmark_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_bookmark_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_bookmark_dark.png
diff --git a/res/drawable-hdpi/ic_menu_bookmark_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_bookmark_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_bookmark_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_bookmark_light.png
diff --git a/res/drawable-hdpi/ic_menu_browse_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_browse_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_browse_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_browse_dark.png
diff --git a/res/drawable-hdpi/ic_menu_browse_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_browse_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_browse_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_browse_light.png
diff --git a/res/drawable-hdpi/ic_menu_chat_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_chat_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_chat_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_chat_dark.png
diff --git a/res/drawable-hdpi/ic_menu_chat_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_chat_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_chat_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_chat_light.png
diff --git a/res/drawable-hdpi/ic_menu_chat_send_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_chat_send_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_chat_send_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_chat_send_dark.png
diff --git a/res/drawable-hdpi/ic_menu_chat_send_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_chat_send_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_chat_send_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_chat_send_light.png
diff --git a/res/drawable-hdpi/ic_menu_exit_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_exit_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_exit_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_exit_dark.png
diff --git a/res/drawable-hdpi/ic_menu_exit_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_exit_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_exit_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_exit_light.png
diff --git a/res/drawable-hdpi/ic_menu_forward_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_forward_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_forward_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_forward_dark.png
diff --git a/res/drawable-hdpi/ic_menu_forward_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_forward_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_forward_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_forward_light.png
diff --git a/res/drawable-hdpi/ic_menu_help_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_help_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_help_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_help_dark.png
diff --git a/res/drawable-hdpi/ic_menu_help_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_help_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_help_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_help_light.png
diff --git a/res/drawable-hdpi/ic_menu_home_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_home_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_home_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_home_dark.png
diff --git a/res/drawable-hdpi/ic_menu_home_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_home_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_home_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_home_light.png
diff --git a/res/drawable-hdpi/ic_menu_playlists_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_playlists_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_playlists_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_playlists_dark.png
diff --git a/res/drawable-hdpi/ic_menu_playlists_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_playlists_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_playlists_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_playlists_light.png
diff --git a/res/drawable-hdpi/ic_menu_remove_all_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_remove_all_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_remove_all_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_remove_all_dark.png
diff --git a/res/drawable-hdpi/ic_menu_remove_all_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_remove_all_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_remove_all_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_remove_all_light.png
diff --git a/res/drawable-hdpi/ic_menu_save_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_save_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_save_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_save_dark.png
diff --git a/res/drawable-hdpi/ic_menu_save_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_save_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_save_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_save_light.png
diff --git a/res/drawable-hdpi/ic_menu_screen_on_off_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_screen_on_off_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_screen_on_off_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_screen_on_off_dark.png
diff --git a/res/drawable-hdpi/ic_menu_screen_on_off_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_screen_on_off_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_screen_on_off_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_screen_on_off_light.png
diff --git a/res/drawable-hdpi/ic_menu_search_holo_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_search_holo_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_search_holo_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_search_holo_dark.png
diff --git a/res/drawable-hdpi/ic_menu_search_holo_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_search_holo_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_search_holo_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_search_holo_light.png
diff --git a/res/drawable-hdpi/ic_menu_select_all_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_select_all_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_select_all_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_select_all_dark.png
diff --git a/res/drawable-hdpi/ic_menu_select_all_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_select_all_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_select_all_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_select_all_light.png
diff --git a/res/drawable-hdpi/ic_menu_select_folder_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_select_folder_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_select_folder_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_select_folder_dark.png
diff --git a/res/drawable-hdpi/ic_menu_select_folder_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_select_folder_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_select_folder_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_select_folder_light.png
diff --git a/res/drawable-hdpi/ic_menu_settings_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_settings_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_settings_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_settings_dark.png
diff --git a/res/drawable-hdpi/ic_menu_settings_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_settings_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_settings_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_settings_light.png
diff --git a/res/drawable-hdpi/ic_menu_share_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_share_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_share_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_share_dark.png
diff --git a/res/drawable-hdpi/ic_menu_share_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_share_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_share_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_share_light.png
diff --git a/res/drawable-hdpi/ic_menu_unpin_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_unpin_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_unpin_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_unpin_dark.png
diff --git a/res/drawable-hdpi/ic_menu_unpin_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_menu_unpin_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_menu_unpin_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_menu_unpin_light.png
diff --git a/res/drawable-hdpi/ic_star_full_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_star_full_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_star_full_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_star_full_dark.png
diff --git a/res/drawable-hdpi/ic_star_full_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_star_full_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_star_full_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_star_full_light.png
diff --git a/res/drawable-hdpi/ic_star_hollow_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_star_hollow_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_star_hollow_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_star_hollow_dark.png
diff --git a/res/drawable-hdpi/ic_star_hollow_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_star_hollow_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_star_hollow_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_star_hollow_light.png
diff --git a/res/drawable-hdpi/ic_stat_play_dark.png b/ultraSonic/src/main/res/drawable-hdpi/ic_stat_play_dark.png
similarity index 100%
rename from res/drawable-hdpi/ic_stat_play_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_stat_play_dark.png
diff --git a/res/drawable-hdpi/ic_stat_play_light.png b/ultraSonic/src/main/res/drawable-hdpi/ic_stat_play_light.png
similarity index 100%
rename from res/drawable-hdpi/ic_stat_play_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_stat_play_light.png
diff --git a/res/drawable-hdpi/ic_stat_ultrasonic.png b/ultraSonic/src/main/res/drawable-hdpi/ic_stat_ultrasonic.png
similarity index 100%
rename from res/drawable-hdpi/ic_stat_ultrasonic.png
rename to ultraSonic/src/main/res/drawable-hdpi/ic_stat_ultrasonic.png
diff --git a/res/drawable-hdpi/list_focused_holo.9.png b/ultraSonic/src/main/res/drawable-hdpi/list_focused_holo.9.png
similarity index 100%
rename from res/drawable-hdpi/list_focused_holo.9.png
rename to ultraSonic/src/main/res/drawable-hdpi/list_focused_holo.9.png
diff --git a/res/drawable-hdpi/list_longpressed_holo.9.png b/ultraSonic/src/main/res/drawable-hdpi/list_longpressed_holo.9.png
similarity index 100%
rename from res/drawable-hdpi/list_longpressed_holo.9.png
rename to ultraSonic/src/main/res/drawable-hdpi/list_longpressed_holo.9.png
diff --git a/res/drawable-hdpi/list_pressed_holo_dark.9.png b/ultraSonic/src/main/res/drawable-hdpi/list_pressed_holo_dark.9.png
similarity index 100%
rename from res/drawable-hdpi/list_pressed_holo_dark.9.png
rename to ultraSonic/src/main/res/drawable-hdpi/list_pressed_holo_dark.9.png
diff --git a/res/drawable-hdpi/list_pressed_holo_light.9.png b/ultraSonic/src/main/res/drawable-hdpi/list_pressed_holo_light.9.png
similarity index 100%
rename from res/drawable-hdpi/list_pressed_holo_light.9.png
rename to ultraSonic/src/main/res/drawable-hdpi/list_pressed_holo_light.9.png
diff --git a/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png b/ultraSonic/src/main/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png
similarity index 100%
rename from res/drawable-hdpi/list_selector_disabled_holo_dark.9.png
rename to ultraSonic/src/main/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png
diff --git a/res/drawable-hdpi/list_selector_disabled_holo_light.9.png b/ultraSonic/src/main/res/drawable-hdpi/list_selector_disabled_holo_light.9.png
similarity index 100%
rename from res/drawable-hdpi/list_selector_disabled_holo_light.9.png
rename to ultraSonic/src/main/res/drawable-hdpi/list_selector_disabled_holo_light.9.png
diff --git a/res/drawable-hdpi/media_backward_normal_dark.png b/ultraSonic/src/main/res/drawable-hdpi/media_backward_normal_dark.png
similarity index 100%
rename from res/drawable-hdpi/media_backward_normal_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_backward_normal_dark.png
diff --git a/res/drawable-hdpi/media_backward_normal_light.png b/ultraSonic/src/main/res/drawable-hdpi/media_backward_normal_light.png
similarity index 100%
rename from res/drawable-hdpi/media_backward_normal_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_backward_normal_light.png
diff --git a/res/drawable-hdpi/media_forward_normal_dark.png b/ultraSonic/src/main/res/drawable-hdpi/media_forward_normal_dark.png
similarity index 100%
rename from res/drawable-hdpi/media_forward_normal_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_forward_normal_dark.png
diff --git a/res/drawable-hdpi/media_forward_normal_light.png b/ultraSonic/src/main/res/drawable-hdpi/media_forward_normal_light.png
similarity index 100%
rename from res/drawable-hdpi/media_forward_normal_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_forward_normal_light.png
diff --git a/res/drawable-hdpi/media_pause_normal_dark.png b/ultraSonic/src/main/res/drawable-hdpi/media_pause_normal_dark.png
similarity index 100%
rename from res/drawable-hdpi/media_pause_normal_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_pause_normal_dark.png
diff --git a/res/drawable-hdpi/media_pause_normal_light.png b/ultraSonic/src/main/res/drawable-hdpi/media_pause_normal_light.png
similarity index 100%
rename from res/drawable-hdpi/media_pause_normal_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_pause_normal_light.png
diff --git a/res/drawable-hdpi/media_repeat_all.png b/ultraSonic/src/main/res/drawable-hdpi/media_repeat_all.png
similarity index 100%
rename from res/drawable-hdpi/media_repeat_all.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_repeat_all.png
diff --git a/res/drawable-hdpi/media_repeat_off_dark.png b/ultraSonic/src/main/res/drawable-hdpi/media_repeat_off_dark.png
similarity index 100%
rename from res/drawable-hdpi/media_repeat_off_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_repeat_off_dark.png
diff --git a/res/drawable-hdpi/media_repeat_off_light.png b/ultraSonic/src/main/res/drawable-hdpi/media_repeat_off_light.png
similarity index 100%
rename from res/drawable-hdpi/media_repeat_off_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_repeat_off_light.png
diff --git a/res/drawable-hdpi/media_shuffle_normal_dark.png b/ultraSonic/src/main/res/drawable-hdpi/media_shuffle_normal_dark.png
similarity index 100%
rename from res/drawable-hdpi/media_shuffle_normal_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_shuffle_normal_dark.png
diff --git a/res/drawable-hdpi/media_shuffle_normal_light.png b/ultraSonic/src/main/res/drawable-hdpi/media_shuffle_normal_light.png
similarity index 100%
rename from res/drawable-hdpi/media_shuffle_normal_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_shuffle_normal_light.png
diff --git a/res/drawable-hdpi/media_start_normal_dark.png b/ultraSonic/src/main/res/drawable-hdpi/media_start_normal_dark.png
similarity index 100%
rename from res/drawable-hdpi/media_start_normal_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_start_normal_dark.png
diff --git a/res/drawable-hdpi/media_start_normal_light.png b/ultraSonic/src/main/res/drawable-hdpi/media_start_normal_light.png
similarity index 100%
rename from res/drawable-hdpi/media_start_normal_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_start_normal_light.png
diff --git a/res/drawable-hdpi/media_stop_normal_dark.png b/ultraSonic/src/main/res/drawable-hdpi/media_stop_normal_dark.png
similarity index 100%
rename from res/drawable-hdpi/media_stop_normal_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_stop_normal_dark.png
diff --git a/res/drawable-hdpi/media_stop_normal_light.png b/ultraSonic/src/main/res/drawable-hdpi/media_stop_normal_light.png
similarity index 100%
rename from res/drawable-hdpi/media_stop_normal_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_stop_normal_light.png
diff --git a/res/drawable-hdpi/media_toggle_list_normal_dark.png b/ultraSonic/src/main/res/drawable-hdpi/media_toggle_list_normal_dark.png
similarity index 100%
rename from res/drawable-hdpi/media_toggle_list_normal_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_toggle_list_normal_dark.png
diff --git a/res/drawable-hdpi/media_toggle_list_normal_light.png b/ultraSonic/src/main/res/drawable-hdpi/media_toggle_list_normal_light.png
similarity index 100%
rename from res/drawable-hdpi/media_toggle_list_normal_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/media_toggle_list_normal_light.png
diff --git a/res/drawable-hdpi/menu_arrow.png b/ultraSonic/src/main/res/drawable-hdpi/menu_arrow.png
similarity index 100%
rename from res/drawable-hdpi/menu_arrow.png
rename to ultraSonic/src/main/res/drawable-hdpi/menu_arrow.png
diff --git a/res/drawable-hdpi/progress_bg_holo_dark.9.png b/ultraSonic/src/main/res/drawable-hdpi/progress_bg_holo_dark.9.png
similarity index 100%
rename from res/drawable-hdpi/progress_bg_holo_dark.9.png
rename to ultraSonic/src/main/res/drawable-hdpi/progress_bg_holo_dark.9.png
diff --git a/res/drawable-hdpi/progress_primary_holo_dark.9.png b/ultraSonic/src/main/res/drawable-hdpi/progress_primary_holo_dark.9.png
similarity index 100%
rename from res/drawable-hdpi/progress_primary_holo_dark.9.png
rename to ultraSonic/src/main/res/drawable-hdpi/progress_primary_holo_dark.9.png
diff --git a/res/drawable-hdpi/progress_secondary_holo_dark.9.png b/ultraSonic/src/main/res/drawable-hdpi/progress_secondary_holo_dark.9.png
similarity index 100%
rename from res/drawable-hdpi/progress_secondary_holo_dark.9.png
rename to ultraSonic/src/main/res/drawable-hdpi/progress_secondary_holo_dark.9.png
diff --git a/res/drawable-hdpi/stat_sys_download_anim0_dark.png b/ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim0_dark.png
similarity index 100%
rename from res/drawable-hdpi/stat_sys_download_anim0_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim0_dark.png
diff --git a/res/drawable-hdpi/stat_sys_download_anim0_light.png b/ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim0_light.png
similarity index 100%
rename from res/drawable-hdpi/stat_sys_download_anim0_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim0_light.png
diff --git a/res/drawable-hdpi/stat_sys_download_anim1_dark.png b/ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim1_dark.png
similarity index 100%
rename from res/drawable-hdpi/stat_sys_download_anim1_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim1_dark.png
diff --git a/res/drawable-hdpi/stat_sys_download_anim1_light.png b/ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim1_light.png
similarity index 100%
rename from res/drawable-hdpi/stat_sys_download_anim1_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim1_light.png
diff --git a/res/drawable-hdpi/stat_sys_download_anim2_dark.png b/ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim2_dark.png
similarity index 100%
rename from res/drawable-hdpi/stat_sys_download_anim2_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim2_dark.png
diff --git a/res/drawable-hdpi/stat_sys_download_anim2_light.png b/ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim2_light.png
similarity index 100%
rename from res/drawable-hdpi/stat_sys_download_anim2_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim2_light.png
diff --git a/res/drawable-hdpi/stat_sys_download_anim3_dark.png b/ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim3_dark.png
similarity index 100%
rename from res/drawable-hdpi/stat_sys_download_anim3_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim3_dark.png
diff --git a/res/drawable-hdpi/stat_sys_download_anim3_light.png b/ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim3_light.png
similarity index 100%
rename from res/drawable-hdpi/stat_sys_download_anim3_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim3_light.png
diff --git a/res/drawable-hdpi/stat_sys_download_anim4_dark.png b/ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim4_dark.png
similarity index 100%
rename from res/drawable-hdpi/stat_sys_download_anim4_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim4_dark.png
diff --git a/res/drawable-hdpi/stat_sys_download_anim4_light.png b/ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim4_light.png
similarity index 100%
rename from res/drawable-hdpi/stat_sys_download_anim4_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim4_light.png
diff --git a/res/drawable-hdpi/stat_sys_download_anim5_dark.png b/ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim5_dark.png
similarity index 100%
rename from res/drawable-hdpi/stat_sys_download_anim5_dark.png
rename to ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim5_dark.png
diff --git a/res/drawable-hdpi/stat_sys_download_anim5_light.png b/ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim5_light.png
similarity index 100%
rename from res/drawable-hdpi/stat_sys_download_anim5_light.png
rename to ultraSonic/src/main/res/drawable-hdpi/stat_sys_download_anim5_light.png
diff --git a/res/drawable-hdpi/unknown_album.png b/ultraSonic/src/main/res/drawable-hdpi/unknown_album.png
similarity index 100%
rename from res/drawable-hdpi/unknown_album.png
rename to ultraSonic/src/main/res/drawable-hdpi/unknown_album.png
diff --git a/res/drawable-hdpi/unknown_album_large.png b/ultraSonic/src/main/res/drawable-hdpi/unknown_album_large.png
similarity index 100%
rename from res/drawable-hdpi/unknown_album_large.png
rename to ultraSonic/src/main/res/drawable-hdpi/unknown_album_large.png
diff --git a/res/drawable-ldpi-v11/ic_stat_ultrasonic.png b/ultraSonic/src/main/res/drawable-ldpi-v11/ic_stat_ultrasonic.png
similarity index 100%
rename from res/drawable-ldpi-v11/ic_stat_ultrasonic.png
rename to ultraSonic/src/main/res/drawable-ldpi-v11/ic_stat_ultrasonic.png
diff --git a/res/drawable-ldpi-v9/ic_stat_ultrasonic.png b/ultraSonic/src/main/res/drawable-ldpi-v9/ic_stat_ultrasonic.png
similarity index 100%
rename from res/drawable-ldpi-v9/ic_stat_ultrasonic.png
rename to ultraSonic/src/main/res/drawable-ldpi-v9/ic_stat_ultrasonic.png
diff --git a/res/drawable-ldpi/btn_check_off_focused_holo_dark.png b/ultraSonic/src/main/res/drawable-ldpi/btn_check_off_focused_holo_dark.png
similarity index 100%
rename from res/drawable-ldpi/btn_check_off_focused_holo_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/btn_check_off_focused_holo_dark.png
diff --git a/res/drawable-ldpi/btn_check_off_focused_holo_light.png b/ultraSonic/src/main/res/drawable-ldpi/btn_check_off_focused_holo_light.png
similarity index 100%
rename from res/drawable-ldpi/btn_check_off_focused_holo_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/btn_check_off_focused_holo_light.png
diff --git a/res/drawable-ldpi/btn_check_off_holo_dark.png b/ultraSonic/src/main/res/drawable-ldpi/btn_check_off_holo_dark.png
similarity index 100%
rename from res/drawable-ldpi/btn_check_off_holo_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/btn_check_off_holo_dark.png
diff --git a/res/drawable-ldpi/btn_check_off_holo_light.png b/ultraSonic/src/main/res/drawable-ldpi/btn_check_off_holo_light.png
similarity index 100%
rename from res/drawable-ldpi/btn_check_off_holo_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/btn_check_off_holo_light.png
diff --git a/res/drawable-ldpi/btn_check_on_focused_holo_dark.png b/ultraSonic/src/main/res/drawable-ldpi/btn_check_on_focused_holo_dark.png
similarity index 100%
rename from res/drawable-ldpi/btn_check_on_focused_holo_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/btn_check_on_focused_holo_dark.png
diff --git a/res/drawable-ldpi/btn_check_on_focused_holo_light.png b/ultraSonic/src/main/res/drawable-ldpi/btn_check_on_focused_holo_light.png
similarity index 100%
rename from res/drawable-ldpi/btn_check_on_focused_holo_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/btn_check_on_focused_holo_light.png
diff --git a/res/drawable-ldpi/btn_check_on_holo_dark.png b/ultraSonic/src/main/res/drawable-ldpi/btn_check_on_holo_dark.png
similarity index 100%
rename from res/drawable-ldpi/btn_check_on_holo_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/btn_check_on_holo_dark.png
diff --git a/res/drawable-ldpi/btn_check_on_holo_light.png b/ultraSonic/src/main/res/drawable-ldpi/btn_check_on_holo_light.png
similarity index 100%
rename from res/drawable-ldpi/btn_check_on_holo_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/btn_check_on_holo_light.png
diff --git a/res/drawable-ldpi/ic_launcher.png b/ultraSonic/src/main/res/drawable-ldpi/ic_launcher.png
similarity index 100%
rename from res/drawable-ldpi/ic_launcher.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_launcher.png
diff --git a/res/drawable-ldpi/ic_menu_about_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_about_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_about_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_about_dark.png
diff --git a/res/drawable-ldpi/ic_menu_about_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_about_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_about_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_about_light.png
diff --git a/res/drawable-ldpi/ic_menu_add_to_queue_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_add_to_queue_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_add_to_queue_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_add_to_queue_dark.png
diff --git a/res/drawable-ldpi/ic_menu_add_to_queue_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_add_to_queue_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_add_to_queue_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_add_to_queue_light.png
diff --git a/res/drawable-ldpi/ic_menu_backward_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_backward_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_backward_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_backward_dark.png
diff --git a/res/drawable-ldpi/ic_menu_backward_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_backward_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_backward_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_backward_light.png
diff --git a/res/drawable-ldpi/ic_menu_bookmark_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_bookmark_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_bookmark_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_bookmark_dark.png
diff --git a/res/drawable-ldpi/ic_menu_bookmark_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_bookmark_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_bookmark_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_bookmark_light.png
diff --git a/res/drawable-ldpi/ic_menu_browse_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_browse_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_browse_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_browse_dark.png
diff --git a/res/drawable-ldpi/ic_menu_browse_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_browse_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_browse_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_browse_light.png
diff --git a/res/drawable-ldpi/ic_menu_chat_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_chat_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_chat_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_chat_dark.png
diff --git a/res/drawable-ldpi/ic_menu_chat_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_chat_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_chat_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_chat_light.png
diff --git a/res/drawable-ldpi/ic_menu_chat_send_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_chat_send_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_chat_send_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_chat_send_dark.png
diff --git a/res/drawable-ldpi/ic_menu_chat_send_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_chat_send_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_chat_send_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_chat_send_light.png
diff --git a/res/drawable-ldpi/ic_menu_exit_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_exit_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_exit_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_exit_dark.png
diff --git a/res/drawable-ldpi/ic_menu_exit_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_exit_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_exit_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_exit_light.png
diff --git a/res/drawable-ldpi/ic_menu_forward_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_forward_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_forward_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_forward_dark.png
diff --git a/res/drawable-ldpi/ic_menu_forward_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_forward_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_forward_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_forward_light.png
diff --git a/res/drawable-ldpi/ic_menu_help_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_help_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_help_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_help_dark.png
diff --git a/res/drawable-ldpi/ic_menu_help_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_help_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_help_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_help_light.png
diff --git a/res/drawable-ldpi/ic_menu_home_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_home_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_home_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_home_dark.png
diff --git a/res/drawable-ldpi/ic_menu_home_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_home_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_home_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_home_light.png
diff --git a/res/drawable-ldpi/ic_menu_playlists_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_playlists_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_playlists_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_playlists_dark.png
diff --git a/res/drawable-ldpi/ic_menu_playlists_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_playlists_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_playlists_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_playlists_light.png
diff --git a/res/drawable-ldpi/ic_menu_remove_all_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_remove_all_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_remove_all_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_remove_all_dark.png
diff --git a/res/drawable-ldpi/ic_menu_remove_all_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_remove_all_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_remove_all_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_remove_all_light.png
diff --git a/res/drawable-ldpi/ic_menu_save_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_save_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_save_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_save_dark.png
diff --git a/res/drawable-ldpi/ic_menu_save_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_save_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_save_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_save_light.png
diff --git a/res/drawable-ldpi/ic_menu_screen_on_off_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_screen_on_off_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_screen_on_off_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_screen_on_off_dark.png
diff --git a/res/drawable-ldpi/ic_menu_screen_on_off_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_screen_on_off_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_screen_on_off_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_screen_on_off_light.png
diff --git a/res/drawable-ldpi/ic_menu_search_holo_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_search_holo_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_search_holo_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_search_holo_dark.png
diff --git a/res/drawable-ldpi/ic_menu_search_holo_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_search_holo_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_search_holo_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_search_holo_light.png
diff --git a/res/drawable-ldpi/ic_menu_select_all_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_select_all_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_select_all_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_select_all_dark.png
diff --git a/res/drawable-ldpi/ic_menu_select_all_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_select_all_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_select_all_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_select_all_light.png
diff --git a/res/drawable-ldpi/ic_menu_select_folder_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_select_folder_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_select_folder_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_select_folder_dark.png
diff --git a/res/drawable-ldpi/ic_menu_select_folder_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_select_folder_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_select_folder_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_select_folder_light.png
diff --git a/res/drawable-ldpi/ic_menu_settings_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_settings_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_settings_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_settings_dark.png
diff --git a/res/drawable-ldpi/ic_menu_settings_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_settings_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_settings_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_settings_light.png
diff --git a/res/drawable-ldpi/ic_menu_share_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_share_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_share_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_share_dark.png
diff --git a/res/drawable-ldpi/ic_menu_share_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_share_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_share_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_share_light.png
diff --git a/res/drawable-ldpi/ic_menu_unpin_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_unpin_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_unpin_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_unpin_dark.png
diff --git a/res/drawable-ldpi/ic_menu_unpin_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_menu_unpin_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_menu_unpin_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_menu_unpin_light.png
diff --git a/res/drawable-ldpi/ic_star_full_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_star_full_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_star_full_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_star_full_dark.png
diff --git a/res/drawable-ldpi/ic_star_full_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_star_full_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_star_full_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_star_full_light.png
diff --git a/res/drawable-ldpi/ic_star_hollow_dark.png b/ultraSonic/src/main/res/drawable-ldpi/ic_star_hollow_dark.png
similarity index 100%
rename from res/drawable-ldpi/ic_star_hollow_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_star_hollow_dark.png
diff --git a/res/drawable-ldpi/ic_star_hollow_light.png b/ultraSonic/src/main/res/drawable-ldpi/ic_star_hollow_light.png
similarity index 100%
rename from res/drawable-ldpi/ic_star_hollow_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_star_hollow_light.png
diff --git a/res/drawable-ldpi/ic_stat_ultrasonic.png b/ultraSonic/src/main/res/drawable-ldpi/ic_stat_ultrasonic.png
similarity index 100%
rename from res/drawable-ldpi/ic_stat_ultrasonic.png
rename to ultraSonic/src/main/res/drawable-ldpi/ic_stat_ultrasonic.png
diff --git a/res/drawable-ldpi/media_backward_normal_dark.png b/ultraSonic/src/main/res/drawable-ldpi/media_backward_normal_dark.png
similarity index 100%
rename from res/drawable-ldpi/media_backward_normal_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_backward_normal_dark.png
diff --git a/res/drawable-ldpi/media_backward_normal_light.png b/ultraSonic/src/main/res/drawable-ldpi/media_backward_normal_light.png
similarity index 100%
rename from res/drawable-ldpi/media_backward_normal_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_backward_normal_light.png
diff --git a/res/drawable-ldpi/media_forward_normal_dark.png b/ultraSonic/src/main/res/drawable-ldpi/media_forward_normal_dark.png
similarity index 100%
rename from res/drawable-ldpi/media_forward_normal_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_forward_normal_dark.png
diff --git a/res/drawable-ldpi/media_forward_normal_light.png b/ultraSonic/src/main/res/drawable-ldpi/media_forward_normal_light.png
similarity index 100%
rename from res/drawable-ldpi/media_forward_normal_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_forward_normal_light.png
diff --git a/res/drawable-ldpi/media_pause_normal_dark.png b/ultraSonic/src/main/res/drawable-ldpi/media_pause_normal_dark.png
similarity index 100%
rename from res/drawable-ldpi/media_pause_normal_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_pause_normal_dark.png
diff --git a/res/drawable-ldpi/media_pause_normal_light.png b/ultraSonic/src/main/res/drawable-ldpi/media_pause_normal_light.png
similarity index 100%
rename from res/drawable-ldpi/media_pause_normal_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_pause_normal_light.png
diff --git a/res/drawable-ldpi/media_repeat_off_dark.png b/ultraSonic/src/main/res/drawable-ldpi/media_repeat_off_dark.png
similarity index 100%
rename from res/drawable-ldpi/media_repeat_off_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_repeat_off_dark.png
diff --git a/res/drawable-ldpi/media_repeat_off_light.png b/ultraSonic/src/main/res/drawable-ldpi/media_repeat_off_light.png
similarity index 100%
rename from res/drawable-ldpi/media_repeat_off_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_repeat_off_light.png
diff --git a/res/drawable-ldpi/media_shuffle_normal_dark.png b/ultraSonic/src/main/res/drawable-ldpi/media_shuffle_normal_dark.png
similarity index 100%
rename from res/drawable-ldpi/media_shuffle_normal_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_shuffle_normal_dark.png
diff --git a/res/drawable-ldpi/media_shuffle_normal_light.png b/ultraSonic/src/main/res/drawable-ldpi/media_shuffle_normal_light.png
similarity index 100%
rename from res/drawable-ldpi/media_shuffle_normal_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_shuffle_normal_light.png
diff --git a/res/drawable-ldpi/media_start_normal_dark.png b/ultraSonic/src/main/res/drawable-ldpi/media_start_normal_dark.png
similarity index 100%
rename from res/drawable-ldpi/media_start_normal_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_start_normal_dark.png
diff --git a/res/drawable-ldpi/media_start_normal_light.png b/ultraSonic/src/main/res/drawable-ldpi/media_start_normal_light.png
similarity index 100%
rename from res/drawable-ldpi/media_start_normal_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_start_normal_light.png
diff --git a/res/drawable-ldpi/media_stop_normal_dark.png b/ultraSonic/src/main/res/drawable-ldpi/media_stop_normal_dark.png
similarity index 100%
rename from res/drawable-ldpi/media_stop_normal_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_stop_normal_dark.png
diff --git a/res/drawable-ldpi/media_stop_normal_light.png b/ultraSonic/src/main/res/drawable-ldpi/media_stop_normal_light.png
similarity index 100%
rename from res/drawable-ldpi/media_stop_normal_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_stop_normal_light.png
diff --git a/res/drawable-ldpi/media_toggle_list_normal_dark.png b/ultraSonic/src/main/res/drawable-ldpi/media_toggle_list_normal_dark.png
similarity index 100%
rename from res/drawable-ldpi/media_toggle_list_normal_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_toggle_list_normal_dark.png
diff --git a/res/drawable-ldpi/media_toggle_list_normal_light.png b/ultraSonic/src/main/res/drawable-ldpi/media_toggle_list_normal_light.png
similarity index 100%
rename from res/drawable-ldpi/media_toggle_list_normal_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/media_toggle_list_normal_light.png
diff --git a/res/drawable-ldpi/stat_sys_download_anim0_dark.png b/ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim0_dark.png
similarity index 100%
rename from res/drawable-ldpi/stat_sys_download_anim0_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim0_dark.png
diff --git a/res/drawable-ldpi/stat_sys_download_anim0_light.png b/ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim0_light.png
similarity index 100%
rename from res/drawable-ldpi/stat_sys_download_anim0_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim0_light.png
diff --git a/res/drawable-ldpi/stat_sys_download_anim1_dark.png b/ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim1_dark.png
similarity index 100%
rename from res/drawable-ldpi/stat_sys_download_anim1_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim1_dark.png
diff --git a/res/drawable-ldpi/stat_sys_download_anim1_light.png b/ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim1_light.png
similarity index 100%
rename from res/drawable-ldpi/stat_sys_download_anim1_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim1_light.png
diff --git a/res/drawable-ldpi/stat_sys_download_anim2_dark.png b/ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim2_dark.png
similarity index 100%
rename from res/drawable-ldpi/stat_sys_download_anim2_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim2_dark.png
diff --git a/res/drawable-ldpi/stat_sys_download_anim2_light.png b/ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim2_light.png
similarity index 100%
rename from res/drawable-ldpi/stat_sys_download_anim2_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim2_light.png
diff --git a/res/drawable-ldpi/stat_sys_download_anim3_dark.png b/ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim3_dark.png
similarity index 100%
rename from res/drawable-ldpi/stat_sys_download_anim3_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim3_dark.png
diff --git a/res/drawable-ldpi/stat_sys_download_anim3_light.png b/ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim3_light.png
similarity index 100%
rename from res/drawable-ldpi/stat_sys_download_anim3_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim3_light.png
diff --git a/res/drawable-ldpi/stat_sys_download_anim4_dark.png b/ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim4_dark.png
similarity index 100%
rename from res/drawable-ldpi/stat_sys_download_anim4_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim4_dark.png
diff --git a/res/drawable-ldpi/stat_sys_download_anim4_light.png b/ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim4_light.png
similarity index 100%
rename from res/drawable-ldpi/stat_sys_download_anim4_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim4_light.png
diff --git a/res/drawable-ldpi/stat_sys_download_anim5_dark.png b/ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim5_dark.png
similarity index 100%
rename from res/drawable-ldpi/stat_sys_download_anim5_dark.png
rename to ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim5_dark.png
diff --git a/res/drawable-ldpi/stat_sys_download_anim5_light.png b/ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim5_light.png
similarity index 100%
rename from res/drawable-ldpi/stat_sys_download_anim5_light.png
rename to ultraSonic/src/main/res/drawable-ldpi/stat_sys_download_anim5_light.png
diff --git a/res/drawable-mdpi-v11/ic_stat_ultrasonic.png b/ultraSonic/src/main/res/drawable-mdpi-v11/ic_stat_ultrasonic.png
similarity index 100%
rename from res/drawable-mdpi-v11/ic_stat_ultrasonic.png
rename to ultraSonic/src/main/res/drawable-mdpi-v11/ic_stat_ultrasonic.png
diff --git a/res/drawable-mdpi-v14/menu_arrow.png b/ultraSonic/src/main/res/drawable-mdpi-v14/menu_arrow.png
similarity index 100%
rename from res/drawable-mdpi-v14/menu_arrow.png
rename to ultraSonic/src/main/res/drawable-mdpi-v14/menu_arrow.png
diff --git a/res/drawable-mdpi-v9/ic_stat_ultrasonic.png b/ultraSonic/src/main/res/drawable-mdpi-v9/ic_stat_ultrasonic.png
similarity index 100%
rename from res/drawable-mdpi-v9/ic_stat_ultrasonic.png
rename to ultraSonic/src/main/res/drawable-mdpi-v9/ic_stat_ultrasonic.png
diff --git a/res/drawable-mdpi/btn_check_off_focused_holo_dark.png b/ultraSonic/src/main/res/drawable-mdpi/btn_check_off_focused_holo_dark.png
similarity index 100%
rename from res/drawable-mdpi/btn_check_off_focused_holo_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/btn_check_off_focused_holo_dark.png
diff --git a/res/drawable-mdpi/btn_check_off_focused_holo_light.png b/ultraSonic/src/main/res/drawable-mdpi/btn_check_off_focused_holo_light.png
similarity index 100%
rename from res/drawable-mdpi/btn_check_off_focused_holo_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/btn_check_off_focused_holo_light.png
diff --git a/res/drawable-mdpi/btn_check_off_holo_dark.png b/ultraSonic/src/main/res/drawable-mdpi/btn_check_off_holo_dark.png
similarity index 100%
rename from res/drawable-mdpi/btn_check_off_holo_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/btn_check_off_holo_dark.png
diff --git a/res/drawable-mdpi/btn_check_off_holo_light.png b/ultraSonic/src/main/res/drawable-mdpi/btn_check_off_holo_light.png
similarity index 100%
rename from res/drawable-mdpi/btn_check_off_holo_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/btn_check_off_holo_light.png
diff --git a/res/drawable-mdpi/btn_check_on_focused_holo_dark.png b/ultraSonic/src/main/res/drawable-mdpi/btn_check_on_focused_holo_dark.png
similarity index 100%
rename from res/drawable-mdpi/btn_check_on_focused_holo_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/btn_check_on_focused_holo_dark.png
diff --git a/res/drawable-mdpi/btn_check_on_focused_holo_light.png b/ultraSonic/src/main/res/drawable-mdpi/btn_check_on_focused_holo_light.png
similarity index 100%
rename from res/drawable-mdpi/btn_check_on_focused_holo_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/btn_check_on_focused_holo_light.png
diff --git a/res/drawable-mdpi/btn_check_on_holo_dark.png b/ultraSonic/src/main/res/drawable-mdpi/btn_check_on_holo_dark.png
similarity index 100%
rename from res/drawable-mdpi/btn_check_on_holo_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/btn_check_on_holo_dark.png
diff --git a/res/drawable-mdpi/btn_check_on_holo_light.png b/ultraSonic/src/main/res/drawable-mdpi/btn_check_on_holo_light.png
similarity index 100%
rename from res/drawable-mdpi/btn_check_on_holo_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/btn_check_on_holo_light.png
diff --git a/res/drawable-mdpi/ic_drag_queue.9.png b/ultraSonic/src/main/res/drawable-mdpi/ic_drag_queue.png
similarity index 100%
rename from res/drawable-mdpi/ic_drag_queue.9.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_drag_queue.png
diff --git a/res/drawable-mdpi/ic_launcher.png b/ultraSonic/src/main/res/drawable-mdpi/ic_launcher.png
similarity index 100%
rename from res/drawable-mdpi/ic_launcher.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_launcher.png
diff --git a/res/drawable-mdpi/ic_menu_about_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_about_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_about_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_about_dark.png
diff --git a/res/drawable-mdpi/ic_menu_about_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_about_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_about_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_about_light.png
diff --git a/res/drawable-mdpi/ic_menu_add_to_queue_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_add_to_queue_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_add_to_queue_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_add_to_queue_dark.png
diff --git a/res/drawable-mdpi/ic_menu_add_to_queue_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_add_to_queue_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_add_to_queue_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_add_to_queue_light.png
diff --git a/res/drawable-mdpi/ic_menu_backward_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_backward_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_backward_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_backward_dark.png
diff --git a/res/drawable-mdpi/ic_menu_backward_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_backward_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_backward_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_backward_light.png
diff --git a/res/drawable-mdpi/ic_menu_bookmark_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_bookmark_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_bookmark_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_bookmark_dark.png
diff --git a/res/drawable-mdpi/ic_menu_bookmark_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_bookmark_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_bookmark_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_bookmark_light.png
diff --git a/res/drawable-mdpi/ic_menu_browse_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_browse_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_browse_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_browse_dark.png
diff --git a/res/drawable-mdpi/ic_menu_browse_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_browse_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_browse_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_browse_light.png
diff --git a/res/drawable-mdpi/ic_menu_chat_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_chat_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_chat_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_chat_dark.png
diff --git a/res/drawable-mdpi/ic_menu_chat_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_chat_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_chat_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_chat_light.png
diff --git a/res/drawable-mdpi/ic_menu_chat_send_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_chat_send_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_chat_send_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_chat_send_dark.png
diff --git a/res/drawable-mdpi/ic_menu_chat_send_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_chat_send_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_chat_send_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_chat_send_light.png
diff --git a/res/drawable-mdpi/ic_menu_exit_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_exit_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_exit_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_exit_dark.png
diff --git a/res/drawable-mdpi/ic_menu_exit_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_exit_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_exit_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_exit_light.png
diff --git a/res/drawable-mdpi/ic_menu_forward_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_forward_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_forward_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_forward_dark.png
diff --git a/res/drawable-mdpi/ic_menu_forward_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_forward_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_forward_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_forward_light.png
diff --git a/res/drawable-mdpi/ic_menu_help_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_help_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_help_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_help_dark.png
diff --git a/res/drawable-mdpi/ic_menu_help_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_help_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_help_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_help_light.png
diff --git a/res/drawable-mdpi/ic_menu_home_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_home_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_home_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_home_dark.png
diff --git a/res/drawable-mdpi/ic_menu_home_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_home_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_home_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_home_light.png
diff --git a/res/drawable-mdpi/ic_menu_playlists_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_playlists_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_playlists_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_playlists_dark.png
diff --git a/res/drawable-mdpi/ic_menu_playlists_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_playlists_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_playlists_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_playlists_light.png
diff --git a/res/drawable-mdpi/ic_menu_remove_all_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_remove_all_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_remove_all_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_remove_all_dark.png
diff --git a/res/drawable-mdpi/ic_menu_remove_all_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_remove_all_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_remove_all_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_remove_all_light.png
diff --git a/res/drawable-mdpi/ic_menu_save_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_save_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_save_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_save_dark.png
diff --git a/res/drawable-mdpi/ic_menu_save_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_save_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_save_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_save_light.png
diff --git a/res/drawable-mdpi/ic_menu_screen_on_off_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_screen_on_off_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_screen_on_off_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_screen_on_off_dark.png
diff --git a/res/drawable-mdpi/ic_menu_screen_on_off_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_screen_on_off_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_screen_on_off_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_screen_on_off_light.png
diff --git a/res/drawable-mdpi/ic_menu_search_holo_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_search_holo_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_search_holo_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_search_holo_dark.png
diff --git a/res/drawable-mdpi/ic_menu_search_holo_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_search_holo_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_search_holo_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_search_holo_light.png
diff --git a/res/drawable-mdpi/ic_menu_select_all_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_select_all_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_select_all_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_select_all_dark.png
diff --git a/res/drawable-mdpi/ic_menu_select_all_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_select_all_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_select_all_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_select_all_light.png
diff --git a/res/drawable-mdpi/ic_menu_select_folder_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_select_folder_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_select_folder_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_select_folder_dark.png
diff --git a/res/drawable-mdpi/ic_menu_select_folder_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_select_folder_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_select_folder_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_select_folder_light.png
diff --git a/res/drawable-mdpi/ic_menu_settings_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_settings_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_settings_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_settings_dark.png
diff --git a/res/drawable-mdpi/ic_menu_settings_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_settings_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_settings_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_settings_light.png
diff --git a/res/drawable-mdpi/ic_menu_share_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_share_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_share_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_share_dark.png
diff --git a/res/drawable-mdpi/ic_menu_share_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_share_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_share_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_share_light.png
diff --git a/res/drawable-mdpi/ic_menu_unpin_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_unpin_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_unpin_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_unpin_dark.png
diff --git a/res/drawable-mdpi/ic_menu_unpin_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_menu_unpin_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_menu_unpin_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_menu_unpin_light.png
diff --git a/res/drawable-mdpi/ic_star_full_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_star_full_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_star_full_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_star_full_dark.png
diff --git a/res/drawable-mdpi/ic_star_full_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_star_full_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_star_full_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_star_full_light.png
diff --git a/res/drawable-mdpi/ic_star_hollow_dark.png b/ultraSonic/src/main/res/drawable-mdpi/ic_star_hollow_dark.png
similarity index 100%
rename from res/drawable-mdpi/ic_star_hollow_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_star_hollow_dark.png
diff --git a/res/drawable-mdpi/ic_star_hollow_light.png b/ultraSonic/src/main/res/drawable-mdpi/ic_star_hollow_light.png
similarity index 100%
rename from res/drawable-mdpi/ic_star_hollow_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_star_hollow_light.png
diff --git a/res/drawable-mdpi/ic_stat_ultrasonic.png b/ultraSonic/src/main/res/drawable-mdpi/ic_stat_ultrasonic.png
similarity index 100%
rename from res/drawable-mdpi/ic_stat_ultrasonic.png
rename to ultraSonic/src/main/res/drawable-mdpi/ic_stat_ultrasonic.png
diff --git a/res/drawable-mdpi/media_backward_normal_dark.png b/ultraSonic/src/main/res/drawable-mdpi/media_backward_normal_dark.png
similarity index 100%
rename from res/drawable-mdpi/media_backward_normal_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_backward_normal_dark.png
diff --git a/res/drawable-mdpi/media_backward_normal_light.png b/ultraSonic/src/main/res/drawable-mdpi/media_backward_normal_light.png
similarity index 100%
rename from res/drawable-mdpi/media_backward_normal_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_backward_normal_light.png
diff --git a/res/drawable-mdpi/media_forward_normal_dark.png b/ultraSonic/src/main/res/drawable-mdpi/media_forward_normal_dark.png
similarity index 100%
rename from res/drawable-mdpi/media_forward_normal_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_forward_normal_dark.png
diff --git a/res/drawable-mdpi/media_forward_normal_light.png b/ultraSonic/src/main/res/drawable-mdpi/media_forward_normal_light.png
similarity index 100%
rename from res/drawable-mdpi/media_forward_normal_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_forward_normal_light.png
diff --git a/res/drawable-mdpi/media_pause_normal_dark.png b/ultraSonic/src/main/res/drawable-mdpi/media_pause_normal_dark.png
similarity index 100%
rename from res/drawable-mdpi/media_pause_normal_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_pause_normal_dark.png
diff --git a/res/drawable-mdpi/media_pause_normal_light.png b/ultraSonic/src/main/res/drawable-mdpi/media_pause_normal_light.png
similarity index 100%
rename from res/drawable-mdpi/media_pause_normal_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_pause_normal_light.png
diff --git a/res/drawable-mdpi/media_repeat_off_dark.png b/ultraSonic/src/main/res/drawable-mdpi/media_repeat_off_dark.png
similarity index 100%
rename from res/drawable-mdpi/media_repeat_off_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_repeat_off_dark.png
diff --git a/res/drawable-mdpi/media_repeat_off_light.png b/ultraSonic/src/main/res/drawable-mdpi/media_repeat_off_light.png
similarity index 100%
rename from res/drawable-mdpi/media_repeat_off_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_repeat_off_light.png
diff --git a/res/drawable-mdpi/media_shuffle_normal_dark.png b/ultraSonic/src/main/res/drawable-mdpi/media_shuffle_normal_dark.png
similarity index 100%
rename from res/drawable-mdpi/media_shuffle_normal_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_shuffle_normal_dark.png
diff --git a/res/drawable-mdpi/media_shuffle_normal_light.png b/ultraSonic/src/main/res/drawable-mdpi/media_shuffle_normal_light.png
similarity index 100%
rename from res/drawable-mdpi/media_shuffle_normal_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_shuffle_normal_light.png
diff --git a/res/drawable-mdpi/media_start_normal_dark.png b/ultraSonic/src/main/res/drawable-mdpi/media_start_normal_dark.png
similarity index 100%
rename from res/drawable-mdpi/media_start_normal_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_start_normal_dark.png
diff --git a/res/drawable-mdpi/media_start_normal_light.png b/ultraSonic/src/main/res/drawable-mdpi/media_start_normal_light.png
similarity index 100%
rename from res/drawable-mdpi/media_start_normal_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_start_normal_light.png
diff --git a/res/drawable-mdpi/media_stop_normal_dark.png b/ultraSonic/src/main/res/drawable-mdpi/media_stop_normal_dark.png
similarity index 100%
rename from res/drawable-mdpi/media_stop_normal_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_stop_normal_dark.png
diff --git a/res/drawable-mdpi/media_stop_normal_light.png b/ultraSonic/src/main/res/drawable-mdpi/media_stop_normal_light.png
similarity index 100%
rename from res/drawable-mdpi/media_stop_normal_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_stop_normal_light.png
diff --git a/res/drawable-mdpi/media_toggle_list_normal_dark.png b/ultraSonic/src/main/res/drawable-mdpi/media_toggle_list_normal_dark.png
similarity index 100%
rename from res/drawable-mdpi/media_toggle_list_normal_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_toggle_list_normal_dark.png
diff --git a/res/drawable-mdpi/media_toggle_list_normal_light.png b/ultraSonic/src/main/res/drawable-mdpi/media_toggle_list_normal_light.png
similarity index 100%
rename from res/drawable-mdpi/media_toggle_list_normal_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/media_toggle_list_normal_light.png
diff --git a/res/drawable-mdpi/menu_arrow.png b/ultraSonic/src/main/res/drawable-mdpi/menu_arrow.png
similarity index 100%
rename from res/drawable-mdpi/menu_arrow.png
rename to ultraSonic/src/main/res/drawable-mdpi/menu_arrow.png
diff --git a/res/drawable-mdpi/stat_sys_download_anim0_dark.png b/ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim0_dark.png
similarity index 100%
rename from res/drawable-mdpi/stat_sys_download_anim0_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim0_dark.png
diff --git a/res/drawable-mdpi/stat_sys_download_anim0_light.png b/ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim0_light.png
similarity index 100%
rename from res/drawable-mdpi/stat_sys_download_anim0_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim0_light.png
diff --git a/res/drawable-mdpi/stat_sys_download_anim1_dark.png b/ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim1_dark.png
similarity index 100%
rename from res/drawable-mdpi/stat_sys_download_anim1_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim1_dark.png
diff --git a/res/drawable-mdpi/stat_sys_download_anim1_light.png b/ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim1_light.png
similarity index 100%
rename from res/drawable-mdpi/stat_sys_download_anim1_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim1_light.png
diff --git a/res/drawable-mdpi/stat_sys_download_anim2_dark.png b/ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim2_dark.png
similarity index 100%
rename from res/drawable-mdpi/stat_sys_download_anim2_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim2_dark.png
diff --git a/res/drawable-mdpi/stat_sys_download_anim2_light.png b/ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim2_light.png
similarity index 100%
rename from res/drawable-mdpi/stat_sys_download_anim2_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim2_light.png
diff --git a/res/drawable-mdpi/stat_sys_download_anim3_dark.png b/ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim3_dark.png
similarity index 100%
rename from res/drawable-mdpi/stat_sys_download_anim3_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim3_dark.png
diff --git a/res/drawable-mdpi/stat_sys_download_anim3_light.png b/ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim3_light.png
similarity index 100%
rename from res/drawable-mdpi/stat_sys_download_anim3_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim3_light.png
diff --git a/res/drawable-mdpi/stat_sys_download_anim4_dark.png b/ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim4_dark.png
similarity index 100%
rename from res/drawable-mdpi/stat_sys_download_anim4_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim4_dark.png
diff --git a/res/drawable-mdpi/stat_sys_download_anim4_light.png b/ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim4_light.png
similarity index 100%
rename from res/drawable-mdpi/stat_sys_download_anim4_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim4_light.png
diff --git a/res/drawable-mdpi/stat_sys_download_anim5_dark.png b/ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim5_dark.png
similarity index 100%
rename from res/drawable-mdpi/stat_sys_download_anim5_dark.png
rename to ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim5_dark.png
diff --git a/res/drawable-mdpi/stat_sys_download_anim5_light.png b/ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim5_light.png
similarity index 100%
rename from res/drawable-mdpi/stat_sys_download_anim5_light.png
rename to ultraSonic/src/main/res/drawable-mdpi/stat_sys_download_anim5_light.png
diff --git a/res/drawable-nodpi/preview4x1.png b/ultraSonic/src/main/res/drawable-nodpi/preview4x1.png
similarity index 100%
rename from res/drawable-nodpi/preview4x1.png
rename to ultraSonic/src/main/res/drawable-nodpi/preview4x1.png
diff --git a/res/drawable-nodpi/preview4x2.png b/ultraSonic/src/main/res/drawable-nodpi/preview4x2.png
similarity index 100%
rename from res/drawable-nodpi/preview4x2.png
rename to ultraSonic/src/main/res/drawable-nodpi/preview4x2.png
diff --git a/res/drawable-nodpi/preview4x3.png b/ultraSonic/src/main/res/drawable-nodpi/preview4x3.png
similarity index 100%
rename from res/drawable-nodpi/preview4x3.png
rename to ultraSonic/src/main/res/drawable-nodpi/preview4x3.png
diff --git a/res/drawable-xhdpi-v11/ic_stat_ultrasonic.png b/ultraSonic/src/main/res/drawable-xhdpi-v11/ic_stat_ultrasonic.png
similarity index 100%
rename from res/drawable-xhdpi-v11/ic_stat_ultrasonic.png
rename to ultraSonic/src/main/res/drawable-xhdpi-v11/ic_stat_ultrasonic.png
diff --git a/res/drawable-xhdpi-v14/appwidget_dark_bg_trans.9.png b/ultraSonic/src/main/res/drawable-xhdpi-v14/appwidget_dark_bg_trans.9.png
similarity index 100%
rename from res/drawable-xhdpi-v14/appwidget_dark_bg_trans.9.png
rename to ultraSonic/src/main/res/drawable-xhdpi-v14/appwidget_dark_bg_trans.9.png
diff --git a/res/drawable-xhdpi-v14/menu_arrow.png b/ultraSonic/src/main/res/drawable-xhdpi-v14/menu_arrow.png
similarity index 100%
rename from res/drawable-xhdpi-v14/menu_arrow.png
rename to ultraSonic/src/main/res/drawable-xhdpi-v14/menu_arrow.png
diff --git a/res/drawable-xhdpi-v9/ic_stat_ultrasonic.png b/ultraSonic/src/main/res/drawable-xhdpi-v9/ic_stat_ultrasonic.png
similarity index 100%
rename from res/drawable-xhdpi-v9/ic_stat_ultrasonic.png
rename to ultraSonic/src/main/res/drawable-xhdpi-v9/ic_stat_ultrasonic.png
diff --git a/res/drawable-xhdpi/btn_check_off_focused_holo_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/btn_check_off_focused_holo_dark.png
similarity index 100%
rename from res/drawable-xhdpi/btn_check_off_focused_holo_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/btn_check_off_focused_holo_dark.png
diff --git a/res/drawable-xhdpi/btn_check_off_focused_holo_light.png b/ultraSonic/src/main/res/drawable-xhdpi/btn_check_off_focused_holo_light.png
similarity index 100%
rename from res/drawable-xhdpi/btn_check_off_focused_holo_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/btn_check_off_focused_holo_light.png
diff --git a/res/drawable-xhdpi/btn_check_off_holo_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/btn_check_off_holo_dark.png
similarity index 100%
rename from res/drawable-xhdpi/btn_check_off_holo_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/btn_check_off_holo_dark.png
diff --git a/res/drawable-xhdpi/btn_check_off_holo_light.png b/ultraSonic/src/main/res/drawable-xhdpi/btn_check_off_holo_light.png
similarity index 100%
rename from res/drawable-xhdpi/btn_check_off_holo_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/btn_check_off_holo_light.png
diff --git a/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png
similarity index 100%
rename from res/drawable-xhdpi/btn_check_on_focused_holo_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png
diff --git a/res/drawable-xhdpi/btn_check_on_focused_holo_light.png b/ultraSonic/src/main/res/drawable-xhdpi/btn_check_on_focused_holo_light.png
similarity index 100%
rename from res/drawable-xhdpi/btn_check_on_focused_holo_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/btn_check_on_focused_holo_light.png
diff --git a/res/drawable-xhdpi/btn_check_on_holo_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/btn_check_on_holo_dark.png
similarity index 100%
rename from res/drawable-xhdpi/btn_check_on_holo_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/btn_check_on_holo_dark.png
diff --git a/res/drawable-xhdpi/btn_check_on_holo_light.png b/ultraSonic/src/main/res/drawable-xhdpi/btn_check_on_holo_light.png
similarity index 100%
rename from res/drawable-xhdpi/btn_check_on_holo_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/btn_check_on_holo_light.png
diff --git a/res/drawable-xhdpi/ic_drag_queue.9.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_drag_queue.png
similarity index 100%
rename from res/drawable-xhdpi/ic_drag_queue.9.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_drag_queue.png
diff --git a/res/drawable-xhdpi/ic_launcher.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_launcher.png
similarity index 100%
rename from res/drawable-xhdpi/ic_launcher.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_launcher.png
diff --git a/res/drawable-xhdpi/ic_menu_about_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_about_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_about_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_about_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_about_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_about_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_about_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_about_light.png
diff --git a/res/drawable-xhdpi/ic_menu_add_to_queue_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_add_to_queue_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_add_to_queue_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_add_to_queue_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_add_to_queue_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_add_to_queue_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_add_to_queue_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_add_to_queue_light.png
diff --git a/res/drawable-xhdpi/ic_menu_backward_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_backward_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_backward_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_backward_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_backward_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_backward_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_backward_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_backward_light.png
diff --git a/res/drawable-xhdpi/ic_menu_bookmark_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_bookmark_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_bookmark_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_bookmark_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_bookmark_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_bookmark_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_bookmark_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_bookmark_light.png
diff --git a/res/drawable-xhdpi/ic_menu_browse_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_browse_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_browse_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_browse_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_browse_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_browse_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_browse_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_browse_light.png
diff --git a/res/drawable-xhdpi/ic_menu_chat_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_chat_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_chat_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_chat_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_chat_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_chat_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_chat_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_chat_light.png
diff --git a/res/drawable-xhdpi/ic_menu_chat_send_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_chat_send_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_chat_send_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_chat_send_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_chat_send_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_chat_send_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_chat_send_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_chat_send_light.png
diff --git a/res/drawable-xhdpi/ic_menu_exit_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_exit_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_exit_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_exit_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_exit_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_exit_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_exit_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_exit_light.png
diff --git a/res/drawable-xhdpi/ic_menu_forward_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_forward_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_forward_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_forward_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_forward_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_forward_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_forward_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_forward_light.png
diff --git a/res/drawable-xhdpi/ic_menu_help_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_help_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_help_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_help_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_help_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_help_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_help_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_help_light.png
diff --git a/res/drawable-xhdpi/ic_menu_home_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_home_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_home_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_home_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_home_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_home_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_home_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_home_light.png
diff --git a/res/drawable-xhdpi/ic_menu_pin.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_pin.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_pin.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_pin.png
diff --git a/res/drawable-xhdpi/ic_menu_playlists_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_playlists_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_playlists_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_playlists_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_playlists_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_playlists_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_playlists_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_playlists_light.png
diff --git a/res/drawable-xhdpi/ic_menu_remove_all_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_remove_all_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_remove_all_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_remove_all_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_remove_all_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_remove_all_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_remove_all_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_remove_all_light.png
diff --git a/res/drawable-xhdpi/ic_menu_save_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_save_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_save_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_save_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_save_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_save_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_save_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_save_light.png
diff --git a/res/drawable-xhdpi/ic_menu_screen_on_off_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_screen_on_off_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_screen_on_off_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_screen_on_off_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_screen_on_off_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_screen_on_off_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_screen_on_off_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_screen_on_off_light.png
diff --git a/res/drawable-xhdpi/ic_menu_search_holo_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_search_holo_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_search_holo_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_search_holo_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_search_holo_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_search_holo_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_search_holo_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_search_holo_light.png
diff --git a/res/drawable-xhdpi/ic_menu_select_all_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_select_all_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_select_all_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_select_all_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_select_all_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_select_all_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_select_all_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_select_all_light.png
diff --git a/res/drawable-xhdpi/ic_menu_select_folder_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_select_folder_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_select_folder_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_select_folder_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_select_folder_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_select_folder_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_select_folder_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_select_folder_light.png
diff --git a/res/drawable-xhdpi/ic_menu_settings_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_settings_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_settings_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_settings_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_settings_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_settings_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_settings_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_settings_light.png
diff --git a/res/drawable-xhdpi/ic_menu_share_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_share_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_share_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_share_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_share_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_share_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_share_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_share_light.png
diff --git a/res/drawable-xhdpi/ic_menu_unpin_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_unpin_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_unpin_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_unpin_dark.png
diff --git a/res/drawable-xhdpi/ic_menu_unpin_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_menu_unpin_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_menu_unpin_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_menu_unpin_light.png
diff --git a/res/drawable-xhdpi/ic_star_full_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_star_full_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_star_full_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_star_full_dark.png
diff --git a/res/drawable-xhdpi/ic_star_full_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_star_full_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_star_full_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_star_full_light.png
diff --git a/res/drawable-xhdpi/ic_star_hollow_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_star_hollow_dark.png
similarity index 100%
rename from res/drawable-xhdpi/ic_star_hollow_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_star_hollow_dark.png
diff --git a/res/drawable-xhdpi/ic_star_hollow_light.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_star_hollow_light.png
similarity index 100%
rename from res/drawable-xhdpi/ic_star_hollow_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_star_hollow_light.png
diff --git a/res/drawable-xhdpi/ic_stat_ultrasonic.png b/ultraSonic/src/main/res/drawable-xhdpi/ic_stat_ultrasonic.png
similarity index 100%
rename from res/drawable-xhdpi/ic_stat_ultrasonic.png
rename to ultraSonic/src/main/res/drawable-xhdpi/ic_stat_ultrasonic.png
diff --git a/res/drawable-xhdpi/md__list_focused_holo.9.png b/ultraSonic/src/main/res/drawable-xhdpi/md__list_focused_holo.9.png
similarity index 100%
rename from res/drawable-xhdpi/md__list_focused_holo.9.png
rename to ultraSonic/src/main/res/drawable-xhdpi/md__list_focused_holo.9.png
diff --git a/res/drawable-xhdpi/md__list_longpressed_holo.9.png b/ultraSonic/src/main/res/drawable-xhdpi/md__list_longpressed_holo.9.png
similarity index 100%
rename from res/drawable-xhdpi/md__list_longpressed_holo.9.png
rename to ultraSonic/src/main/res/drawable-xhdpi/md__list_longpressed_holo.9.png
diff --git a/res/drawable-xhdpi/md__list_pressed_holo_dark.9.png b/ultraSonic/src/main/res/drawable-xhdpi/md__list_pressed_holo_dark.9.png
similarity index 100%
rename from res/drawable-xhdpi/md__list_pressed_holo_dark.9.png
rename to ultraSonic/src/main/res/drawable-xhdpi/md__list_pressed_holo_dark.9.png
diff --git a/res/drawable-xhdpi/md__list_selector_disabled_holo_dark.9.png b/ultraSonic/src/main/res/drawable-xhdpi/md__list_selector_disabled_holo_dark.9.png
similarity index 100%
rename from res/drawable-xhdpi/md__list_selector_disabled_holo_dark.9.png
rename to ultraSonic/src/main/res/drawable-xhdpi/md__list_selector_disabled_holo_dark.9.png
diff --git a/res/drawable-xhdpi/media_backward_normal_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/media_backward_normal_dark.png
similarity index 100%
rename from res/drawable-xhdpi/media_backward_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_backward_normal_dark.png
diff --git a/res/drawable-xhdpi/media_backward_normal_light.png b/ultraSonic/src/main/res/drawable-xhdpi/media_backward_normal_light.png
similarity index 100%
rename from res/drawable-xhdpi/media_backward_normal_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_backward_normal_light.png
diff --git a/res/drawable-xhdpi/media_forward_normal_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/media_forward_normal_dark.png
similarity index 100%
rename from res/drawable-xhdpi/media_forward_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_forward_normal_dark.png
diff --git a/res/drawable-xhdpi/media_forward_normal_light.png b/ultraSonic/src/main/res/drawable-xhdpi/media_forward_normal_light.png
similarity index 100%
rename from res/drawable-xhdpi/media_forward_normal_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_forward_normal_light.png
diff --git a/res/drawable-xhdpi/media_pause_normal_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/media_pause_normal_dark.png
similarity index 100%
rename from res/drawable-xhdpi/media_pause_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_pause_normal_dark.png
diff --git a/res/drawable-xhdpi/media_pause_normal_light.png b/ultraSonic/src/main/res/drawable-xhdpi/media_pause_normal_light.png
similarity index 100%
rename from res/drawable-xhdpi/media_pause_normal_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_pause_normal_light.png
diff --git a/res/drawable-xhdpi/media_play_next.png b/ultraSonic/src/main/res/drawable-xhdpi/media_play_next.png
similarity index 100%
rename from res/drawable-xhdpi/media_play_next.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_play_next.png
diff --git a/res/drawable-xhdpi/media_repeat_all.png b/ultraSonic/src/main/res/drawable-xhdpi/media_repeat_all.png
similarity index 100%
rename from res/drawable-xhdpi/media_repeat_all.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_repeat_all.png
diff --git a/res/drawable-xhdpi/media_repeat_off_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/media_repeat_off_dark.png
similarity index 100%
rename from res/drawable-xhdpi/media_repeat_off_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_repeat_off_dark.png
diff --git a/res/drawable-xhdpi/media_repeat_off_light.png b/ultraSonic/src/main/res/drawable-xhdpi/media_repeat_off_light.png
similarity index 100%
rename from res/drawable-xhdpi/media_repeat_off_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_repeat_off_light.png
diff --git a/res/drawable-xhdpi/media_repeat_single.png b/ultraSonic/src/main/res/drawable-xhdpi/media_repeat_single.png
similarity index 100%
rename from res/drawable-xhdpi/media_repeat_single.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_repeat_single.png
diff --git a/res/drawable-xhdpi/media_shuffle_normal_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/media_shuffle_normal_dark.png
similarity index 100%
rename from res/drawable-xhdpi/media_shuffle_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_shuffle_normal_dark.png
diff --git a/res/drawable-xhdpi/media_shuffle_normal_light.png b/ultraSonic/src/main/res/drawable-xhdpi/media_shuffle_normal_light.png
similarity index 100%
rename from res/drawable-xhdpi/media_shuffle_normal_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_shuffle_normal_light.png
diff --git a/res/drawable-xhdpi/media_start_normal_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/media_start_normal_dark.png
similarity index 100%
rename from res/drawable-xhdpi/media_start_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_start_normal_dark.png
diff --git a/res/drawable-xhdpi/media_start_normal_light.png b/ultraSonic/src/main/res/drawable-xhdpi/media_start_normal_light.png
similarity index 100%
rename from res/drawable-xhdpi/media_start_normal_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_start_normal_light.png
diff --git a/res/drawable-xhdpi/media_stop_normal_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/media_stop_normal_dark.png
similarity index 100%
rename from res/drawable-xhdpi/media_stop_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_stop_normal_dark.png
diff --git a/res/drawable-xhdpi/media_stop_normal_light.png b/ultraSonic/src/main/res/drawable-xhdpi/media_stop_normal_light.png
similarity index 100%
rename from res/drawable-xhdpi/media_stop_normal_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_stop_normal_light.png
diff --git a/res/drawable-xhdpi/media_toggle_list_normal_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/media_toggle_list_normal_dark.png
similarity index 100%
rename from res/drawable-xhdpi/media_toggle_list_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_toggle_list_normal_dark.png
diff --git a/res/drawable-xhdpi/media_toggle_list_normal_light.png b/ultraSonic/src/main/res/drawable-xhdpi/media_toggle_list_normal_light.png
similarity index 100%
rename from res/drawable-xhdpi/media_toggle_list_normal_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/media_toggle_list_normal_light.png
diff --git a/res/drawable-xhdpi/menu_arrow.png b/ultraSonic/src/main/res/drawable-xhdpi/menu_arrow.png
similarity index 100%
rename from res/drawable-xhdpi/menu_arrow.png
rename to ultraSonic/src/main/res/drawable-xhdpi/menu_arrow.png
diff --git a/res/drawable-xhdpi/stat_sys_download_anim0_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim0_dark.png
similarity index 100%
rename from res/drawable-xhdpi/stat_sys_download_anim0_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim0_dark.png
diff --git a/res/drawable-xhdpi/stat_sys_download_anim0_light.png b/ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim0_light.png
similarity index 100%
rename from res/drawable-xhdpi/stat_sys_download_anim0_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim0_light.png
diff --git a/res/drawable-xhdpi/stat_sys_download_anim1_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim1_dark.png
similarity index 100%
rename from res/drawable-xhdpi/stat_sys_download_anim1_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim1_dark.png
diff --git a/res/drawable-xhdpi/stat_sys_download_anim1_light.png b/ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim1_light.png
similarity index 100%
rename from res/drawable-xhdpi/stat_sys_download_anim1_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim1_light.png
diff --git a/res/drawable-xhdpi/stat_sys_download_anim2_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim2_dark.png
similarity index 100%
rename from res/drawable-xhdpi/stat_sys_download_anim2_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim2_dark.png
diff --git a/res/drawable-xhdpi/stat_sys_download_anim2_light.png b/ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim2_light.png
similarity index 100%
rename from res/drawable-xhdpi/stat_sys_download_anim2_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim2_light.png
diff --git a/res/drawable-xhdpi/stat_sys_download_anim3_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim3_dark.png
similarity index 100%
rename from res/drawable-xhdpi/stat_sys_download_anim3_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim3_dark.png
diff --git a/res/drawable-xhdpi/stat_sys_download_anim3_light.png b/ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim3_light.png
similarity index 100%
rename from res/drawable-xhdpi/stat_sys_download_anim3_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim3_light.png
diff --git a/res/drawable-xhdpi/stat_sys_download_anim4_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim4_dark.png
similarity index 100%
rename from res/drawable-xhdpi/stat_sys_download_anim4_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim4_dark.png
diff --git a/res/drawable-xhdpi/stat_sys_download_anim4_light.png b/ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim4_light.png
similarity index 100%
rename from res/drawable-xhdpi/stat_sys_download_anim4_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim4_light.png
diff --git a/res/drawable-xhdpi/stat_sys_download_anim5_dark.png b/ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim5_dark.png
similarity index 100%
rename from res/drawable-xhdpi/stat_sys_download_anim5_dark.png
rename to ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim5_dark.png
diff --git a/res/drawable-xhdpi/stat_sys_download_anim5_light.png b/ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim5_light.png
similarity index 100%
rename from res/drawable-xhdpi/stat_sys_download_anim5_light.png
rename to ultraSonic/src/main/res/drawable-xhdpi/stat_sys_download_anim5_light.png
diff --git a/res/drawable-xxhdpi/btn_check_off_focused_holo_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/btn_check_off_focused_holo_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/btn_check_off_focused_holo_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/btn_check_off_focused_holo_dark.png
diff --git a/res/drawable-xxhdpi/btn_check_off_focused_holo_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/btn_check_off_focused_holo_light.png
similarity index 100%
rename from res/drawable-xxhdpi/btn_check_off_focused_holo_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/btn_check_off_focused_holo_light.png
diff --git a/res/drawable-xxhdpi/btn_check_off_holo_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/btn_check_off_holo_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/btn_check_off_holo_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/btn_check_off_holo_dark.png
diff --git a/res/drawable-xxhdpi/btn_check_off_holo_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/btn_check_off_holo_light.png
similarity index 100%
rename from res/drawable-xxhdpi/btn_check_off_holo_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/btn_check_off_holo_light.png
diff --git a/res/drawable-xxhdpi/btn_check_on_focused_holo_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/btn_check_on_focused_holo_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/btn_check_on_focused_holo_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/btn_check_on_focused_holo_dark.png
diff --git a/res/drawable-xxhdpi/btn_check_on_focused_holo_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/btn_check_on_focused_holo_light.png
similarity index 100%
rename from res/drawable-xxhdpi/btn_check_on_focused_holo_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/btn_check_on_focused_holo_light.png
diff --git a/res/drawable-xxhdpi/btn_check_on_holo_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/btn_check_on_holo_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/btn_check_on_holo_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/btn_check_on_holo_dark.png
diff --git a/res/drawable-xxhdpi/btn_check_on_holo_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/btn_check_on_holo_light.png
similarity index 100%
rename from res/drawable-xxhdpi/btn_check_on_holo_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/btn_check_on_holo_light.png
diff --git a/res/drawable-xxhdpi/ic_contact_picture.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_contact_picture.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_contact_picture.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_contact_picture.png
diff --git a/res/drawable-xxhdpi/ic_launcher.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_launcher.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_launcher.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_launcher.png
diff --git a/res/drawable-xxhdpi/ic_menu_about_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_about_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_about_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_about_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_about_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_about_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_about_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_about_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_add_to_queue_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_add_to_queue_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_add_to_queue_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_add_to_queue_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_add_to_queue_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_add_to_queue_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_add_to_queue_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_add_to_queue_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_backward_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_backward_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_backward_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_backward_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_backward_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_backward_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_backward_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_backward_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_bookmark_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_bookmark_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_bookmark_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_bookmark_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_bookmark_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_bookmark_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_bookmark_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_bookmark_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_browse_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_browse_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_browse_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_browse_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_browse_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_browse_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_browse_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_browse_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_chat_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_chat_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_chat_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_chat_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_chat_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_chat_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_chat_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_chat_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_chat_send_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_chat_send_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_chat_send_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_chat_send_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_chat_send_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_chat_send_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_chat_send_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_chat_send_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_exit_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_exit_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_exit_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_exit_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_exit_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_exit_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_exit_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_exit_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_forward_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_forward_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_forward_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_forward_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_forward_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_forward_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_forward_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_forward_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_help_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_help_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_help_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_help_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_help_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_help_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_help_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_help_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_home_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_home_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_home_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_home_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_home_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_home_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_home_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_home_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_playlists_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_playlists_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_playlists_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_playlists_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_playlists_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_playlists_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_playlists_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_playlists_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_remove_all_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_remove_all_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_remove_all_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_remove_all_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_remove_all_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_remove_all_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_remove_all_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_remove_all_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_save_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_save_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_save_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_save_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_save_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_save_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_save_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_save_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_screen_on_off_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_screen_on_off_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_screen_on_off_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_screen_on_off_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_screen_on_off_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_screen_on_off_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_screen_on_off_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_screen_on_off_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_search_holo_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_search_holo_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_search_holo_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_search_holo_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_search_holo_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_search_holo_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_search_holo_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_search_holo_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_select_all_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_select_all_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_select_all_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_select_all_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_select_all_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_select_all_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_select_all_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_select_all_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_select_folder_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_select_folder_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_select_folder_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_select_folder_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_select_folder_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_select_folder_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_select_folder_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_select_folder_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_settings_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_settings_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_settings_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_settings_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_settings_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_settings_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_settings_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_settings_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_share_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_share_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_share_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_share_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_share_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_share_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_share_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_share_light.png
diff --git a/res/drawable-xxhdpi/ic_menu_unpin_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_unpin_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_unpin_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_unpin_dark.png
diff --git a/res/drawable-xxhdpi/ic_menu_unpin_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_unpin_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_menu_unpin_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_menu_unpin_light.png
diff --git a/res/drawable-xxhdpi/ic_star_full_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_star_full_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_star_full_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_star_full_dark.png
diff --git a/res/drawable-xxhdpi/ic_star_full_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_star_full_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_star_full_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_star_full_light.png
diff --git a/res/drawable-xxhdpi/ic_star_hollow_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_star_hollow_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_star_hollow_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_star_hollow_dark.png
diff --git a/res/drawable-xxhdpi/ic_star_hollow_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/ic_star_hollow_light.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_star_hollow_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/ic_star_hollow_light.png
diff --git a/res/drawable-xxhdpi/media_backward_normal_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_backward_normal_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/media_backward_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_backward_normal_dark.png
diff --git a/res/drawable-xxhdpi/media_backward_normal_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_backward_normal_light.png
similarity index 100%
rename from res/drawable-xxhdpi/media_backward_normal_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_backward_normal_light.png
diff --git a/res/drawable-xxhdpi/media_forward_normal_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_forward_normal_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/media_forward_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_forward_normal_dark.png
diff --git a/res/drawable-xxhdpi/media_forward_normal_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_forward_normal_light.png
similarity index 100%
rename from res/drawable-xxhdpi/media_forward_normal_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_forward_normal_light.png
diff --git a/res/drawable-xxhdpi/media_pause_normal_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_pause_normal_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/media_pause_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_pause_normal_dark.png
diff --git a/res/drawable-xxhdpi/media_pause_normal_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_pause_normal_light.png
similarity index 100%
rename from res/drawable-xxhdpi/media_pause_normal_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_pause_normal_light.png
diff --git a/res/drawable-xxhdpi/media_repeat_off_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_repeat_off_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/media_repeat_off_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_repeat_off_dark.png
diff --git a/res/drawable-xxhdpi/media_repeat_off_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_repeat_off_light.png
similarity index 100%
rename from res/drawable-xxhdpi/media_repeat_off_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_repeat_off_light.png
diff --git a/res/drawable-xxhdpi/media_shuffle_normal_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_shuffle_normal_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/media_shuffle_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_shuffle_normal_dark.png
diff --git a/res/drawable-xxhdpi/media_shuffle_normal_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_shuffle_normal_light.png
similarity index 100%
rename from res/drawable-xxhdpi/media_shuffle_normal_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_shuffle_normal_light.png
diff --git a/res/drawable-xxhdpi/media_start_normal_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_start_normal_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/media_start_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_start_normal_dark.png
diff --git a/res/drawable-xxhdpi/media_start_normal_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_start_normal_light.png
similarity index 100%
rename from res/drawable-xxhdpi/media_start_normal_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_start_normal_light.png
diff --git a/res/drawable-xxhdpi/media_stop_normal_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_stop_normal_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/media_stop_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_stop_normal_dark.png
diff --git a/res/drawable-xxhdpi/media_stop_normal_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_stop_normal_light.png
similarity index 100%
rename from res/drawable-xxhdpi/media_stop_normal_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_stop_normal_light.png
diff --git a/res/drawable-xxhdpi/media_toggle_list_normal_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_toggle_list_normal_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/media_toggle_list_normal_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_toggle_list_normal_dark.png
diff --git a/res/drawable-xxhdpi/media_toggle_list_normal_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/media_toggle_list_normal_light.png
similarity index 100%
rename from res/drawable-xxhdpi/media_toggle_list_normal_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/media_toggle_list_normal_light.png
diff --git a/res/drawable-xxhdpi/stat_sys_download_anim0_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim0_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/stat_sys_download_anim0_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim0_dark.png
diff --git a/res/drawable-xxhdpi/stat_sys_download_anim0_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim0_light.png
similarity index 100%
rename from res/drawable-xxhdpi/stat_sys_download_anim0_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim0_light.png
diff --git a/res/drawable-xxhdpi/stat_sys_download_anim1_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim1_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/stat_sys_download_anim1_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim1_dark.png
diff --git a/res/drawable-xxhdpi/stat_sys_download_anim1_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim1_light.png
similarity index 100%
rename from res/drawable-xxhdpi/stat_sys_download_anim1_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim1_light.png
diff --git a/res/drawable-xxhdpi/stat_sys_download_anim2_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim2_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/stat_sys_download_anim2_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim2_dark.png
diff --git a/res/drawable-xxhdpi/stat_sys_download_anim2_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim2_light.png
similarity index 100%
rename from res/drawable-xxhdpi/stat_sys_download_anim2_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim2_light.png
diff --git a/res/drawable-xxhdpi/stat_sys_download_anim3_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim3_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/stat_sys_download_anim3_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim3_dark.png
diff --git a/res/drawable-xxhdpi/stat_sys_download_anim3_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim3_light.png
similarity index 100%
rename from res/drawable-xxhdpi/stat_sys_download_anim3_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim3_light.png
diff --git a/res/drawable-xxhdpi/stat_sys_download_anim4_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim4_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/stat_sys_download_anim4_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim4_dark.png
diff --git a/res/drawable-xxhdpi/stat_sys_download_anim4_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim4_light.png
similarity index 100%
rename from res/drawable-xxhdpi/stat_sys_download_anim4_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim4_light.png
diff --git a/res/drawable-xxhdpi/stat_sys_download_anim5_dark.png b/ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim5_dark.png
similarity index 100%
rename from res/drawable-xxhdpi/stat_sys_download_anim5_dark.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim5_dark.png
diff --git a/res/drawable-xxhdpi/stat_sys_download_anim5_light.png b/ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim5_light.png
similarity index 100%
rename from res/drawable-xxhdpi/stat_sys_download_anim5_light.png
rename to ultraSonic/src/main/res/drawable-xxhdpi/stat_sys_download_anim5_light.png
diff --git a/res/drawable-xxxhdpi/ic_launcher.png b/ultraSonic/src/main/res/drawable-xxxhdpi/ic_launcher.png
similarity index 100%
rename from res/drawable-xxxhdpi/ic_launcher.png
rename to ultraSonic/src/main/res/drawable-xxxhdpi/ic_launcher.png
diff --git a/res/drawable/btn_bg.xml b/ultraSonic/src/main/res/drawable/btn_bg.xml
similarity index 100%
rename from res/drawable/btn_bg.xml
rename to ultraSonic/src/main/res/drawable/btn_bg.xml
diff --git a/res/drawable/btn_check_custom_dark.xml b/ultraSonic/src/main/res/drawable/btn_check_custom_dark.xml
similarity index 100%
rename from res/drawable/btn_check_custom_dark.xml
rename to ultraSonic/src/main/res/drawable/btn_check_custom_dark.xml
diff --git a/res/drawable/btn_check_custom_light.xml b/ultraSonic/src/main/res/drawable/btn_check_custom_light.xml
similarity index 100%
rename from res/drawable/btn_check_custom_light.xml
rename to ultraSonic/src/main/res/drawable/btn_check_custom_light.xml
diff --git a/res/drawable/drop_shadow.xml b/ultraSonic/src/main/res/drawable/drop_shadow.xml
similarity index 100%
rename from res/drawable/drop_shadow.xml
rename to ultraSonic/src/main/res/drawable/drop_shadow.xml
diff --git a/res/drawable/list_selector_background_transition_holo_dark.xml b/ultraSonic/src/main/res/drawable/list_selector_background_transition_holo_dark.xml
similarity index 100%
rename from res/drawable/list_selector_background_transition_holo_dark.xml
rename to ultraSonic/src/main/res/drawable/list_selector_background_transition_holo_dark.xml
diff --git a/res/drawable/list_selector_background_transition_holo_light.xml b/ultraSonic/src/main/res/drawable/list_selector_background_transition_holo_light.xml
similarity index 100%
rename from res/drawable/list_selector_background_transition_holo_light.xml
rename to ultraSonic/src/main/res/drawable/list_selector_background_transition_holo_light.xml
diff --git a/res/drawable/list_selector_holo_dark.xml b/ultraSonic/src/main/res/drawable/list_selector_holo_dark.xml
similarity index 100%
rename from res/drawable/list_selector_holo_dark.xml
rename to ultraSonic/src/main/res/drawable/list_selector_holo_dark.xml
diff --git a/res/drawable/list_selector_holo_light.xml b/ultraSonic/src/main/res/drawable/list_selector_holo_light.xml
similarity index 100%
rename from res/drawable/list_selector_holo_light.xml
rename to ultraSonic/src/main/res/drawable/list_selector_holo_light.xml
diff --git a/res/drawable/md__list_selector_background_transition_holo_dark.xml b/ultraSonic/src/main/res/drawable/md__list_selector_background_transition_holo_dark.xml
similarity index 100%
rename from res/drawable/md__list_selector_background_transition_holo_dark.xml
rename to ultraSonic/src/main/res/drawable/md__list_selector_background_transition_holo_dark.xml
diff --git a/res/drawable/md__list_selector_holo_dark.xml b/ultraSonic/src/main/res/drawable/md__list_selector_holo_dark.xml
similarity index 100%
rename from res/drawable/md__list_selector_holo_dark.xml
rename to ultraSonic/src/main/res/drawable/md__list_selector_holo_dark.xml
diff --git a/res/drawable/progress_horizontal_holo_dark.xml b/ultraSonic/src/main/res/drawable/progress_horizontal_holo_dark.xml
similarity index 100%
rename from res/drawable/progress_horizontal_holo_dark.xml
rename to ultraSonic/src/main/res/drawable/progress_horizontal_holo_dark.xml
diff --git a/res/drawable/stat_sys_download_dark.xml b/ultraSonic/src/main/res/drawable/stat_sys_download_dark.xml
similarity index 100%
rename from res/drawable/stat_sys_download_dark.xml
rename to ultraSonic/src/main/res/drawable/stat_sys_download_dark.xml
diff --git a/res/drawable/stat_sys_download_light.xml b/ultraSonic/src/main/res/drawable/stat_sys_download_light.xml
similarity index 100%
rename from res/drawable/stat_sys_download_light.xml
rename to ultraSonic/src/main/res/drawable/stat_sys_download_light.xml
diff --git a/res/layout-land/download.xml b/ultraSonic/src/main/res/layout-land/download.xml
similarity index 100%
rename from res/layout-land/download.xml
rename to ultraSonic/src/main/res/layout-land/download.xml
diff --git a/res/layout-port/download.xml b/ultraSonic/src/main/res/layout-port/download.xml
similarity index 100%
rename from res/layout-port/download.xml
rename to ultraSonic/src/main/res/layout-port/download.xml
diff --git a/res/layout/album_buttons.xml b/ultraSonic/src/main/res/layout/album_buttons.xml
similarity index 100%
rename from res/layout/album_buttons.xml
rename to ultraSonic/src/main/res/layout/album_buttons.xml
diff --git a/res/layout/album_list_item.xml b/ultraSonic/src/main/res/layout/album_list_item.xml
similarity index 100%
rename from res/layout/album_list_item.xml
rename to ultraSonic/src/main/res/layout/album_list_item.xml
diff --git a/res/layout/appwidget4x1.xml b/ultraSonic/src/main/res/layout/appwidget4x1.xml
similarity index 100%
rename from res/layout/appwidget4x1.xml
rename to ultraSonic/src/main/res/layout/appwidget4x1.xml
diff --git a/res/layout/appwidget4x2.xml b/ultraSonic/src/main/res/layout/appwidget4x2.xml
similarity index 100%
rename from res/layout/appwidget4x2.xml
rename to ultraSonic/src/main/res/layout/appwidget4x2.xml
diff --git a/res/layout/appwidget4x3.xml b/ultraSonic/src/main/res/layout/appwidget4x3.xml
similarity index 100%
rename from res/layout/appwidget4x3.xml
rename to ultraSonic/src/main/res/layout/appwidget4x3.xml
diff --git a/res/layout/appwidget4x4.xml b/ultraSonic/src/main/res/layout/appwidget4x4.xml
similarity index 100%
rename from res/layout/appwidget4x4.xml
rename to ultraSonic/src/main/res/layout/appwidget4x4.xml
diff --git a/res/layout/artist_list_item.xml b/ultraSonic/src/main/res/layout/artist_list_item.xml
similarity index 100%
rename from res/layout/artist_list_item.xml
rename to ultraSonic/src/main/res/layout/artist_list_item.xml
diff --git a/res/layout/chat.xml b/ultraSonic/src/main/res/layout/chat.xml
similarity index 100%
rename from res/layout/chat.xml
rename to ultraSonic/src/main/res/layout/chat.xml
diff --git a/res/layout/chat_item.xml b/ultraSonic/src/main/res/layout/chat_item.xml
similarity index 100%
rename from res/layout/chat_item.xml
rename to ultraSonic/src/main/res/layout/chat_item.xml
diff --git a/res/layout/chat_item_reverse.xml b/ultraSonic/src/main/res/layout/chat_item_reverse.xml
similarity index 100%
rename from res/layout/chat_item_reverse.xml
rename to ultraSonic/src/main/res/layout/chat_item_reverse.xml
diff --git a/res/layout/download_button_bar_flipper.xml b/ultraSonic/src/main/res/layout/download_button_bar_flipper.xml
similarity index 100%
rename from res/layout/download_button_bar_flipper.xml
rename to ultraSonic/src/main/res/layout/download_button_bar_flipper.xml
diff --git a/res/layout/download_playlist.xml b/ultraSonic/src/main/res/layout/download_playlist.xml
similarity index 100%
rename from res/layout/download_playlist.xml
rename to ultraSonic/src/main/res/layout/download_playlist.xml
diff --git a/res/layout/download_slider.xml b/ultraSonic/src/main/res/layout/download_slider.xml
similarity index 100%
rename from res/layout/download_slider.xml
rename to ultraSonic/src/main/res/layout/download_slider.xml
diff --git a/res/layout/equalizer.xml b/ultraSonic/src/main/res/layout/equalizer.xml
similarity index 100%
rename from res/layout/equalizer.xml
rename to ultraSonic/src/main/res/layout/equalizer.xml
diff --git a/res/layout/equalizer_bar.xml b/ultraSonic/src/main/res/layout/equalizer_bar.xml
similarity index 100%
rename from res/layout/equalizer_bar.xml
rename to ultraSonic/src/main/res/layout/equalizer_bar.xml
diff --git a/res/layout/help.xml b/ultraSonic/src/main/res/layout/help.xml
similarity index 97%
rename from res/layout/help.xml
rename to ultraSonic/src/main/res/layout/help.xml
index 4009c003..33c7e55d 100644
--- a/res/layout/help.xml
+++ b/ultraSonic/src/main/res/layout/help.xml
@@ -1,4 +1,4 @@
-
+
diff --git a/res/layout/jukebox_volume.xml b/ultraSonic/src/main/res/layout/jukebox_volume.xml
similarity index 100%
rename from res/layout/jukebox_volume.xml
rename to ultraSonic/src/main/res/layout/jukebox_volume.xml
diff --git a/res/layout/lyrics.xml b/ultraSonic/src/main/res/layout/lyrics.xml
similarity index 100%
rename from res/layout/lyrics.xml
rename to ultraSonic/src/main/res/layout/lyrics.xml
diff --git a/res/layout/main.xml b/ultraSonic/src/main/res/layout/main.xml
similarity index 100%
rename from res/layout/main.xml
rename to ultraSonic/src/main/res/layout/main.xml
diff --git a/res/layout/main_buttons.xml b/ultraSonic/src/main/res/layout/main_buttons.xml
similarity index 100%
rename from res/layout/main_buttons.xml
rename to ultraSonic/src/main/res/layout/main_buttons.xml
diff --git a/res/layout/media_buttons.xml b/ultraSonic/src/main/res/layout/media_buttons.xml
similarity index 100%
rename from res/layout/media_buttons.xml
rename to ultraSonic/src/main/res/layout/media_buttons.xml
diff --git a/res/layout/menu_main.xml b/ultraSonic/src/main/res/layout/menu_main.xml
similarity index 100%
rename from res/layout/menu_main.xml
rename to ultraSonic/src/main/res/layout/menu_main.xml
diff --git a/res/layout/notification.xml b/ultraSonic/src/main/res/layout/notification.xml
similarity index 100%
rename from res/layout/notification.xml
rename to ultraSonic/src/main/res/layout/notification.xml
diff --git a/res/layout/notification_large.xml b/ultraSonic/src/main/res/layout/notification_large.xml
similarity index 100%
rename from res/layout/notification_large.xml
rename to ultraSonic/src/main/res/layout/notification_large.xml
diff --git a/res/layout/now_playing.xml b/ultraSonic/src/main/res/layout/now_playing.xml
similarity index 100%
rename from res/layout/now_playing.xml
rename to ultraSonic/src/main/res/layout/now_playing.xml
diff --git a/res/layout/playlist_list_item.xml b/ultraSonic/src/main/res/layout/playlist_list_item.xml
similarity index 100%
rename from res/layout/playlist_list_item.xml
rename to ultraSonic/src/main/res/layout/playlist_list_item.xml
diff --git a/res/layout/save_playlist.xml b/ultraSonic/src/main/res/layout/save_playlist.xml
similarity index 100%
rename from res/layout/save_playlist.xml
rename to ultraSonic/src/main/res/layout/save_playlist.xml
diff --git a/res/layout/search.xml b/ultraSonic/src/main/res/layout/search.xml
similarity index 100%
rename from res/layout/search.xml
rename to ultraSonic/src/main/res/layout/search.xml
diff --git a/res/layout/search_buttons.xml b/ultraSonic/src/main/res/layout/search_buttons.xml
similarity index 100%
rename from res/layout/search_buttons.xml
rename to ultraSonic/src/main/res/layout/search_buttons.xml
diff --git a/res/layout/select_album.xml b/ultraSonic/src/main/res/layout/select_album.xml
similarity index 100%
rename from res/layout/select_album.xml
rename to ultraSonic/src/main/res/layout/select_album.xml
diff --git a/res/layout/select_album_header.xml b/ultraSonic/src/main/res/layout/select_album_header.xml
similarity index 100%
rename from res/layout/select_album_header.xml
rename to ultraSonic/src/main/res/layout/select_album_header.xml
diff --git a/res/layout/select_artist.xml b/ultraSonic/src/main/res/layout/select_artist.xml
similarity index 100%
rename from res/layout/select_artist.xml
rename to ultraSonic/src/main/res/layout/select_artist.xml
diff --git a/res/layout/select_artist_header.xml b/ultraSonic/src/main/res/layout/select_artist_header.xml
similarity index 100%
rename from res/layout/select_artist_header.xml
rename to ultraSonic/src/main/res/layout/select_artist_header.xml
diff --git a/res/layout/select_genre.xml b/ultraSonic/src/main/res/layout/select_genre.xml
similarity index 100%
rename from res/layout/select_genre.xml
rename to ultraSonic/src/main/res/layout/select_genre.xml
diff --git a/res/layout/select_playlist.xml b/ultraSonic/src/main/res/layout/select_playlist.xml
similarity index 100%
rename from res/layout/select_playlist.xml
rename to ultraSonic/src/main/res/layout/select_playlist.xml
diff --git a/res/layout/select_share.xml b/ultraSonic/src/main/res/layout/select_share.xml
similarity index 100%
rename from res/layout/select_share.xml
rename to ultraSonic/src/main/res/layout/select_share.xml
diff --git a/res/layout/share_details.xml b/ultraSonic/src/main/res/layout/share_details.xml
similarity index 100%
rename from res/layout/share_details.xml
rename to ultraSonic/src/main/res/layout/share_details.xml
diff --git a/res/layout/share_list_item.xml b/ultraSonic/src/main/res/layout/share_list_item.xml
similarity index 100%
rename from res/layout/share_list_item.xml
rename to ultraSonic/src/main/res/layout/share_list_item.xml
diff --git a/res/layout/song_details.xml b/ultraSonic/src/main/res/layout/song_details.xml
similarity index 100%
rename from res/layout/song_details.xml
rename to ultraSonic/src/main/res/layout/song_details.xml
diff --git a/res/layout/song_list_item.xml b/ultraSonic/src/main/res/layout/song_list_item.xml
similarity index 100%
rename from res/layout/song_list_item.xml
rename to ultraSonic/src/main/res/layout/song_list_item.xml
diff --git a/res/layout/tab_progress.xml b/ultraSonic/src/main/res/layout/tab_progress.xml
similarity index 100%
rename from res/layout/tab_progress.xml
rename to ultraSonic/src/main/res/layout/tab_progress.xml
diff --git a/res/layout/time_span_dialog.xml b/ultraSonic/src/main/res/layout/time_span_dialog.xml
similarity index 100%
rename from res/layout/time_span_dialog.xml
rename to ultraSonic/src/main/res/layout/time_span_dialog.xml
diff --git a/res/layout/update_playlist.xml b/ultraSonic/src/main/res/layout/update_playlist.xml
similarity index 100%
rename from res/layout/update_playlist.xml
rename to ultraSonic/src/main/res/layout/update_playlist.xml
diff --git a/res/layout/video_details.xml b/ultraSonic/src/main/res/layout/video_details.xml
similarity index 100%
rename from res/layout/video_details.xml
rename to ultraSonic/src/main/res/layout/video_details.xml
diff --git a/res/layout/video_list_item.xml b/ultraSonic/src/main/res/layout/video_list_item.xml
similarity index 100%
rename from res/layout/video_list_item.xml
rename to ultraSonic/src/main/res/layout/video_list_item.xml
diff --git a/res/menu/main.xml b/ultraSonic/src/main/res/menu/main.xml
similarity index 100%
rename from res/menu/main.xml
rename to ultraSonic/src/main/res/menu/main.xml
diff --git a/res/menu/nowplaying.xml b/ultraSonic/src/main/res/menu/nowplaying.xml
similarity index 100%
rename from res/menu/nowplaying.xml
rename to ultraSonic/src/main/res/menu/nowplaying.xml
diff --git a/res/menu/nowplaying_context.xml b/ultraSonic/src/main/res/menu/nowplaying_context.xml
similarity index 100%
rename from res/menu/nowplaying_context.xml
rename to ultraSonic/src/main/res/menu/nowplaying_context.xml
diff --git a/res/menu/select_album.xml b/ultraSonic/src/main/res/menu/select_album.xml
similarity index 100%
rename from res/menu/select_album.xml
rename to ultraSonic/src/main/res/menu/select_album.xml
diff --git a/res/menu/select_album_context.xml b/ultraSonic/src/main/res/menu/select_album_context.xml
similarity index 100%
rename from res/menu/select_album_context.xml
rename to ultraSonic/src/main/res/menu/select_album_context.xml
diff --git a/res/menu/select_artist_context.xml b/ultraSonic/src/main/res/menu/select_artist_context.xml
similarity index 100%
rename from res/menu/select_artist_context.xml
rename to ultraSonic/src/main/res/menu/select_artist_context.xml
diff --git a/res/menu/select_playlist_context.xml b/ultraSonic/src/main/res/menu/select_playlist_context.xml
similarity index 100%
rename from res/menu/select_playlist_context.xml
rename to ultraSonic/src/main/res/menu/select_playlist_context.xml
diff --git a/res/menu/select_playlist_context_offline.xml b/ultraSonic/src/main/res/menu/select_playlist_context_offline.xml
similarity index 100%
rename from res/menu/select_playlist_context_offline.xml
rename to ultraSonic/src/main/res/menu/select_playlist_context_offline.xml
diff --git a/res/menu/select_share_context.xml b/ultraSonic/src/main/res/menu/select_share_context.xml
similarity index 100%
rename from res/menu/select_share_context.xml
rename to ultraSonic/src/main/res/menu/select_share_context.xml
diff --git a/res/menu/select_song_context.xml b/ultraSonic/src/main/res/menu/select_song_context.xml
similarity index 100%
rename from res/menu/select_song_context.xml
rename to ultraSonic/src/main/res/menu/select_song_context.xml
diff --git a/res/values-es/strings.xml b/ultraSonic/src/main/res/values-es/strings.xml
similarity index 100%
rename from res/values-es/strings.xml
rename to ultraSonic/src/main/res/values-es/strings.xml
diff --git a/res/values-fr/strings.xml b/ultraSonic/src/main/res/values-fr/strings.xml
similarity index 100%
rename from res/values-fr/strings.xml
rename to ultraSonic/src/main/res/values-fr/strings.xml
diff --git a/res/values-hu/strings.xml b/ultraSonic/src/main/res/values-hu/strings.xml
similarity index 100%
rename from res/values-hu/strings.xml
rename to ultraSonic/src/main/res/values-hu/strings.xml
diff --git a/res/values/arrays.xml b/ultraSonic/src/main/res/values/arrays.xml
similarity index 100%
rename from res/values/arrays.xml
rename to ultraSonic/src/main/res/values/arrays.xml
diff --git a/res/values/colors.xml b/ultraSonic/src/main/res/values/colors.xml
similarity index 100%
rename from res/values/colors.xml
rename to ultraSonic/src/main/res/values/colors.xml
diff --git a/res/values/strings.xml b/ultraSonic/src/main/res/values/strings.xml
similarity index 100%
rename from res/values/strings.xml
rename to ultraSonic/src/main/res/values/strings.xml
diff --git a/res/values/styles.xml b/ultraSonic/src/main/res/values/styles.xml
similarity index 100%
rename from res/values/styles.xml
rename to ultraSonic/src/main/res/values/styles.xml
diff --git a/res/values/themes.xml b/ultraSonic/src/main/res/values/themes.xml
similarity index 100%
rename from res/values/themes.xml
rename to ultraSonic/src/main/res/values/themes.xml
diff --git a/res/xml/appwidget_info_4x1.xml b/ultraSonic/src/main/res/xml/appwidget_info_4x1.xml
similarity index 100%
rename from res/xml/appwidget_info_4x1.xml
rename to ultraSonic/src/main/res/xml/appwidget_info_4x1.xml
diff --git a/res/xml/appwidget_info_4x2.xml b/ultraSonic/src/main/res/xml/appwidget_info_4x2.xml
similarity index 100%
rename from res/xml/appwidget_info_4x2.xml
rename to ultraSonic/src/main/res/xml/appwidget_info_4x2.xml
diff --git a/res/xml/appwidget_info_4x3.xml b/ultraSonic/src/main/res/xml/appwidget_info_4x3.xml
similarity index 100%
rename from res/xml/appwidget_info_4x3.xml
rename to ultraSonic/src/main/res/xml/appwidget_info_4x3.xml
diff --git a/res/xml/appwidget_info_4x4.xml b/ultraSonic/src/main/res/xml/appwidget_info_4x4.xml
similarity index 100%
rename from res/xml/appwidget_info_4x4.xml
rename to ultraSonic/src/main/res/xml/appwidget_info_4x4.xml
diff --git a/res/xml/searchable.xml b/ultraSonic/src/main/res/xml/searchable.xml
similarity index 100%
rename from res/xml/searchable.xml
rename to ultraSonic/src/main/res/xml/searchable.xml
diff --git a/res/xml/settings.xml b/ultraSonic/src/main/res/xml/settings.xml
similarity index 100%
rename from res/xml/settings.xml
rename to ultraSonic/src/main/res/xml/settings.xml
diff --git a/ultraSonic/ultraSonic.iml b/ultraSonic/ultraSonic.iml
new file mode 100644
index 00000000..f93e3114
--- /dev/null
+++ b/ultraSonic/ultraSonic.iml
@@ -0,0 +1,94 @@
+
+
+
+
+
+