From 094d2146497997cd1f6779a9b5c3c7ce239b5435 Mon Sep 17 00:00:00 2001 From: Jake Wharton Date: Wed, 13 Nov 2013 00:29:09 +0100 Subject: [PATCH] Initial commit of empty shell. --- .gitignore | 6 + README.md | 3 + app_icon_web.png | Bin 0 -> 94086 bytes build.gradle | 81 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 +++++ gradlew.bat | 90 +++ src/debug/AndroidManifest.xml | 10 + .../jakewharton/u2020/DebugU2020Module.java | 14 + .../java/com/jakewharton/u2020/Modules.java | 14 + .../u2020/data/AnimationSpeed.java | 10 + .../u2020/data/DebugDataModule.java | 83 +++ .../com/jakewharton/u2020/data/Endpoint.java | 10 + .../com/jakewharton/u2020/data/Endpoints.java | 31 + .../jakewharton/u2020/data/IsMockMode.java | 10 + .../u2020/data/MockDownloader.java | 75 +++ .../jakewharton/u2020/data/NetworkProxy.java | 10 + .../u2020/data/PicassoDebugging.java | 10 + .../u2020/data/api/DebugApiModule.java | 33 + .../u2020/data/api/MockGalleryService.java | 10 + .../jakewharton/u2020/ui/DebugUiModule.java | 22 + .../u2020/ui/debug/AnimationSpeedAdapter.java | 57 ++ .../ui/debug/ContextualDebugActions.java | 103 +++ .../u2020/ui/debug/DebugAppContainer.java | 539 ++++++++++++++++ .../ui/debug/HierarchyTreeChangeListener.java | 51 ++ .../u2020/ui/debug/LoggingLevelAdapter.java | 41 ++ .../u2020/ui/debug/NetworkDelayAdapter.java | 53 ++ .../u2020/ui/debug/NetworkErrorAdapter.java | 57 ++ .../ui/debug/NetworkVarianceAdapter.java | 53 ++ .../u2020/ui/debug/ProxyAdapter.java | 56 ++ .../u2020/ui/debug/ServerEndpointAdapter.java | 41 ++ .../debug/SocketActivityHierarchyServer.java | 584 ++++++++++++++++++ .../debug_drawer_header_bg.9.png | Bin 0 -> 2821 bytes .../drawable-hdpi/debug_drawer_icon_edit.png | Bin 0 -> 3484 bytes .../drawable-hdpi/debug_drawer_shadow.9.png | Bin 0 -> 2849 bytes .../debug_drawer_header_bg.9.png | Bin 0 -> 2819 bytes .../drawable-mdpi/debug_drawer_icon_edit.png | Bin 0 -> 3237 bytes .../drawable-mdpi/debug_drawer_shadow.9.png | Bin 0 -> 2836 bytes .../debug_drawer_header_bg.9.png | Bin 0 -> 2823 bytes .../drawable-xhdpi/debug_drawer_icon_edit.png | Bin 0 -> 3752 bytes .../drawable-xhdpi/debug_drawer_shadow.9.png | Bin 0 -> 2862 bytes .../debug_drawer_icon_edit.png | Bin 0 -> 4180 bytes src/debug/res/layout/debug_activity_frame.xml | 20 + src/debug/res/layout/debug_drawer_content.xml | 413 +++++++++++++ .../layout/debug_drawer_contextual_action.xml | 9 + .../layout/debug_drawer_network_endpoint.xml | 21 + .../res/layout/debug_drawer_network_proxy.xml | 21 + src/debug/res/values/debug_strings.xml | 7 + src/debug/res/values/debug_styles.xml | 26 + src/debug/res/values/titles.xml | 5 + src/main/AndroidManifest.xml | 29 + .../java/com/jakewharton/u2020/U2020App.java | 45 ++ .../com/jakewharton/u2020/U2020Module.java | 29 + .../jakewharton/u2020/data/DataModule.java | 61 ++ .../jakewharton/u2020/data/api/ApiModule.java | 37 ++ .../u2020/data/api/GalleryService.java | 14 + .../jakewharton/u2020/data/api/Section.java | 4 + .../com/jakewharton/u2020/data/api/Sort.java | 16 + .../u2020/data/prefs/BooleanPreference.java | 35 ++ .../u2020/data/prefs/IntPreference.java | 35 ++ .../u2020/data/prefs/ObjectPreference.java | 53 ++ .../u2020/data/prefs/StringPreference.java | 35 ++ .../u2020/ui/ActivityHierarchyServer.java | 19 + .../jakewharton/u2020/ui/AppContainer.java | 18 + .../jakewharton/u2020/ui/MainActivity.java | 27 + .../com/jakewharton/u2020/ui/UiModule.java | 20 + .../u2020/ui/misc/BindableAdapter.java | 62 ++ .../com/jakewharton/u2020/util/Strings.java | 19 + src/main/res/drawable-hdpi/app_icon.png | Bin 0 -> 9301 bytes src/main/res/drawable-mdpi/app_icon.png | Bin 0 -> 5114 bytes src/main/res/drawable-xhdpi/app_icon.png | Bin 0 -> 13804 bytes .../progress_indeterminate_40.png | Bin 0 -> 7427 bytes src/main/res/drawable-xxhdpi/app_icon.png | Bin 0 -> 23532 bytes src/main/res/drawable-xxxhdpi/app_icon.png | Bin 0 -> 35063 bytes .../res/drawable/progress_indeterminate.xml | 9 + src/main/res/layout/gallery_view.xml | 17 + src/main/res/values-v19/dimens.xml | 5 + src/main/res/values-v19/styles.xml | 5 + src/main/res/values/dimens.xml | 5 + src/main/res/values/styles.xml | 24 + .../java/com/jakewharton/daggur/Modules.java | 13 + src/release/res/values/titles.xml | 5 + 83 files changed, 3490 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app_icon_web.png create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 src/debug/AndroidManifest.xml create mode 100644 src/debug/java/com/jakewharton/u2020/DebugU2020Module.java create mode 100644 src/debug/java/com/jakewharton/u2020/Modules.java create mode 100644 src/debug/java/com/jakewharton/u2020/data/AnimationSpeed.java create mode 100644 src/debug/java/com/jakewharton/u2020/data/DebugDataModule.java create mode 100644 src/debug/java/com/jakewharton/u2020/data/Endpoint.java create mode 100644 src/debug/java/com/jakewharton/u2020/data/Endpoints.java create mode 100644 src/debug/java/com/jakewharton/u2020/data/IsMockMode.java create mode 100644 src/debug/java/com/jakewharton/u2020/data/MockDownloader.java create mode 100644 src/debug/java/com/jakewharton/u2020/data/NetworkProxy.java create mode 100644 src/debug/java/com/jakewharton/u2020/data/PicassoDebugging.java create mode 100644 src/debug/java/com/jakewharton/u2020/data/api/DebugApiModule.java create mode 100644 src/debug/java/com/jakewharton/u2020/data/api/MockGalleryService.java create mode 100644 src/debug/java/com/jakewharton/u2020/ui/DebugUiModule.java create mode 100644 src/debug/java/com/jakewharton/u2020/ui/debug/AnimationSpeedAdapter.java create mode 100644 src/debug/java/com/jakewharton/u2020/ui/debug/ContextualDebugActions.java create mode 100644 src/debug/java/com/jakewharton/u2020/ui/debug/DebugAppContainer.java create mode 100644 src/debug/java/com/jakewharton/u2020/ui/debug/HierarchyTreeChangeListener.java create mode 100644 src/debug/java/com/jakewharton/u2020/ui/debug/LoggingLevelAdapter.java create mode 100644 src/debug/java/com/jakewharton/u2020/ui/debug/NetworkDelayAdapter.java create mode 100644 src/debug/java/com/jakewharton/u2020/ui/debug/NetworkErrorAdapter.java create mode 100644 src/debug/java/com/jakewharton/u2020/ui/debug/NetworkVarianceAdapter.java create mode 100644 src/debug/java/com/jakewharton/u2020/ui/debug/ProxyAdapter.java create mode 100644 src/debug/java/com/jakewharton/u2020/ui/debug/ServerEndpointAdapter.java create mode 100644 src/debug/java/com/jakewharton/u2020/ui/debug/SocketActivityHierarchyServer.java create mode 100644 src/debug/res/drawable-hdpi/debug_drawer_header_bg.9.png create mode 100644 src/debug/res/drawable-hdpi/debug_drawer_icon_edit.png create mode 100644 src/debug/res/drawable-hdpi/debug_drawer_shadow.9.png create mode 100644 src/debug/res/drawable-mdpi/debug_drawer_header_bg.9.png create mode 100644 src/debug/res/drawable-mdpi/debug_drawer_icon_edit.png create mode 100644 src/debug/res/drawable-mdpi/debug_drawer_shadow.9.png create mode 100644 src/debug/res/drawable-xhdpi/debug_drawer_header_bg.9.png create mode 100644 src/debug/res/drawable-xhdpi/debug_drawer_icon_edit.png create mode 100644 src/debug/res/drawable-xhdpi/debug_drawer_shadow.9.png create mode 100644 src/debug/res/drawable-xxhdpi/debug_drawer_icon_edit.png create mode 100644 src/debug/res/layout/debug_activity_frame.xml create mode 100644 src/debug/res/layout/debug_drawer_content.xml create mode 100644 src/debug/res/layout/debug_drawer_contextual_action.xml create mode 100644 src/debug/res/layout/debug_drawer_network_endpoint.xml create mode 100644 src/debug/res/layout/debug_drawer_network_proxy.xml create mode 100644 src/debug/res/values/debug_strings.xml create mode 100644 src/debug/res/values/debug_styles.xml create mode 100644 src/debug/res/values/titles.xml create mode 100644 src/main/AndroidManifest.xml create mode 100644 src/main/java/com/jakewharton/u2020/U2020App.java create mode 100644 src/main/java/com/jakewharton/u2020/U2020Module.java create mode 100644 src/main/java/com/jakewharton/u2020/data/DataModule.java create mode 100644 src/main/java/com/jakewharton/u2020/data/api/ApiModule.java create mode 100644 src/main/java/com/jakewharton/u2020/data/api/GalleryService.java create mode 100644 src/main/java/com/jakewharton/u2020/data/api/Section.java create mode 100644 src/main/java/com/jakewharton/u2020/data/api/Sort.java create mode 100644 src/main/java/com/jakewharton/u2020/data/prefs/BooleanPreference.java create mode 100644 src/main/java/com/jakewharton/u2020/data/prefs/IntPreference.java create mode 100644 src/main/java/com/jakewharton/u2020/data/prefs/ObjectPreference.java create mode 100644 src/main/java/com/jakewharton/u2020/data/prefs/StringPreference.java create mode 100644 src/main/java/com/jakewharton/u2020/ui/ActivityHierarchyServer.java create mode 100644 src/main/java/com/jakewharton/u2020/ui/AppContainer.java create mode 100644 src/main/java/com/jakewharton/u2020/ui/MainActivity.java create mode 100644 src/main/java/com/jakewharton/u2020/ui/UiModule.java create mode 100644 src/main/java/com/jakewharton/u2020/ui/misc/BindableAdapter.java create mode 100644 src/main/java/com/jakewharton/u2020/util/Strings.java create mode 100644 src/main/res/drawable-hdpi/app_icon.png create mode 100644 src/main/res/drawable-mdpi/app_icon.png create mode 100644 src/main/res/drawable-xhdpi/app_icon.png create mode 100644 src/main/res/drawable-xhdpi/progress_indeterminate_40.png create mode 100644 src/main/res/drawable-xxhdpi/app_icon.png create mode 100644 src/main/res/drawable-xxxhdpi/app_icon.png create mode 100644 src/main/res/drawable/progress_indeterminate.xml create mode 100644 src/main/res/layout/gallery_view.xml create mode 100644 src/main/res/values-v19/dimens.xml create mode 100644 src/main/res/values-v19/styles.xml create mode 100644 src/main/res/values/dimens.xml create mode 100644 src/main/res/values/styles.xml create mode 100644 src/release/java/com/jakewharton/daggur/Modules.java create mode 100644 src/release/res/values/titles.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..73b1a076 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.gradle +local.properties +.idea +*.iml +build +.DS_Store diff --git a/README.md b/README.md new file mode 100644 index 00000000..97d71fcd --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +u2020 +===== + diff --git a/app_icon_web.png b/app_icon_web.png new file mode 100644 index 0000000000000000000000000000000000000000..fb33a3693c19c025a2fc82ce0e4798687ff2b4d6 GIT binary patch literal 94086 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�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 z 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 literal 0 HcmV?d00001 diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..1fb12f73 --- /dev/null +++ b/build.gradle @@ -0,0 +1,81 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:0.6.+' + } +} + +// Manifest version information! +def versionMajor = 1 +def versionMinor = 0 +def versionPatch = 0 +def versionBuild = 0 // bump for dogfood builds, public betas, etc. + +apply plugin: 'android' + +repositories { + mavenCentral() + mavenLocal() +} + +dependencies { + compile 'com.android.support:support-v4:19.0.+' + + compile 'com.squareup.dagger:dagger:1.0.1' + compile 'com.squareup.okhttp:okhttp:1.2.1' + compile 'com.squareup.picasso:picasso:2.1.1' + compile 'com.squareup.retrofit:retrofit:1.2.3-SNAPSHOT' + debugCompile 'com.squareup.retrofit:retrofit-mock:1.2.3-SNAPSHOT' + + compile 'com.jakewharton:butterknife:3.0.0' + compile 'com.jakewharton.timber:timber:2.0.0' + + compile 'com.netflix.rxjava:rxjava-core:0.14.9' + compile 'com.netflix.rxjava:rxjava-android:0.14.9' + + instrumentTestCompile 'com.squareup.spoon:spoon-client:1.0.5' + instrumentTestCompile 'org.easytesting:fest-assert-core:2.0M10' + instrumentTestCompile 'com.squareup:fest-android:1.0.7' +} + +def gitSha() { + return 'git rev-parse --short HEAD'.execute([], project.rootDir).text.trim() +} + +def buildTime() { + return new Date().format("yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC")) +} + +android { + compileSdkVersion 19 + buildToolsVersion "19.0.0" + + defaultConfig { + versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild + versionName "${versionMajor}.${versionMinor}.${versionPatch}" + + buildConfig """\ + public static final String GIT_SHA = "${gitSha()}"; + public static final String BUILD_TIME = "${buildTime()}"; + public static final String VERSION_NAME = "${versionName}"; + public static final int VERSION_CODE = ${versionCode}; + """ + } + + buildTypes { + debug { + packageNameSuffix '.dev' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } +} + +task wrapper(type: Wrapper) { + gradleVersion = '1.8' +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..8c0fb64a8698b08ecc4158d828ca593c4928e9dd GIT binary patch literal 49896 zcmagFb986H(k`5d^NVfUwr$(C?M#x1ZQHiZiEVpg+jrjgoQrerx!>1o_ul)D>ebz~ zs=Mmxr&>W81QY-S1PKWQ%N-;H^tS;2*XwVA`dej1RRn1z<;3VgfE4~kaG`A%QSPsR z#ovnZe+tS9%1MfeDyz`RirvdjPRK~p(#^q2(^5@O&NM19EHdvN-A&StN>0g6QA^VN z0Gx%Gq#PD$QMRFzmK+utjS^Y1F0e8&u&^=w5K<;4Rz|i3A=o|IKLY+g`iK6vfr9?+ z-`>gmU&i?FGSL5&F?TXFu`&Js6h;15QFkXp2M1H9|Eq~bpov-GU(uz%mH0n55wUl- zv#~ccAz`F5wlQ>e_KlJS3@{)B?^v*EQM=IxLa&76^y51a((wq|2-`qON>+4dLc{Oo z51}}o^Zen(oAjxDK7b++9_Yg`67p$bPo3~BCpGM7uAWmvIhWc5Gi+gQZ|Pwa-Gll@<1xmcPy z|NZmu6m)g5Ftu~BG&Xdxclw7Cij{xbBMBn-LMII#Slp`AElb&2^Hw+w>(3crLH!;I zN+Vk$D+wP1#^!MDCiad@vM>H#6+`Ct#~6VHL4lzmy;lSdk>`z6)=>Wh15Q2)dQtGqvn0vJU@+(B5{MUc*qs4!T+V=q=wy)<6$~ z!G>e_4dN@lGeF_$q9`Ju6Ncb*x?O7=l{anm7Eahuj_6lA{*#Gv*TaJclevPVbbVYu z(NY?5q+xxbO6%g1xF0r@Ix8fJ~u)VRUp`S%&rN$&e!Od`~s+64J z5*)*WSi*i{k%JjMSIN#X;jC{HG$-^iX+5f5BGOIHWAl*%15Z#!xntpk($-EGKCzKa zT7{siZ9;4TICsWQ$pu&wKZQTCvpI$Xvzwxoi+XkkpeE&&kFb!B?h2hi%^YlXt|-@5 zHJ~%AN!g_^tmn1?HSm^|gCE#!GRtK2(L{9pL#hp0xh zME}|DB>(5)`iE7CM)&_+S}-Bslc#@B5W4_+k4Cp$l>iVyg$KP>CN?SVGZ(&02>iZK zB<^HP$g$Lq*L$BWd?2(F?-MUbNWTJVQdW7$#8a|k_30#vHAD1Z{c#p;bETk0VnU5A zBgLe2HFJ3032$G<`m*OB!KM$*sdM20jm)It5OSru@tXpK5LT>#8)N!*skNu1$TpIw zufjjdp#lyH5bZ%|Iuo|iu9vG1HrIVWLH>278xo>aVBkPN3V$~!=KnlXQ4eDqS7%E% zQ!z^$Q$b^6Q)g#cLpwur(|<0gWHo6A6jc;n`t(V9T;LzTAU{IAu*uEQ%Ort1k+Kn+f_N`9|bxYC+~Z1 zCC1UCWv*Orx$_@ydv9mIe(liLfOr7mhbV@tKw{6)q^1DH1nmvZ0cj215R<~&I<4S| zgnr;9Cdjqpz#o8i0CQjtl`}{c*P)aSdH|abxGdrR)-3z+02-eX(k*B)Uqv6~^nh** z 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 \(.*\)$'` + 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/src/debug/AndroidManifest.xml b/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..f2f141c4 --- /dev/null +++ b/src/debug/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/debug/java/com/jakewharton/u2020/DebugU2020Module.java b/src/debug/java/com/jakewharton/u2020/DebugU2020Module.java new file mode 100644 index 00000000..7bf41e85 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/DebugU2020Module.java @@ -0,0 +1,14 @@ +package com.jakewharton.u2020; + +import com.jakewharton.u2020.data.DebugDataModule; +import com.jakewharton.u2020.ui.DebugUiModule; +import dagger.Module; + +@Module( + includes = { + DebugUiModule.class, + DebugDataModule.class + } +) +public class DebugU2020Module { +} diff --git a/src/debug/java/com/jakewharton/u2020/Modules.java b/src/debug/java/com/jakewharton/u2020/Modules.java new file mode 100644 index 00000000..b2560563 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/Modules.java @@ -0,0 +1,14 @@ +package com.jakewharton.u2020; + +final class Modules { + static Object[] list(U2020App app) { + return new Object[] { + new U2020Module(app), + new DebugU2020Module() + }; + } + + private Modules() { + // No instances. + } +} diff --git a/src/debug/java/com/jakewharton/u2020/data/AnimationSpeed.java b/src/debug/java/com/jakewharton/u2020/data/AnimationSpeed.java new file mode 100644 index 00000000..cf3f3dae --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/data/AnimationSpeed.java @@ -0,0 +1,10 @@ +package com.jakewharton.u2020.data; + +import java.lang.annotation.Retention; +import javax.inject.Qualifier; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier @Retention(RUNTIME) +public @interface AnimationSpeed { +} diff --git a/src/debug/java/com/jakewharton/u2020/data/DebugDataModule.java b/src/debug/java/com/jakewharton/u2020/data/DebugDataModule.java new file mode 100644 index 00000000..994a2973 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/data/DebugDataModule.java @@ -0,0 +1,83 @@ +package com.jakewharton.u2020.data; + +import android.app.Application; +import android.content.SharedPreferences; +import com.jakewharton.u2020.DebugU2020Module; +import com.jakewharton.u2020.data.api.DebugApiModule; +import com.jakewharton.u2020.data.prefs.BooleanPreference; +import com.jakewharton.u2020.data.prefs.IntPreference; +import com.jakewharton.u2020.data.prefs.StringPreference; +import com.squareup.okhttp.OkHttpClient; +import dagger.Module; +import dagger.Provides; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import javax.inject.Singleton; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +@Module( + addsTo = DebugU2020Module.class, + includes = DebugApiModule.class, + overrides = true +) +public class DebugDataModule { + private static final int DEFAULT_ANIMATION_SPEED = 1; // 1x (normal) speed. + private static final boolean DEFAULT_PICASSO_DEBUGGING = false; // Debug indicators displayed + + @Provides @Singleton OkHttpClient provideOkHttpClient(Application app) { + OkHttpClient client = DataModule.createOkHttpClient(app); + client.setSslSocketFactory(createBadSslSocketFactory()); + return client; + } + + @Provides @Singleton @Endpoint + StringPreference provideEndpointPreference(SharedPreferences preferences) { + return new StringPreference(preferences, "debug_endpoint", Endpoints.MOCK_MODE.url); + } + + @Provides @Singleton @IsMockMode boolean provideIsMockMode(@Endpoint StringPreference endpoint) { + return Endpoints.isMockMode(endpoint.get()); + } + + @Provides @Singleton @NetworkProxy + StringPreference provideNetworkProxy(SharedPreferences preferences) { + return new StringPreference(preferences, "debug_network_proxy"); + } + + @Provides @Singleton @AnimationSpeed + IntPreference provideAnimationSpeed(SharedPreferences preferences) { + return new IntPreference(preferences, "debug_animation_speed", DEFAULT_ANIMATION_SPEED); + } + + @Provides @Singleton @PicassoDebugging + BooleanPreference providePicassoDebugging(SharedPreferences preferences) { + return new BooleanPreference(preferences, "debug_picasso_debugging", DEFAULT_PICASSO_DEBUGGING); + } + + private static SSLSocketFactory createBadSslSocketFactory() { + try { + // Construct SSLSocketFactory that accepts any cert. + SSLContext context = SSLContext.getInstance("TLS"); + TrustManager permissive = new X509TrustManager() { + @Override public void checkClientTrusted(X509Certificate[] chain, String authType) + throws CertificateException { + } + + @Override public void checkServerTrusted(X509Certificate[] chain, String authType) + throws CertificateException { + } + + @Override public X509Certificate[] getAcceptedIssuers() { + return null; + } + }; + context.init(null, new TrustManager[] { permissive }, null); + return context.getSocketFactory(); + } catch (Exception e) { + throw new AssertionError(e); + } + } +} diff --git a/src/debug/java/com/jakewharton/u2020/data/Endpoint.java b/src/debug/java/com/jakewharton/u2020/data/Endpoint.java new file mode 100644 index 00000000..d5bc2bd4 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/data/Endpoint.java @@ -0,0 +1,10 @@ +package com.jakewharton.u2020.data; + +import java.lang.annotation.Retention; +import javax.inject.Qualifier; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier @Retention(RUNTIME) +public @interface Endpoint { +} diff --git a/src/debug/java/com/jakewharton/u2020/data/Endpoints.java b/src/debug/java/com/jakewharton/u2020/data/Endpoints.java new file mode 100644 index 00000000..e3192c31 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/data/Endpoints.java @@ -0,0 +1,31 @@ +package com.jakewharton.u2020.data; + +import com.jakewharton.u2020.data.api.ApiModule; + +public enum Endpoints { + PRODUCTION("Production", ApiModule.PRODUCTION_API_URL), + STAGING("Staging", "https://api.staging.imgur.com/3/"), + MOCK_MODE("Mock Mode", "mock://mode/"), + CUSTOM("Custom", null); + + public final String name; + public final String url; + + Endpoints(String name, String url) { + this.name = name; + this.url = url; + } + + public static Endpoints from(String endpoint) { + for (Endpoints value : values()) { + if (value.url != null && value.url.equals(endpoint)) { + return value; + } + } + return CUSTOM; + } + + public static boolean isMockMode(String endpoint) { + return from(endpoint) == MOCK_MODE; + } +} diff --git a/src/debug/java/com/jakewharton/u2020/data/IsMockMode.java b/src/debug/java/com/jakewharton/u2020/data/IsMockMode.java new file mode 100644 index 00000000..7159e96e --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/data/IsMockMode.java @@ -0,0 +1,10 @@ +package com.jakewharton.u2020.data; + +import java.lang.annotation.Retention; +import javax.inject.Qualifier; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier @Retention(RUNTIME) +public @interface IsMockMode { +} diff --git a/src/debug/java/com/jakewharton/u2020/data/MockDownloader.java b/src/debug/java/com/jakewharton/u2020/data/MockDownloader.java new file mode 100644 index 00000000..729789ac --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/data/MockDownloader.java @@ -0,0 +1,75 @@ +package com.jakewharton.u2020.data; + +import android.content.res.AssetManager; +import android.net.Uri; +import android.os.SystemClock; +import android.util.LruCache; +import com.squareup.picasso.Downloader; +import java.io.IOException; +import retrofit.MockRestAdapter; + +/** + * A Picasso {@link com.squareup.picasso.Downloader} which loads images from assets but attempts to emulate the + * subtleties of a real HTTP client and its disk cache. + *

+ * Images must be in the form {@code mock:///path/to/asset.png}. + */ +public class MockDownloader implements Downloader { + private static final int DISK_CACHE_SIZE_MB = 30 * 1024 * 1024; // 30MB + + private final MockRestAdapter mockRestAdapter; + private final AssetManager assetManager; + + /** Emulate the disk cache by storing the URLs in an LRU using its size as the value. */ + private final LruCache emulatedDiskCache = + new LruCache(DISK_CACHE_SIZE_MB) { + @Override protected int sizeOf(String key, Long value) { + return (int) Math.min(value.longValue(), Integer.MAX_VALUE); + } + }; + + public MockDownloader(MockRestAdapter mockRestAdapter, AssetManager assetManager) { + this.mockRestAdapter = mockRestAdapter; + this.assetManager = assetManager; + } + + @Override public Response load(Uri uri, boolean localCacheOnly) throws IOException { + if (!"mock".equals(uri.getScheme())) { + throw new RuntimeException("Attempted to download non-mock image (" + + uri + + ") using the mock downloader. Mock URLs must be prefixed with 'mock'."); + } + + String imagePath = uri.getPath().substring(1); // Grab only the path sans leading slash. + + // Check the disk cache for the image. A non-null return value indicates a hit. + boolean cacheHit = emulatedDiskCache.get(imagePath) != null; + + // If there's a hit, grab the image stream and return it. + if (cacheHit) { + return new Response(assetManager.open(imagePath), true); + } + + // If we are not allowed to hit the network and the cache missed return a big fat nothing. + if (localCacheOnly) { + return null; + } + + // If we got this far there was a cache miss and hitting the network is required. See if we need + // to fake an network error. + if (mockRestAdapter.calculateIsFailure()) { + SystemClock.sleep(mockRestAdapter.calculateDelayForError()); + throw new IOException("Fake network error!"); + } + + // We aren't throwing a network error so fake a round trip delay. + SystemClock.sleep(mockRestAdapter.calculateDelayForCall()); + + // Since we cache missed, load the file size and put it in the LRU. + long size = assetManager.openFd(imagePath).getLength(); + emulatedDiskCache.put(imagePath, size); + + // Grab the image stream and return it. + return new Response(assetManager.open(imagePath), false); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/data/NetworkProxy.java b/src/debug/java/com/jakewharton/u2020/data/NetworkProxy.java new file mode 100644 index 00000000..657a1b99 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/data/NetworkProxy.java @@ -0,0 +1,10 @@ +package com.jakewharton.u2020.data; + +import java.lang.annotation.Retention; +import javax.inject.Qualifier; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier @Retention(RUNTIME) +public @interface NetworkProxy { +} diff --git a/src/debug/java/com/jakewharton/u2020/data/PicassoDebugging.java b/src/debug/java/com/jakewharton/u2020/data/PicassoDebugging.java new file mode 100644 index 00000000..6daad9c9 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/data/PicassoDebugging.java @@ -0,0 +1,10 @@ +package com.jakewharton.u2020.data; + +import java.lang.annotation.Retention; +import javax.inject.Qualifier; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier @Retention(RUNTIME) +public @interface PicassoDebugging { +} diff --git a/src/debug/java/com/jakewharton/u2020/data/api/DebugApiModule.java b/src/debug/java/com/jakewharton/u2020/data/api/DebugApiModule.java new file mode 100644 index 00000000..c2466ca9 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/data/api/DebugApiModule.java @@ -0,0 +1,33 @@ +package com.jakewharton.u2020.data.api; + +import android.content.SharedPreferences; +import com.jakewharton.u2020.data.DebugDataModule; +import com.jakewharton.u2020.data.IsMockMode; +import dagger.Module; +import dagger.Provides; +import javax.inject.Singleton; +import retrofit.MockRestAdapter; +import retrofit.RestAdapter; +import retrofit.android.AndroidMockValuePersistence; + +@Module( + addsTo = DebugDataModule.class, + overrides = true +) +public class DebugApiModule { + @Provides @Singleton + MockRestAdapter provideMockRestAdapter(RestAdapter restAdapter, SharedPreferences preferences) { + MockRestAdapter mockRestAdapter = MockRestAdapter.from(restAdapter); + AndroidMockValuePersistence.install(mockRestAdapter, preferences); + return mockRestAdapter; + } + + @Provides @Singleton + GalleryService provideGalleryService(RestAdapter restAdapter, MockRestAdapter mockRestAdapter, + @IsMockMode boolean isMockMode, MockGalleryService mockService) { + if (isMockMode) { + return mockRestAdapter.create(GalleryService.class, mockService); + } + return restAdapter.create(GalleryService.class); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/data/api/MockGalleryService.java b/src/debug/java/com/jakewharton/u2020/data/api/MockGalleryService.java new file mode 100644 index 00000000..5b91ac18 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/data/api/MockGalleryService.java @@ -0,0 +1,10 @@ +package com.jakewharton.u2020.data.api; + +import retrofit.client.Response; +import rx.Observable; + +final class MockGalleryService implements GalleryService { + @Override public Observable listGallery(Section section, Sort sort, int page) { + return Observable.empty(); // TODO + } +} diff --git a/src/debug/java/com/jakewharton/u2020/ui/DebugUiModule.java b/src/debug/java/com/jakewharton/u2020/ui/DebugUiModule.java new file mode 100644 index 00000000..2b5d71fd --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/ui/DebugUiModule.java @@ -0,0 +1,22 @@ +package com.jakewharton.u2020.ui; + +import com.jakewharton.u2020.DebugU2020Module; +import com.jakewharton.u2020.ui.debug.DebugAppContainer; +import com.jakewharton.u2020.ui.debug.SocketActivityHierarchyServer; +import dagger.Module; +import dagger.Provides; +import javax.inject.Singleton; + +@Module( + addsTo = DebugU2020Module.class, + overrides = true +) +public class DebugUiModule { + @Provides @Singleton AppContainer provideAppContainer(DebugAppContainer debugAppContainer) { + return debugAppContainer; + } + + @Provides @Singleton ActivityHierarchyServer provideActivityHierarchyServer() { + return new SocketActivityHierarchyServer(); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/ui/debug/AnimationSpeedAdapter.java b/src/debug/java/com/jakewharton/u2020/ui/debug/AnimationSpeedAdapter.java new file mode 100644 index 00000000..343b5267 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/ui/debug/AnimationSpeedAdapter.java @@ -0,0 +1,57 @@ +package com.jakewharton.u2020.ui.debug; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import com.jakewharton.u2020.ui.misc.BindableAdapter; + +class AnimationSpeedAdapter extends BindableAdapter { + private static final int[] VALUES = { + 1, 2, 3, 5, 10 + }; + + public static int getPositionForValue(int value) { + for (int i = 0; i < VALUES.length; i++) { + if (VALUES[i] == value) { + return i; + } + } + return 0; // Default to 1x if something changes. + } + + AnimationSpeedAdapter(Context context) { + super(context); + } + + @Override public int getCount() { + return VALUES.length; + } + + @Override public Integer getItem(int position) { + return VALUES[position]; + } + + @Override public long getItemId(int position) { + return position; + } + + @Override public View newView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_item, container, false); + } + + @Override public void bindView(Integer item, int position, View view) { + TextView tv = (TextView) view.findViewById(android.R.id.text1); + if (item == 1) { + tv.setText("Normal"); + } else { + tv.setText(item + "x slower"); + } + } + + @Override + public View newDropDownView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_dropdown_item, container, false); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/ui/debug/ContextualDebugActions.java b/src/debug/java/com/jakewharton/u2020/ui/debug/ContextualDebugActions.java new file mode 100644 index 00000000..add37499 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/ui/debug/ContextualDebugActions.java @@ -0,0 +1,103 @@ +package com.jakewharton.u2020.ui.debug; + +import android.content.Context; +import android.support.v4.widget.DrawerLayout; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.LinearLayout; +import com.jakewharton.u2020.R; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import timber.log.Timber; + +public class ContextualDebugActions implements ViewGroup.OnHierarchyChangeListener { + public interface DebugAction { + String name(); + Class viewClass(); + void run(T view); + } + + private final Map, View> buttonMap; + private final Map, List>> actionMap; + + private final DrawerLayout drawerLayout; + private final Context drawerContext; + private final View contextualTitleView; + private final LinearLayout contextualListView; + + public ContextualDebugActions(DebugAppContainer container, Set> debugActions) { + buttonMap = new LinkedHashMap<>(); + actionMap = new LinkedHashMap<>(); + + drawerLayout = container.drawerLayout; + drawerContext = container.drawerContext; + contextualTitleView = container.contextualTitleView; + contextualListView = container.contextualListView; + + for (DebugAction debugAction : debugActions) { + putAction(debugAction.viewClass(), debugAction); + } + } + + private void putAction(Class view, DebugAction action) { + Timber.d("Adding %s action for %s.", action.getClass().getSimpleName(), view.getSimpleName()); + + List> actions = actionMap.get(view); + if (actions == null) { + actions = new ArrayList<>(2); + actionMap.put(view, actions); + } + actions.add(action); + } + + @Override public void onChildViewAdded(View parent, View child) { + List> actions = actionMap.get(child.getClass()); + if (actions != null) { + for (DebugAction action : actions) { + Timber.d("Adding debug action \"%s\" for %s.", action.name(), + child.getClass().getSimpleName()); + + View button = createButton(action, child); + buttonMap.put(action, button); + contextualListView.addView(button); + } + updateContextualVisibility(); + } + } + + @Override public void onChildViewRemoved(View parent, View child) { + List> actions = actionMap.get(child.getClass()); + if (actions != null) { + for (DebugAction action : actions) { + Timber.d("Removing debug action \"%s\" for %s.", action.name(), + child.getClass().getSimpleName()); + contextualListView.removeView(buttonMap.remove(action)); + } + updateContextualVisibility(); + } + } + + private Button createButton(final DebugAction action, final View child) { + Button button = (Button) LayoutInflater.from(drawerContext) + .inflate(R.layout.debug_drawer_contextual_action, contextualListView, false); + button.setText(action.name()); + button.setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View view) { + drawerLayout.closeDrawers(); + action.run(child); + } + }); + return button; + } + + private void updateContextualVisibility() { + int visibility = contextualListView.getChildCount() > 0 ? View.VISIBLE : View.GONE; + contextualTitleView.setVisibility(visibility); + contextualListView.setVisibility(visibility); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/ui/debug/DebugAppContainer.java b/src/debug/java/com/jakewharton/u2020/ui/debug/DebugAppContainer.java new file mode 100644 index 00000000..a4d5a0fb --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/ui/debug/DebugAppContainer.java @@ -0,0 +1,539 @@ +package com.jakewharton.u2020.ui.debug; + +import android.animation.ValueAnimator; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Build; +import android.support.v4.widget.DrawerLayout; +import android.util.DisplayMetrics; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.Spinner; +import android.widget.Switch; +import android.widget.TextView; +import butterknife.InjectView; +import butterknife.OnClick; +import butterknife.Views; +import com.jakewharton.u2020.BuildConfig; +import com.jakewharton.u2020.R; +import com.jakewharton.u2020.U2020App; +import com.jakewharton.u2020.data.AnimationSpeed; +import com.jakewharton.u2020.data.Endpoint; +import com.jakewharton.u2020.data.Endpoints; +import com.jakewharton.u2020.data.NetworkProxy; +import com.jakewharton.u2020.data.PicassoDebugging; +import com.jakewharton.u2020.data.prefs.BooleanPreference; +import com.jakewharton.u2020.data.prefs.IntPreference; +import com.jakewharton.u2020.data.prefs.StringPreference; +import com.jakewharton.u2020.ui.AppContainer; +import com.jakewharton.u2020.ui.MainActivity; +import com.jakewharton.u2020.util.Strings; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.picasso.Picasso; +import com.squareup.picasso.StatsSnapshot; +import java.lang.reflect.Method; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.SocketAddress; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.Date; +import java.util.Set; +import java.util.TimeZone; +import javax.inject.Inject; +import javax.inject.Singleton; +import retrofit.MockRestAdapter; +import retrofit.RestAdapter; +import timber.log.Timber; + +import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK; +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; +import static android.view.View.GONE; +import static android.view.View.VISIBLE; +import static java.net.Proxy.Type.HTTP; +import static retrofit.RestAdapter.LogLevel; + +/** + * An {@link AppContainer} for debug builds which wrap the content view with a sliding drawer on + * the right that holds all of the debug information and settings. + */ +@Singleton +public class DebugAppContainer implements AppContainer { + private static final DateFormat DATE_DISPLAY_FORMAT = new SimpleDateFormat("yyyy-MM-dd hh:mm a"); + + private final OkHttpClient client; + private final Picasso picasso; + private final StringPreference networkEndpoint; + private final StringPreference networkProxy; + private final IntPreference animationSpeed; + private final BooleanPreference picassoDebugging; + private final RestAdapter restAdapter; + private final MockRestAdapter mockRestAdapter; + + U2020App app; + Activity activity; + Context drawerContext; + + @Inject public DebugAppContainer(OkHttpClient client, Picasso picasso, + @Endpoint StringPreference networkEndpoint, @NetworkProxy StringPreference networkProxy, + @AnimationSpeed IntPreference animationSpeed, + @PicassoDebugging BooleanPreference picassoDebugging, RestAdapter restAdapter, + MockRestAdapter mockRestAdapter) { + this.client = client; + this.picasso = picasso; + this.networkEndpoint = networkEndpoint; + this.mockRestAdapter = mockRestAdapter; + this.networkProxy = networkProxy; + this.animationSpeed = animationSpeed; + this.picassoDebugging = picassoDebugging; + this.restAdapter = restAdapter; + } + + @InjectView(R.id.debug_drawer_layout) DrawerLayout drawerLayout; + @InjectView(R.id.debug_content) ViewGroup content; + + @InjectView(R.id.debug_contextual_title) View contextualTitleView; + @InjectView(R.id.debug_contextual_list) LinearLayout contextualListView; + + @InjectView(R.id.debug_network_endpoint) Spinner endpointView; + @InjectView(R.id.debug_network_endpoint_edit) View endpointEditView; + @InjectView(R.id.debug_network_delay) Spinner networkDelayView; + @InjectView(R.id.debug_network_variance) Spinner networkVarianceView; + @InjectView(R.id.debug_network_error) Spinner networkErrorView; + @InjectView(R.id.debug_network_proxy) Spinner networkProxyView; + @InjectView(R.id.debug_network_logging) Spinner networkLoggingView; + + @InjectView(R.id.debug_animation_speed) Spinner animationSpeedView; + + @InjectView(R.id.debug_build_name) TextView buildNameView; + @InjectView(R.id.debug_build_code) TextView buildCodeView; + @InjectView(R.id.debug_build_sha) TextView buildShaView; + @InjectView(R.id.debug_build_date) TextView buildDateView; + + @InjectView(R.id.debug_device_make) TextView deviceMakeView; + @InjectView(R.id.debug_device_model) TextView deviceModelView; + @InjectView(R.id.debug_device_resolution) TextView deviceResolutionView; + @InjectView(R.id.debug_device_density) TextView deviceDensityView; + @InjectView(R.id.debug_device_release) TextView deviceReleaseView; + @InjectView(R.id.debug_device_api) TextView deviceApiView; + + @InjectView(R.id.debug_picasso_indicators) Switch picassoIndicatorView; + @InjectView(R.id.debug_picasso_cache_size) TextView picassoCacheSizeView; + @InjectView(R.id.debug_picasso_cache_hit) TextView picassoCacheHitView; + @InjectView(R.id.debug_picasso_cache_miss) TextView picassoCacheMissView; + @InjectView(R.id.debug_picasso_decoded) TextView picassoDecodedView; + @InjectView(R.id.debug_picasso_decoded_total) TextView picassoDecodedTotalView; + @InjectView(R.id.debug_picasso_decoded_avg) TextView picassoDecodedAvgView; + @InjectView(R.id.debug_picasso_transformed) TextView picassoTransformedView; + @InjectView(R.id.debug_picasso_transformed_total) TextView picassoTransformedTotalView; + @InjectView(R.id.debug_picasso_transformed_avg) TextView picassoTransformedAvgView; + + @Override public ViewGroup get(Activity activity, U2020App app) { + this.app = app; + this.activity = activity; + drawerContext = activity; + + activity.setContentView(R.layout.debug_activity_frame); + + // Manually find the debug drawer and inflate the drawer layout inside of it. + ViewGroup drawer = (ViewGroup) activity.findViewById(R.id.debug_drawer); + LayoutInflater.from(drawerContext).inflate(R.layout.debug_drawer_content, drawer); + + // Inject after inflating the drawer layout so its views are available to inject. + Views.inject(this, activity); + + // Set up the contextual actions to watch views coming in and out of the content area. + Set> debugActions = Collections.emptySet(); + ContextualDebugActions contextualActions = new ContextualDebugActions(this, debugActions); + content.setOnHierarchyChangeListener(HierarchyTreeChangeListener.wrap(contextualActions)); + + drawerLayout.setDrawerShadow(R.drawable.debug_drawer_shadow, Gravity.END); + drawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() { + @Override public void onDrawerOpened(View drawerView) { + refreshPicassoStats(); + } + }); + + setupNetworkSection(); + setupAnimationSection(); + setupBuildSection(); + setupDeviceSection(); + setupPicassoSection(); + + return content; + } + + private void setupNetworkSection() { + final Endpoints currentEndpoint = Endpoints.from(networkEndpoint.get()); + final ServerEndpointAdapter endpointAdapter = new ServerEndpointAdapter(drawerContext); + endpointView.setAdapter(endpointAdapter); + endpointView.setSelection(currentEndpoint.ordinal()); + endpointView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int position, long id) { + Endpoints selected = endpointAdapter.getItem(position); + if (selected != currentEndpoint) { + if (selected == Endpoints.CUSTOM) { + Timber.d("Custom network endpoint selected. Prompting for URL."); + showCustomEndpointDialog(currentEndpoint.ordinal(), "http://"); + } else { + setEndpointAndRelaunch(selected.url); + } + } else { + Timber.d("Ignoring re-selection of network endpoint %s", selected); + } + } + + @Override public void onNothingSelected(AdapterView adapterView) { + } + }); + + final NetworkDelayAdapter delayAdapter = new NetworkDelayAdapter(drawerContext); + networkDelayView.setAdapter(delayAdapter); + networkDelayView.setSelection( + NetworkDelayAdapter.getPositionForValue(mockRestAdapter.getDelay())); + networkDelayView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int position, long id) { + long selected = delayAdapter.getItem(position); + if (selected != mockRestAdapter.getDelay()) { + Timber.d("Setting network delay to %sms", selected); + mockRestAdapter.setDelay(selected); + } else { + Timber.d("Ignoring re-selection of network delay %sms", selected); + } + } + + @Override public void onNothingSelected(AdapterView adapterView) { + } + }); + + final NetworkVarianceAdapter varianceAdapter = new NetworkVarianceAdapter(drawerContext); + networkVarianceView.setAdapter(varianceAdapter); + networkVarianceView.setSelection( + NetworkVarianceAdapter.getPositionForValue(mockRestAdapter.getVariancePercentage())); + networkVarianceView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int position, long id) { + int selected = varianceAdapter.getItem(position); + if (selected != mockRestAdapter.getVariancePercentage()) { + Timber.d("Setting network variance to %s%%", selected); + mockRestAdapter.setVariancePercentage(selected); + } else { + Timber.d("Ignoring re-selection of network variance %s%%", selected); + } + } + + @Override public void onNothingSelected(AdapterView adapterView) { + } + }); + + final NetworkErrorAdapter errorAdapter = new NetworkErrorAdapter(drawerContext); + networkErrorView.setAdapter(errorAdapter); + networkErrorView.setSelection( + NetworkErrorAdapter.getPositionForValue(mockRestAdapter.getErrorPercentage())); + networkErrorView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int position, long id) { + int selected = errorAdapter.getItem(position); + if (selected != mockRestAdapter.getErrorPercentage()) { + Timber.d("Setting network error to %s%%", selected); + mockRestAdapter.setErrorPercentage(selected); + } else { + Timber.d("Ignoring re-selection of network error %s%%", selected); + } + } + + @Override public void onNothingSelected(AdapterView adapterView) { + } + }); + + int currentProxyPosition = networkProxy.isSet() ? ProxyAdapter.PROXY : ProxyAdapter.NONE; + final ProxyAdapter proxyAdapter = new ProxyAdapter(activity, networkProxy); + networkProxyView.setAdapter(proxyAdapter); + networkProxyView.setSelection(currentProxyPosition); + networkProxyView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int position, long id) { + if (position == ProxyAdapter.NONE) { + Timber.d("Clearing network proxy"); + networkProxy.delete(); + client.setProxy(null); + } else if (networkProxy.isSet() && position == ProxyAdapter.PROXY) { + Timber.d("Ignoring re-selection of network proxy %s", networkProxy.get()); + } else { + Timber.d("New network proxy selected. Prompting for host."); + showNewNetworkProxyDialog(proxyAdapter); + } + } + + @Override public void onNothingSelected(AdapterView adapterView) { + } + }); + + // Only show the endpoint editor when a custom endpoint is in use. + endpointEditView.setVisibility(currentEndpoint == Endpoints.CUSTOM ? VISIBLE : GONE); + + if (currentEndpoint == Endpoints.MOCK_MODE) { + // Disable network proxy if we are in mock mode. + networkProxyView.setEnabled(false); + networkLoggingView.setEnabled(false); + } else { + // Disable network controls if we are not in mock mode. + networkDelayView.setEnabled(false); + networkVarianceView.setEnabled(false); + networkErrorView.setEnabled(false); + } + + // We use the JSON rest adapter as the source of truth for the log level. + final LoggingLevelAdapter loggingAdapter = new LoggingLevelAdapter(activity); + networkLoggingView.setAdapter(loggingAdapter); + networkLoggingView.setSelection(restAdapter.getLogLevel().ordinal()); + networkLoggingView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int position, long id) { + LogLevel selected = loggingAdapter.getItem(position); + if (selected != restAdapter.getLogLevel()) { + Timber.d("Setting logging level to %s", selected); + restAdapter.setLogLevel(selected); + } else { + Timber.d("Ignoring re-selection of logging level " + selected); + } + } + + @Override public void onNothingSelected(AdapterView adapterView) { + } + }); + } + + @OnClick(R.id.debug_network_endpoint_edit) void onEditEndpointClicked() { + Timber.d("Prompting to edit custom endpoint URL."); + // Pass in the currently selected position since we are merely editing. + showCustomEndpointDialog(endpointView.getSelectedItemPosition(), networkEndpoint.get()); + } + + private void setupAnimationSection() { + final AnimationSpeedAdapter speedAdapter = new AnimationSpeedAdapter(activity); + animationSpeedView.setAdapter(speedAdapter); + final int animationSpeedValue = animationSpeed.get(); + animationSpeedView.setSelection(AnimationSpeedAdapter.getPositionForValue(animationSpeedValue)); + animationSpeedView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int position, long id) { + int selected = speedAdapter.getItem(position); + if (selected != animationSpeed.get()) { + Timber.d("Setting animation speed to %sx", selected); + animationSpeed.set(selected); + applyAnimationSpeed(selected); + } else { + Timber.d("Ignoring re-selection of animation speed %sx", selected); + } + } + + @Override public void onNothingSelected(AdapterView adapterView) { + } + }); + // Ensure the animation speed value is always applied across app restarts. + content.post(new Runnable() { + @Override public void run() { + applyAnimationSpeed(animationSpeedValue); + } + }); + } + + private void setupBuildSection() { + buildNameView.setText(BuildConfig.VERSION_NAME); + buildCodeView.setText(String.valueOf(BuildConfig.VERSION_CODE)); + buildShaView.setText(BuildConfig.GIT_SHA); + + try { + // Parse ISO8601-format time into local time. + DateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); + inFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + Date buildTime = inFormat.parse(BuildConfig.BUILD_TIME); + buildDateView.setText(DATE_DISPLAY_FORMAT.format(buildTime)); + } catch (ParseException e) { + throw new RuntimeException("Unable to decode build time: " + BuildConfig.BUILD_TIME, e); + } + } + + private void setupDeviceSection() { + DisplayMetrics displayMetrics = activity.getResources().getDisplayMetrics(); + String densityBucket = getDensityString(displayMetrics); + deviceMakeView.setText(Strings.truncateAt(Build.MANUFACTURER, 20)); + deviceModelView.setText(Strings.truncateAt(Build.MODEL, 20)); + deviceResolutionView.setText(displayMetrics.heightPixels + "x" + displayMetrics.widthPixels); + deviceDensityView.setText(displayMetrics.densityDpi + "dpi (" + densityBucket + ")"); + deviceReleaseView.setText(Build.VERSION.RELEASE); + deviceApiView.setText(String.valueOf(Build.VERSION.SDK_INT)); + } + + private void setupPicassoSection() { + boolean picassoDebuggingValue = picassoDebugging.get(); + picasso.setDebugging(picassoDebuggingValue); + picassoIndicatorView.setChecked(picassoDebuggingValue); + picassoIndicatorView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override public void onCheckedChanged(CompoundButton button, boolean isChecked) { + Timber.d("Setting Picasso debugging to " + isChecked); + picasso.setDebugging(isChecked); + picassoDebugging.set(isChecked); + } + }); + + refreshPicassoStats(); + } + + private void refreshPicassoStats() { + StatsSnapshot snapshot = picasso.getSnapshot(); + String size = getSizeString(snapshot.size); + String total = getSizeString(snapshot.maxSize); + int percentage = (int) ((1f * snapshot.size / snapshot.maxSize) * 100); + picassoCacheSizeView.setText(size + " / " + total + " (" + percentage + "%)"); + picassoCacheHitView.setText(String.valueOf(snapshot.cacheHits)); + picassoCacheMissView.setText(String.valueOf(snapshot.cacheMisses)); + picassoDecodedView.setText(String.valueOf(snapshot.originalBitmapCount)); + picassoDecodedTotalView.setText(getSizeString(snapshot.totalOriginalBitmapSize)); + picassoDecodedAvgView.setText(getSizeString(snapshot.averageOriginalBitmapSize)); + picassoTransformedView.setText(String.valueOf(snapshot.transformedBitmapCount)); + picassoTransformedTotalView.setText(getSizeString(snapshot.totalTransformedBitmapSize)); + picassoTransformedAvgView.setText(getSizeString(snapshot.averageTransformedBitmapSize)); + } + + private void applyAnimationSpeed(int multiplier) { + try { + Method method = ValueAnimator.class.getDeclaredMethod("setDurationScale", float.class); + method.invoke(null, (float) multiplier); + } catch (Exception e) { + throw new RuntimeException("Unable to apply animation speed.", e); + } + } + + private static String getDensityString(DisplayMetrics displayMetrics) { + switch (displayMetrics.densityDpi) { + case DisplayMetrics.DENSITY_LOW: + return "ldpi"; + case DisplayMetrics.DENSITY_MEDIUM: + return "mdpi"; + case DisplayMetrics.DENSITY_HIGH: + return "hdpi"; + case DisplayMetrics.DENSITY_XHIGH: + return "xhdpi"; + case DisplayMetrics.DENSITY_XXHIGH: + return "xxhdpi"; + case DisplayMetrics.DENSITY_XXXHIGH: + return "xxxhdpi"; + case DisplayMetrics.DENSITY_TV: + return "tvdpi"; + default: + return "unknown"; + } + } + + private static String getSizeString(long bytes) { + String[] units = new String[] { "B", "KB", "MB", "GB" }; + int unit = 0; + while (bytes >= 1024) { + bytes /= 1024; + unit += 1; + } + return bytes + units[unit]; + } + + private void showNewNetworkProxyDialog(final ProxyAdapter proxyAdapter) { + final int originalSelection = networkProxy.isSet() ? ProxyAdapter.PROXY : ProxyAdapter.NONE; + + View view = LayoutInflater.from(app).inflate(R.layout.debug_drawer_network_proxy, null); + final EditText host = + (EditText) view.findViewById(R.id.debug_drawer_network_proxy_host); + + new AlertDialog.Builder(activity) // + .setTitle("Set Network Proxy") + .setView(view) + .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int i) { + networkProxyView.setSelection(originalSelection); + dialog.cancel(); + } + }) + .setPositiveButton("Use", new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int i) { + String theHost = host.getText().toString(); + if (!Strings.isBlank(theHost)) { + String[] parts = theHost.split(":", 2); + SocketAddress address = + InetSocketAddress.createUnresolved(parts[0], Integer.parseInt(parts[1])); + + networkProxy.set(theHost); // Persist across restarts. + proxyAdapter.notifyDataSetChanged(); // Tell the spinner to update. + networkProxyView.setSelection(ProxyAdapter.PROXY); // And show the proxy. + + client.setProxy(new Proxy(HTTP, address)); + } else { + networkProxyView.setSelection(originalSelection); + } + } + }) + .setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override public void onCancel(DialogInterface dialogInterface) { + networkProxyView.setSelection(originalSelection); + } + }) + .show(); + } + + private void showCustomEndpointDialog(final int originalSelection, String defaultUrl) { + View view = + LayoutInflater.from(app).inflate(R.layout.debug_drawer_network_endpoint, null); + final EditText url = + (EditText) view.findViewById(R.id.debug_drawer_network_endpoint_url); + url.setText(defaultUrl); + url.setSelection(url.length()); + + new AlertDialog.Builder(activity) // + .setTitle("Set Network Endpoint") + .setView(view) + .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int i) { + endpointView.setSelection(originalSelection); + dialog.cancel(); + } + }) + .setPositiveButton("Use", new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int i) { + String theUrl = url.getText().toString(); + if (!Strings.isBlank(theUrl)) { + setEndpointAndRelaunch(theUrl); + } else { + endpointView.setSelection(originalSelection); + } + } + }) + .setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override public void onCancel(DialogInterface dialogInterface) { + endpointView.setSelection(originalSelection); + } + }) + .show(); + } + + private void setEndpointAndRelaunch(String endpoint) { + Timber.d("Setting network endpoint to %s", endpoint); + networkEndpoint.set(endpoint); + + Intent newApp = new Intent(app, MainActivity.class); + newApp.setFlags(FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK); + app.startActivity(newApp); + app.buildObjectGraphAndInject(); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/ui/debug/HierarchyTreeChangeListener.java b/src/debug/java/com/jakewharton/u2020/ui/debug/HierarchyTreeChangeListener.java new file mode 100644 index 00000000..921a118b --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/ui/debug/HierarchyTreeChangeListener.java @@ -0,0 +1,51 @@ +package com.jakewharton.u2020.ui.debug; + +import android.view.View; +import android.view.ViewGroup; + +/** + * A {@link android.view.ViewGroup.OnHierarchyChangeListener hierarchy change listener} which recursively + * monitors an entire tree of views. + */ +public final class HierarchyTreeChangeListener implements ViewGroup.OnHierarchyChangeListener { + /** + * Wrap a regular {@link android.view.ViewGroup.OnHierarchyChangeListener hierarchy change listener} with one + * that monitors an entire tree of views. + */ + public static HierarchyTreeChangeListener wrap(ViewGroup.OnHierarchyChangeListener delegate) { + return new HierarchyTreeChangeListener(delegate); + } + + private final ViewGroup.OnHierarchyChangeListener delegate; + + private HierarchyTreeChangeListener(ViewGroup.OnHierarchyChangeListener delegate) { + if (delegate == null) { + throw new NullPointerException("Delegate must not be null."); + } + this.delegate = delegate; + } + + @Override public void onChildViewAdded(View parent, View child) { + delegate.onChildViewAdded(parent, child); + + if (child instanceof ViewGroup) { + ViewGroup childGroup = (ViewGroup) child; + childGroup.setOnHierarchyChangeListener(this); + for (int i = 0; i < childGroup.getChildCount(); i++) { + onChildViewAdded(childGroup, childGroup.getChildAt(i)); + } + } + } + + @Override public void onChildViewRemoved(View parent, View child) { + if (child instanceof ViewGroup) { + ViewGroup childGroup = (ViewGroup) child; + for (int i = 0; i < childGroup.getChildCount(); i++) { + onChildViewRemoved(childGroup, childGroup.getChildAt(i)); + } + childGroup.setOnHierarchyChangeListener(null); + } + + delegate.onChildViewRemoved(parent, child); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/ui/debug/LoggingLevelAdapter.java b/src/debug/java/com/jakewharton/u2020/ui/debug/LoggingLevelAdapter.java new file mode 100644 index 00000000..2a441dca --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/ui/debug/LoggingLevelAdapter.java @@ -0,0 +1,41 @@ +package com.jakewharton.u2020.ui.debug; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import com.jakewharton.u2020.ui.misc.BindableAdapter; +import retrofit.RestAdapter; + +class LoggingLevelAdapter extends BindableAdapter { + LoggingLevelAdapter(Context context) { + super(context); + } + + @Override public int getCount() { + return RestAdapter.LogLevel.values().length; + } + + @Override public RestAdapter.LogLevel getItem(int position) { + return RestAdapter.LogLevel.values()[position]; + } + + @Override public long getItemId(int position) { + return position; + } + + @Override public View newView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_item, container, false); + } + + @Override public void bindView(RestAdapter.LogLevel item, int position, View view) { + TextView tv = (TextView) view.findViewById(android.R.id.text1); + tv.setText(item.toString()); + } + + @Override + public View newDropDownView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_dropdown_item, container, false); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/ui/debug/NetworkDelayAdapter.java b/src/debug/java/com/jakewharton/u2020/ui/debug/NetworkDelayAdapter.java new file mode 100644 index 00000000..6a9355d8 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/ui/debug/NetworkDelayAdapter.java @@ -0,0 +1,53 @@ +package com.jakewharton.u2020.ui.debug; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import com.jakewharton.u2020.ui.misc.BindableAdapter; + +class NetworkDelayAdapter extends BindableAdapter { + private static final long[] VALUES = { + 250, 500, 1000, 2000, 3000 + }; + + public static int getPositionForValue(long value) { + for (int i = 0; i < VALUES.length; i++) { + if (VALUES[i] == value) { + return i; + } + } + return 3; // Default to 2000 if something changes. + } + + NetworkDelayAdapter(Context context) { + super(context); + } + + @Override public int getCount() { + return VALUES.length; + } + + @Override public Long getItem(int position) { + return VALUES[position]; + } + + @Override public long getItemId(int position) { + return position; + } + + @Override public View newView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_item, container, false); + } + + @Override public void bindView(Long item, int position, View view) { + TextView tv = (TextView) view.findViewById(android.R.id.text1); + tv.setText(item + "ms"); + } + + @Override + public View newDropDownView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_dropdown_item, container, false); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/ui/debug/NetworkErrorAdapter.java b/src/debug/java/com/jakewharton/u2020/ui/debug/NetworkErrorAdapter.java new file mode 100644 index 00000000..79859c9a --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/ui/debug/NetworkErrorAdapter.java @@ -0,0 +1,57 @@ +package com.jakewharton.u2020.ui.debug; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import com.jakewharton.u2020.ui.misc.BindableAdapter; + +class NetworkErrorAdapter extends BindableAdapter { + private static final int[] VALUES = { + 0, 3, 10, 25, 100 + }; + + public static int getPositionForValue(int value) { + for (int i = 0; i < VALUES.length; i++) { + if (VALUES[i] == value) { + return i; + } + } + return 1; // Default to 3% if something changes. + } + + NetworkErrorAdapter(Context context) { + super(context); + } + + @Override public int getCount() { + return VALUES.length; + } + + @Override public Integer getItem(int position) { + return VALUES[position]; + } + + @Override public long getItemId(int position) { + return position; + } + + @Override public View newView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_item, container, false); + } + + @Override public void bindView(Integer item, int position, View view) { + TextView tv = (TextView) view.findViewById(android.R.id.text1); + if (item == 0) { + tv.setText("None"); + } else { + tv.setText(item + "%"); + } + } + + @Override + public View newDropDownView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_dropdown_item, container, false); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/ui/debug/NetworkVarianceAdapter.java b/src/debug/java/com/jakewharton/u2020/ui/debug/NetworkVarianceAdapter.java new file mode 100644 index 00000000..d64f1345 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/ui/debug/NetworkVarianceAdapter.java @@ -0,0 +1,53 @@ +package com.jakewharton.u2020.ui.debug; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import com.jakewharton.u2020.ui.misc.BindableAdapter; + +class NetworkVarianceAdapter extends BindableAdapter { + private static final int[] VALUES = { + 20, 40, 60 + }; + + public static int getPositionForValue(int value) { + for (int i = 0; i < VALUES.length; i++) { + if (VALUES[i] == value) { + return i; + } + } + return 1; // Default to 40% if something changes. + } + + NetworkVarianceAdapter(Context context) { + super(context); + } + + @Override public int getCount() { + return VALUES.length; + } + + @Override public Integer getItem(int position) { + return VALUES[position]; + } + + @Override public long getItemId(int position) { + return position; + } + + @Override public View newView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_item, container, false); + } + + @Override public void bindView(Integer item, int position, View view) { + TextView tv = (TextView) view.findViewById(android.R.id.text1); + tv.setText("±" + item + "%"); + } + + @Override + public View newDropDownView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_dropdown_item, container, false); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/ui/debug/ProxyAdapter.java b/src/debug/java/com/jakewharton/u2020/ui/debug/ProxyAdapter.java new file mode 100644 index 00000000..c9c67fff --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/ui/debug/ProxyAdapter.java @@ -0,0 +1,56 @@ +package com.jakewharton.u2020.ui.debug; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import com.jakewharton.u2020.data.prefs.StringPreference; +import com.jakewharton.u2020.ui.misc.BindableAdapter; + +class ProxyAdapter extends BindableAdapter { + public static final int NONE = 0; + public static final int PROXY = 1; + + private final StringPreference proxy; + + ProxyAdapter(Context context, StringPreference proxy) { + super(context); + if (proxy == null) { + throw new IllegalStateException("proxy == null"); + } + this.proxy = proxy; + } + + @Override public int getCount() { + return 2 /* "None" and "Set" */ + (proxy.isSet() ? 1 : 0); + } + + @Override public String getItem(int position) { + if (position == 0) { + return "None"; + } + if (position == getCount() - 1) { + return "Set…"; + } + return proxy.get(); + } + + @Override public long getItemId(int position) { + return position; + } + + @Override public View newView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_item, container, false); + } + + @Override public void bindView(String item, int position, View view) { + TextView tv = (TextView) view.findViewById(android.R.id.text1); + tv.setText(item); + } + + @Override + public View newDropDownView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_dropdown_item, container, false); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/ui/debug/ServerEndpointAdapter.java b/src/debug/java/com/jakewharton/u2020/ui/debug/ServerEndpointAdapter.java new file mode 100644 index 00000000..f1eebaf2 --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/ui/debug/ServerEndpointAdapter.java @@ -0,0 +1,41 @@ +package com.jakewharton.u2020.ui.debug; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import com.jakewharton.u2020.data.Endpoints; +import com.jakewharton.u2020.ui.misc.BindableAdapter; + +class ServerEndpointAdapter extends BindableAdapter { + ServerEndpointAdapter(Context context) { + super(context); + } + + @Override public int getCount() { + return Endpoints.values().length; + } + + @Override public Endpoints getItem(int position) { + return Endpoints.values()[position]; + } + + @Override public long getItemId(int position) { + return position; + } + + @Override public View newView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_item, container, false); + } + + @Override public void bindView(Endpoints item, int position, View view) { + TextView tv = (TextView) view.findViewById(android.R.id.text1); + tv.setText(item.name); + } + + @Override + public View newDropDownView(LayoutInflater inflater, int position, ViewGroup container) { + return inflater.inflate(android.R.layout.simple_spinner_dropdown_item, container, false); + } +} diff --git a/src/debug/java/com/jakewharton/u2020/ui/debug/SocketActivityHierarchyServer.java b/src/debug/java/com/jakewharton/u2020/ui/debug/SocketActivityHierarchyServer.java new file mode 100644 index 00000000..2873a3fc --- /dev/null +++ b/src/debug/java/com/jakewharton/u2020/ui/debug/SocketActivityHierarchyServer.java @@ -0,0 +1,584 @@ +/* + * 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.jakewharton.u2020.ui.debug; + +import android.app.Activity; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.ViewDebug; +import com.jakewharton.u2020.ui.ActivityHierarchyServer; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.lang.reflect.Method; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +/** + *

This class can be used to enable the use of HierarchyViewer inside an + * application. HierarchyViewer is an Android SDK tool that can be used + * to inspect and debug the user interface of running applications. For + * security reasons, HierarchyViewer does not work on production builds + * (for instance phones bought in store.) By using this class, you can + * make HierarchyViewer work on any device. You must be very careful + * however to only enable HierarchyViewer when debugging your + * application.

+ * + *

To use this view server, your application must require the INTERNET + * permission.

+ */ +public class SocketActivityHierarchyServer implements Runnable, ActivityHierarchyServer { + /** + * The default port used to start view servers. + */ + private static final int VIEW_SERVER_DEFAULT_PORT = 4939; + private static final int VIEW_SERVER_MAX_CONNECTIONS = 10; + + private static final String LOG_TAG = "SocketActivityHierarchyServer"; + + private static final String VALUE_PROTOCOL_VERSION = "4"; + private static final String VALUE_SERVER_VERSION = "4"; + + // Protocol commands + // Returns the protocol version + private static final String COMMAND_PROTOCOL_VERSION = "PROTOCOL"; + // Returns the server version + private static final String COMMAND_SERVER_VERSION = "SERVER"; + // Lists all of the available windows in the system + private static final String COMMAND_WINDOW_MANAGER_LIST = "LIST"; + // Keeps a connection open and notifies when the list of windows changes + private static final String COMMAND_WINDOW_MANAGER_AUTOLIST = "AUTOLIST"; + // Returns the focused window + private static final String COMMAND_WINDOW_MANAGER_GET_FOCUS = "GET_FOCUS"; + + private ServerSocket mServer; + private final int mPort; + + private Thread mThread; + private ExecutorService mThreadPool; + + private final List mListeners = new CopyOnWriteArrayList<>(); + + private final HashMap mWindows = new HashMap<>(); + private final ReentrantReadWriteLock mWindowsLock = new ReentrantReadWriteLock(); + + private View mFocusedWindow; + private final ReentrantReadWriteLock mFocusLock = new ReentrantReadWriteLock(); + + /** + * Creates a new ActivityHierarchyServer associated with the specified window manager on the + * default local port. The server is not started by default. + * + * @see #start() + */ + public SocketActivityHierarchyServer() { + mPort = SocketActivityHierarchyServer.VIEW_SERVER_DEFAULT_PORT; + } + + /** + * Starts the server. + * + * @return True if the server was successfully created, or false if it already exists. + * @throws java.io.IOException If the server cannot be created. + */ + public boolean start() throws IOException { + if (mThread != null) { + return false; + } + + mThread = new Thread(this, "Local View Server [port=" + mPort + "]"); + mThreadPool = Executors.newFixedThreadPool(VIEW_SERVER_MAX_CONNECTIONS); + mThread.start(); + + return true; + } + + @Override public void onActivityCreated(Activity activity, Bundle bundle) { + String name = activity.getTitle().toString(); + if (TextUtils.isEmpty(name)) { + name = activity.getClass().getCanonicalName() + + "/0x" + System.identityHashCode(activity); + } else { + name += " (" + activity.getClass().getCanonicalName() + ")"; + } + mWindowsLock.writeLock().lock(); + try { + mWindows.put(activity.getWindow().getDecorView().getRootView(), name); + } finally { + mWindowsLock.writeLock().unlock(); + } + fireWindowsChangedEvent(); + } + + @Override public void onActivityStarted(Activity activity) { + } + + @Override public void onActivityResumed(Activity activity) { + View view = activity.getWindow().getDecorView(); + mFocusLock.writeLock().lock(); + try { + mFocusedWindow = view == null ? null : view.getRootView(); + } finally { + mFocusLock.writeLock().unlock(); + } + fireFocusChangedEvent(); + } + + @Override public void onActivityPaused(Activity activity) { + } + + @Override public void onActivityStopped(Activity activity) { + } + + @Override public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { + } + + @Override public void onActivityDestroyed(Activity activity) { + mWindowsLock.writeLock().lock(); + try { + mWindows.remove(activity.getWindow().getDecorView().getRootView()); + } finally { + mWindowsLock.writeLock().unlock(); + } + fireWindowsChangedEvent(); + } + + public void run() { + try { + mServer = new ServerSocket(mPort, VIEW_SERVER_MAX_CONNECTIONS, InetAddress.getLocalHost()); + } catch (Exception e) { + Log.w(LOG_TAG, "Starting ServerSocket error: ", e); + } + + while (mServer != null && Thread.currentThread() == mThread) { + // Any uncaught exception will crash the system process + try { + Socket client = mServer.accept(); + if (mThreadPool != null) { + mThreadPool.submit(new ViewServerWorker(client)); + } else { + try { + client.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + Log.w(LOG_TAG, "Connection error: ", e); + } + } + } + + private static boolean writeValue(Socket client, String value) { + boolean result; + BufferedWriter out = null; + try { + OutputStream clientStream = client.getOutputStream(); + out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024); + out.write(value); + out.write("\n"); + out.flush(); + result = true; + } catch (Exception e) { + result = false; + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + result = false; + } + } + } + return result; + } + + private void fireWindowsChangedEvent() { + for (WindowListener listener : mListeners) { + listener.windowsChanged(); + } + } + + private void fireFocusChangedEvent() { + for (WindowListener listener : mListeners) { + listener.focusChanged(); + } + } + + private void addWindowListener(WindowListener listener) { + if (!mListeners.contains(listener)) { + mListeners.add(listener); + } + } + + private void removeWindowListener(WindowListener listener) { + mListeners.remove(listener); + } + + private interface WindowListener { + void windowsChanged(); + + void focusChanged(); + } + + private static class UncloseableOutputStream extends OutputStream { + private final OutputStream mStream; + + UncloseableOutputStream(OutputStream stream) { + mStream = stream; + } + + public void close() throws IOException { + // Don't close the stream + } + + public boolean equals(Object o) { + return mStream.equals(o); + } + + public void flush() throws IOException { + mStream.flush(); + } + + public int hashCode() { + return mStream.hashCode(); + } + + public String toString() { + return mStream.toString(); + } + + public void write(byte[] buffer, int offset, int count) throws IOException { + mStream.write(buffer, offset, count); + } + + public void write(byte[] buffer) throws IOException { + mStream.write(buffer); + } + + public void write(int oneByte) throws IOException { + mStream.write(oneByte); + } + } + + private class ViewServerWorker implements Runnable, WindowListener { + private Socket mClient; + private boolean mNeedWindowListUpdate; + private boolean mNeedFocusedWindowUpdate; + + private final Object[] mLock = new Object[0]; + + public ViewServerWorker(Socket client) { + mClient = client; + mNeedWindowListUpdate = false; + mNeedFocusedWindowUpdate = false; + } + + public void run() { + BufferedReader in = null; + try { + in = new BufferedReader(new InputStreamReader(mClient.getInputStream()), 1024); + + final String request = in.readLine(); + + String command; + String parameters; + + int index = request.indexOf(' '); + if (index == -1) { + command = request; + parameters = ""; + } else { + command = request.substring(0, index); + parameters = request.substring(index + 1); + } + + boolean result; + if (COMMAND_PROTOCOL_VERSION.equalsIgnoreCase(command)) { + result = writeValue(mClient, VALUE_PROTOCOL_VERSION); + } else if (COMMAND_SERVER_VERSION.equalsIgnoreCase(command)) { + result = writeValue(mClient, VALUE_SERVER_VERSION); + } else if (COMMAND_WINDOW_MANAGER_LIST.equalsIgnoreCase(command)) { + result = listWindows(mClient); + } else if (COMMAND_WINDOW_MANAGER_GET_FOCUS.equalsIgnoreCase(command)) { + result = getFocusedWindow(mClient); + } else if (COMMAND_WINDOW_MANAGER_AUTOLIST.equalsIgnoreCase(command)) { + result = windowManagerAutolistLoop(); + } else { + result = windowCommand(mClient, command, parameters); + } + + if (!result) { + Log.w(LOG_TAG, "An error occurred with the command: " + command); + } + } catch (IOException e) { + Log.w(LOG_TAG, "Connection error: ", e); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (mClient != null) { + try { + mClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + private boolean windowCommand(Socket client, String command, String parameters) { + boolean success = true; + BufferedWriter out = null; + + try { + // Find the hash code of the window + int index = parameters.indexOf(' '); + if (index == -1) { + index = parameters.length(); + } + final String code = parameters.substring(0, index); + int hashCode = (int) Long.parseLong(code, 16); + + // Extract the command's parameter after the window description + if (index < parameters.length()) { + parameters = parameters.substring(index + 1); + } else { + parameters = ""; + } + + final View window = findWindow(hashCode); + if (window == null) { + return false; + } + + // call stuff + final Method dispatch = + ViewDebug.class.getDeclaredMethod("dispatchCommand", View.class, String.class, + String.class, OutputStream.class); + dispatch.setAccessible(true); + dispatch.invoke(null, window, command, parameters, + new UncloseableOutputStream(client.getOutputStream())); + + if (!client.isOutputShutdown()) { + out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); + out.write("DONE\n"); + out.flush(); + } + } catch (Exception e) { + Log.w(LOG_TAG, "Could not send command " + command + + " with parameters " + parameters, e); + success = false; + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + success = false; + } + } + } + + return success; + } + + private View findWindow(int hashCode) { + if (hashCode == -1) { + View window = null; + mWindowsLock.readLock().lock(); + try { + window = mFocusedWindow; + } finally { + mWindowsLock.readLock().unlock(); + } + return window; + } + + mWindowsLock.readLock().lock(); + try { + for (Entry entry : mWindows.entrySet()) { + if (System.identityHashCode(entry.getKey()) == hashCode) { + return entry.getKey(); + } + } + } finally { + mWindowsLock.readLock().unlock(); + } + + return null; + } + + private boolean listWindows(Socket client) { + boolean result = true; + BufferedWriter out = null; + + try { + mWindowsLock.readLock().lock(); + + OutputStream clientStream = client.getOutputStream(); + out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024); + + for (Entry entry : mWindows.entrySet()) { + out.write(Integer.toHexString(System.identityHashCode(entry.getKey()))); + out.write(' '); + out.append(entry.getValue()); + out.write('\n'); + } + + out.write("DONE.\n"); + out.flush(); + } catch (Exception e) { + result = false; + } finally { + mWindowsLock.readLock().unlock(); + + if (out != null) { + try { + out.close(); + } catch (IOException e) { + result = false; + } + } + } + + return result; + } + + private boolean getFocusedWindow(Socket client) { + boolean result = true; + String focusName = null; + + BufferedWriter out = null; + try { + OutputStream clientStream = client.getOutputStream(); + out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024); + + View focusedWindow = null; + + mFocusLock.readLock().lock(); + try { + focusedWindow = mFocusedWindow; + } finally { + mFocusLock.readLock().unlock(); + } + + if (focusedWindow != null) { + mWindowsLock.readLock().lock(); + try { + focusName = mWindows.get(mFocusedWindow); + } finally { + mWindowsLock.readLock().unlock(); + } + + out.write(Integer.toHexString(System.identityHashCode(focusedWindow))); + out.write(' '); + out.append(focusName); + } + out.write('\n'); + out.flush(); + } catch (Exception e) { + result = false; + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + result = false; + } + } + } + + return result; + } + + public void windowsChanged() { + synchronized (mLock) { + mNeedWindowListUpdate = true; + mLock.notifyAll(); + } + } + + public void focusChanged() { + synchronized (mLock) { + mNeedFocusedWindowUpdate = true; + mLock.notifyAll(); + } + } + + private boolean windowManagerAutolistLoop() { + addWindowListener(this); + BufferedWriter out = null; + try { + out = new BufferedWriter(new OutputStreamWriter(mClient.getOutputStream())); + while (!Thread.interrupted()) { + boolean needWindowListUpdate = false; + boolean needFocusedWindowUpdate = false; + synchronized (mLock) { + while (!mNeedWindowListUpdate && !mNeedFocusedWindowUpdate) { + mLock.wait(); + } + if (mNeedWindowListUpdate) { + mNeedWindowListUpdate = false; + needWindowListUpdate = true; + } + if (mNeedFocusedWindowUpdate) { + mNeedFocusedWindowUpdate = false; + needFocusedWindowUpdate = true; + } + } + if (needWindowListUpdate) { + out.write("LIST UPDATE\n"); + out.flush(); + } + if (needFocusedWindowUpdate) { + out.write("FOCUS UPDATE\n"); + out.flush(); + } + } + } catch (Exception e) { + Log.w(LOG_TAG, "Connection error: ", e); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + // Ignore + } + } + removeWindowListener(this); + } + return true; + } + } +} diff --git a/src/debug/res/drawable-hdpi/debug_drawer_header_bg.9.png b/src/debug/res/drawable-hdpi/debug_drawer_header_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..701f7d7d505971f362b98104b28e9a5a9e0f57ae GIT binary patch literal 2821 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 literal 0 HcmV?d00001 diff --git a/src/debug/res/drawable-hdpi/debug_drawer_icon_edit.png b/src/debug/res/drawable-hdpi/debug_drawer_icon_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..c72c6b38f31f3f8142ec8d12a7be170fc80bfce8 GIT binary patch literal 3484 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 V5`zPB_JIHZ002ovPDHLkV1k}dH+}#B literal 0 HcmV?d00001 diff --git a/src/debug/res/drawable-mdpi/debug_drawer_icon_edit.png b/src/debug/res/drawable-mdpi/debug_drawer_icon_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..c99da63df4db09af42db339b94526806621b6bd9 GIT binary patch literal 3237 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 XzDTlL&VYPj00000NkvXXu0mjfG|>OF literal 0 HcmV?d00001 diff --git a/src/debug/res/drawable-mdpi/debug_drawer_shadow.9.png b/src/debug/res/drawable-mdpi/debug_drawer_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..dc4006570892cccc1437c8c1ecb08882e8e96c07 GIT binary patch literal 2836 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 Z7yuC95{UsDQK$d_002ovPDHLkV1fxFKV|>` literal 0 HcmV?d00001 diff --git a/src/debug/res/drawable-xhdpi/debug_drawer_icon_edit.png b/src/debug/res/drawable-xhdpi/debug_drawer_icon_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..dc1caa3feb1c8a7119cb70bda9c4348d89abbe6c GIT binary patch literal 3752 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 e1c=?({vQCkxe&bE#sL@r0000 + + + + + diff --git a/src/debug/res/layout/debug_drawer_content.xml b/src/debug/res/layout/debug_drawer_content.xml new file mode 100644 index 00000000..96ba84fb --- /dev/null +++ b/src/debug/res/layout/debug_drawer_content.xml @@ -0,0 +1,413 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/debug/res/layout/debug_drawer_contextual_action.xml b/src/debug/res/layout/debug_drawer_contextual_action.xml new file mode 100644 index 00000000..1a831632 --- /dev/null +++ b/src/debug/res/layout/debug_drawer_contextual_action.xml @@ -0,0 +1,9 @@ + + +