diff --git a/.classpath b/.classpath deleted file mode 100644 index d57ec025..00000000 --- a/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e1e7512a..00000000 --- a/.gitmodules +++ /dev/null @@ -1,10 +0,0 @@ -[submodule "menudrawer"] - path = menudrawer - url = git://github.com/SimonVT/android-menudrawer.git - branch = master -[submodule "pulltorefresh"] - path = pulltorefresh - url = git://github.com/chrisbanes/Android-PullToRefresh.git -[submodule "drag-sort-listview"] - path = drag-sort-listview - url = https://github.com/bauerca/drag-sort-listview diff --git a/.gradle/2.2.1/taskArtifacts/cache.properties b/.gradle/2.2.1/taskArtifacts/cache.properties new file mode 100644 index 00000000..9113aa8f --- /dev/null +++ b/.gradle/2.2.1/taskArtifacts/cache.properties @@ -0,0 +1 @@ +#Sun Jul 26 16:05:14 CEST 2015 diff --git a/.gradle/2.2.1/taskArtifacts/cache.properties.lock b/.gradle/2.2.1/taskArtifacts/cache.properties.lock new file mode 100644 index 00000000..0d5e2264 Binary files /dev/null and b/.gradle/2.2.1/taskArtifacts/cache.properties.lock differ diff --git a/.gradle/2.2.1/taskArtifacts/fileHashes.bin b/.gradle/2.2.1/taskArtifacts/fileHashes.bin new file mode 100644 index 00000000..e2745054 Binary files /dev/null and b/.gradle/2.2.1/taskArtifacts/fileHashes.bin differ diff --git a/.gradle/2.2.1/taskArtifacts/fileSnapshots.bin b/.gradle/2.2.1/taskArtifacts/fileSnapshots.bin new file mode 100644 index 00000000..f94029c2 Binary files /dev/null and b/.gradle/2.2.1/taskArtifacts/fileSnapshots.bin differ diff --git a/.gradle/2.2.1/taskArtifacts/outputFileStates.bin b/.gradle/2.2.1/taskArtifacts/outputFileStates.bin new file mode 100644 index 00000000..57173cad Binary files /dev/null and b/.gradle/2.2.1/taskArtifacts/outputFileStates.bin differ diff --git a/.gradle/2.2.1/taskArtifacts/taskArtifacts.bin b/.gradle/2.2.1/taskArtifacts/taskArtifacts.bin new file mode 100644 index 00000000..609f5a68 Binary files /dev/null and b/.gradle/2.2.1/taskArtifacts/taskArtifacts.bin differ diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml deleted file mode 100644 index 02dca3c6..00000000 --- a/.idea/codeStyleSettings.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 1e803a11..96cc43ef 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,12 +1,6 @@ - - - + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml index 3572571a..e7bedf33 100644 --- a/.idea/copyright/profiles_settings.xml +++ b/.idea/copyright/profiles_settings.xml @@ -1,5 +1,3 @@ - - - + \ No newline at end of file diff --git a/.idea/dictionaries/Josh.xml b/.idea/dictionaries/Josh.xml deleted file mode 100644 index f62fffec..00000000 --- a/.idea/dictionaries/Josh.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - bahnsen - bitrate - deserialize - deserialized - gapless - looper - playlists - transcoded - vizualizer - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index ead65380..00000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 00000000..e2983526 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 75f8076d..00000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index c60c33bb..00000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/libraries/pulltorefresh_pulltorefresh.xml b/.idea/libraries/pulltorefresh_pulltorefresh.xml new file mode 100644 index 00000000..765e02e7 --- /dev/null +++ b/.idea/libraries/pulltorefresh_pulltorefresh.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/support_v4_18_0_0.xml b/.idea/libraries/support_v4_18_0_0.xml new file mode 100644 index 00000000..645ed891 --- /dev/null +++ b/.idea/libraries/support_v4_18_0_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 0c812c3e..eafd593a 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,11 +2,11 @@ - - - - + + + + + - - + \ No newline at end of file diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml deleted file mode 100644 index 922003b8..00000000 --- a/.idea/scopes/scope_settings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index c80f2198..6564d52d 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,7 +1,6 @@ - + - - + \ No newline at end of file diff --git a/.project b/.project deleted file mode 100644 index 01021a7c..00000000 --- a/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - UltraSonic - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/Subsonic-Android.iml b/Subsonic-Android.iml deleted file mode 100644 index 12768e7b..00000000 --- a/Subsonic-Android.iml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/UltrasSonic.iml b/UltrasSonic.iml new file mode 100644 index 00000000..3fcb0258 --- /dev/null +++ b/UltrasSonic.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ 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 @@ - - - - - - - - - - - - - - - - - - - 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 @@ - - - - - - - - - - - - - - - - - - - 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file