From 4fc05b347f038d0725487952be4a6ea7618bc6d3 Mon Sep 17 00:00:00 2001 From: Sergii Pylypenko Date: Tue, 31 Mar 2015 23:14:18 +0300 Subject: [PATCH] Gimp: warn user about deleting files during upgrade, removed old cruft --- project/java/Settings.java | 3 + project/java/Video.java | 14 ++- .../AndroidData/postinstall2.sh | 8 +- .../xserver-gimp/AndroidAppSettings.cfg | 4 +- .../{postinstall2.sh => postinstall.sh} | 0 .../xserver-gimp/AndroidData/update1.tgz | Bin 3002 -> 0 bytes .../AndroidData/update2-armeabi-v7a.tgz | 1 - .../xserver-gimp/AndroidData/update2-x86.tgz | 1 - .../AndroidData/update3-armeabi-v7a.tgz | 1 - .../xserver-gimp/AndroidData/update3-x86.tgz | 1 - .../xserver-gimp/AndroidData/update4.tgz | Bin 20815 -> 0 bytes .../AndroidData/update6-armeabi-v7a.tgz | 1 - .../xserver-gimp/AndroidData/update6-x86.tgz | 1 - project/jni/application/xserver/gfx.c | 88 +++++++++++++++--- project/jni/sdl-1.2/include/SDL_android.h | 4 +- .../src/video/android/SDL_androidvideo.c | 26 ++++-- project/res/raw/ultimatedroid.raw | Bin 7391 -> 8917 bytes recordUserInput.sh | 6 -- 18 files changed, 118 insertions(+), 41 deletions(-) rename project/jni/application/xserver-gimp/AndroidData/{postinstall2.sh => postinstall.sh} (100%) delete mode 100644 project/jni/application/xserver-gimp/AndroidData/update1.tgz delete mode 120000 project/jni/application/xserver-gimp/AndroidData/update2-armeabi-v7a.tgz delete mode 120000 project/jni/application/xserver-gimp/AndroidData/update2-x86.tgz delete mode 120000 project/jni/application/xserver-gimp/AndroidData/update3-armeabi-v7a.tgz delete mode 120000 project/jni/application/xserver-gimp/AndroidData/update3-x86.tgz delete mode 100644 project/jni/application/xserver-gimp/AndroidData/update4.tgz delete mode 120000 project/jni/application/xserver-gimp/AndroidData/update6-armeabi-v7a.tgz delete mode 120000 project/jni/application/xserver-gimp/AndroidData/update6-x86.tgz diff --git a/project/java/Settings.java b/project/java/Settings.java index 54e89bf06..38f3bbc4d 100644 --- a/project/java/Settings.java +++ b/project/java/Settings.java @@ -619,6 +619,9 @@ class Settings nativeSetEnv( "SDCARD", Environment.getExternalStorageDirectory().getAbsolutePath() ); nativeSetEnv( "ANDROID_VERSION", String.valueOf(android.os.Build.VERSION.SDK_INT) ); nativeSetEnv( "ANDROID_PACKAGE_NAME", p.getPackageName() ); + try { + nativeSetEnv( "ANDROID_APP_NAME", p.getString(p.getApplicationInfo().labelRes) ); + } catch (Exception eeeeee) {} if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO ) nativeSetEnv( "ANDROID_PACKAGE_PATH", p.getPackageCodePath() ); Log.d("SDL", "libSDL: Is running on OUYA: " + p.isRunningOnOUYA()); diff --git a/project/java/Video.java b/project/java/Video.java index a782d4d2f..527e195b3 100644 --- a/project/java/Video.java +++ b/project/java/Video.java @@ -916,9 +916,19 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer return ret; } - public void openExternalWebBrowser(String url) + public void openExternalApp(String pkgName, String activity, String url) { - context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + Intent i = new Intent(); + if (url != null) + { + i.setAction(Intent.ACTION_VIEW); + i.setData(Uri.parse(url)); + } + if (pkgName != null && activity != null) + { + i.setClassName(pkgName, activity); + } + context.startActivity(i); } private int PowerOf2(int i) diff --git a/project/jni/application/xserver-debian/AndroidData/postinstall2.sh b/project/jni/application/xserver-debian/AndroidData/postinstall2.sh index 8d03a6d81..18743f376 100755 --- a/project/jni/application/xserver-debian/AndroidData/postinstall2.sh +++ b/project/jni/application/xserver-debian/AndroidData/postinstall2.sh @@ -1,10 +1,14 @@ #!/system/bin/sh -echo "Extracting XSDL data files" +echo "Extracting data files" cd $SECURE_STORAGE_DIR ./busybox tar xzf $UNSECURE_STORAGE_DIR/data-1.tar.gz rm -f $UNSECURE_STORAGE_DIR/data-1.tar.gz +ARCH=`getprop ro.product.cpu.abi` +echo "Copying files for architecture $ARCH" +./busybox cp -af img-$ARCH/. img/ +echo "Removing files for other architectures" +./busybox rm -rf img-armeabi-v7a img-x86 cd $SECURE_STORAGE_DIR/img echo "Installation path: $SECURE_STORAGE_DIR/img" -ls -l $SECURE_STORAGE_DIR/img ./postinstall.sh diff --git a/project/jni/application/xserver-gimp/AndroidAppSettings.cfg b/project/jni/application/xserver-gimp/AndroidAppSettings.cfg index 73e2caa90..14c047cc1 100644 --- a/project/jni/application/xserver-gimp/AndroidAppSettings.cfg +++ b/project/jni/application/xserver-gimp/AndroidAppSettings.cfg @@ -18,7 +18,7 @@ AppVersionName="2.8.14.20" # If the URL does not contain 'http://' it is treated as file from 'project/jni/application/src/AndroidData' dir - # these files are put inside .apk package by build system # You can specify Google Play expansion files in the form 'obb:main.12345' or 'obb:patch.12345' where 12345 is the app version, first associated with the file -AppDataDownloadUrl="!!Data files|:data.tar.gz:obb:main.281420|:data.tar.gz:http://sourceforge.net/projects/libsdl-android/files/ubuntu/jessie/dist-gimp-jessie-.tar.gz/download^!!XSDL data files|:data-1.tar.gz:data-1.tgz^!!XSDL fonts|:DroidSansMono.ttf:DroidSansMono.ttf^!!Postinstall script|:postinstall.sh:postinstall2.sh^!!Update|:update1.tar.gz:update1.tgz^!!Update|:update2.tar.gz:update2-.tgz^!!Update|:update3.tar.gz:update3-.tgz^!!Update|:update4.tar.gz:update4.tgz^!!Update|:update6.tar.gz:update6-.tgz" +AppDataDownloadUrl="!!Data files|:data.tar.xz:obb:main.281420|:data.tar.xz:http://sourceforge.net/projects/libsdl-android/files/ubuntu/jessie/dist-gimp-jessie.tar.xz/download^!!XSDL data files|:data-1.tar.gz:data-1.tgz^!!XSDL fonts|:DroidSansMono.ttf:DroidSansMono.ttf^!!Postinstall script|:postinstall.sh:postinstall.sh" # Reset SDL config when updating application to the new version (y) / (n) ResetSdlConfigForThisVersion=y @@ -249,7 +249,7 @@ AppSubdirsBuild='' AppBuildExclude='' # Application command line parameters, including app name as 0-th param -AppCmdline='XSDL -nohelp -screenbuttons -exec $SECURE_STORAGE_DIR/usr/bin/xli -onroot -border black -center $SECURE_STORAGE_DIR/loading.gif ; $SECURE_STORAGE_DIR/img/proot.sh ./startx.sh' +AppCmdline='XSDL -nohelp -screenbuttons -exec $SECURE_STORAGE_DIR/usr/bin/xli -onroot -border black -center $SECURE_STORAGE_DIR/loading.gif ; $SECURE_STORAGE_DIR/img/proot.sh ./startx.sh' # Screen size is used by Google Play to prevent an app to be installed on devices with smaller screens # Minimum screen size that application supports: (s)mall / (m)edium / (l)arge diff --git a/project/jni/application/xserver-gimp/AndroidData/postinstall2.sh b/project/jni/application/xserver-gimp/AndroidData/postinstall.sh similarity index 100% rename from project/jni/application/xserver-gimp/AndroidData/postinstall2.sh rename to project/jni/application/xserver-gimp/AndroidData/postinstall.sh diff --git a/project/jni/application/xserver-gimp/AndroidData/update1.tgz b/project/jni/application/xserver-gimp/AndroidData/update1.tgz deleted file mode 100644 index 2fd22642be0f3ebd0c288c83d757fc372249ee01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3002 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 L)`~JzFfafB-t6n7 diff --git a/project/jni/application/xserver-gimp/AndroidData/update2-armeabi-v7a.tgz b/project/jni/application/xserver-gimp/AndroidData/update2-armeabi-v7a.tgz deleted file mode 120000 index 30f3f962d..000000000 --- a/project/jni/application/xserver-gimp/AndroidData/update2-armeabi-v7a.tgz +++ /dev/null @@ -1 +0,0 @@ -../../xserver-debian/AndroidData/update2-armeabi-v7a.tgz \ No newline at end of file diff --git a/project/jni/application/xserver-gimp/AndroidData/update2-x86.tgz b/project/jni/application/xserver-gimp/AndroidData/update2-x86.tgz deleted file mode 120000 index ce0925985..000000000 --- a/project/jni/application/xserver-gimp/AndroidData/update2-x86.tgz +++ /dev/null @@ -1 +0,0 @@ -../../xserver-debian/AndroidData/update2-x86.tgz \ No newline at end of file diff --git a/project/jni/application/xserver-gimp/AndroidData/update3-armeabi-v7a.tgz b/project/jni/application/xserver-gimp/AndroidData/update3-armeabi-v7a.tgz deleted file mode 120000 index c719507c9..000000000 --- a/project/jni/application/xserver-gimp/AndroidData/update3-armeabi-v7a.tgz +++ /dev/null @@ -1 +0,0 @@ -../../xserver-debian/AndroidData/update5-armeabi-v7a.tgz \ No newline at end of file diff --git a/project/jni/application/xserver-gimp/AndroidData/update3-x86.tgz b/project/jni/application/xserver-gimp/AndroidData/update3-x86.tgz deleted file mode 120000 index 101d0f2e2..000000000 --- a/project/jni/application/xserver-gimp/AndroidData/update3-x86.tgz +++ /dev/null @@ -1 +0,0 @@ -../../xserver-debian/AndroidData/update5-x86.tgz \ No newline at end of file diff --git a/project/jni/application/xserver-gimp/AndroidData/update4.tgz b/project/jni/application/xserver-gimp/AndroidData/update4.tgz deleted file mode 100644 index 83fc35f69a52e9b6c34aa392bd18599818b25deb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20815 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 diff --git a/project/jni/application/xserver-gimp/AndroidData/update6-armeabi-v7a.tgz b/project/jni/application/xserver-gimp/AndroidData/update6-armeabi-v7a.tgz deleted file mode 120000 index 75bea3a43..000000000 --- a/project/jni/application/xserver-gimp/AndroidData/update6-armeabi-v7a.tgz +++ /dev/null @@ -1 +0,0 @@ -../../xserver-debian/AndroidData/update6-armeabi-v7a.tgz \ No newline at end of file diff --git a/project/jni/application/xserver-gimp/AndroidData/update6-x86.tgz b/project/jni/application/xserver-gimp/AndroidData/update6-x86.tgz deleted file mode 120000 index d5fa151e3..000000000 --- a/project/jni/application/xserver-gimp/AndroidData/update6-x86.tgz +++ /dev/null @@ -1 +0,0 @@ -../../xserver-debian/AndroidData/update6-x86.tgz \ No newline at end of file diff --git a/project/jni/application/xserver/gfx.c b/project/jni/application/xserver/gfx.c index cc8a6f125..aab04780d 100644 --- a/project/jni/application/xserver/gfx.c +++ b/project/jni/application/xserver/gfx.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include "gfx.h" @@ -20,6 +21,8 @@ static TTF_Font* sFont; static int unpackFinished = 0; +enum { UPGRADE_WARNING_NONE, UPGRADE_WARNING_ASK, UPGRADE_WARNING_PROCEED, UPGRADE_WARNING_CANCEL }; +static int upgradeWarning = UPGRADE_WARNING_NONE; static char unpackLog[4][256]; static void renderString(const char *c, int x, int y); @@ -37,6 +40,8 @@ static int unpackFiles(const char *archive, const char *script, const char *dele char fname2[PATH_MAX*2]; char buf[1024 * 4]; struct stat st; + const char *tarExtractCommand = "tar xz -C"; + char tarxz[PATH_MAX]; if( stat( archive, &st ) == 0 ) { @@ -46,7 +51,25 @@ static int unpackFiles(const char *archive, const char *script, const char *dele __android_log_print(ANDROID_LOG_INFO, "XSDL", "Unpacking data: total size %d Mb", unpackProgressMbTotal); } else - return 1; + { + if (strstr(archive, ".tar.gz") == archive + strlen(archive) - strlen(".tar.gz")) + { + strcpy(tarxz, archive); + strstr(tarxz, ".tar.gz")[5] = 'x'; // .tar.gz -> .tar.xz + if( stat( tarxz, &st ) == 0 ) + { + __android_log_print(ANDROID_LOG_INFO, "XSDL", "Found .tar.xz archive: %s", tarxz); + archive = tarxz; + tarExtractCommand = "tar xJ -C"; + unpackProgressMbTotal = st.st_size / 1024 / 1024; + if( unpackProgressMbTotal <= 0 ) + unpackProgressMbTotal = 1; + __android_log_print(ANDROID_LOG_INFO, "XSDL", "Unpacking data: total size %d Mb", unpackProgressMbTotal); + } + else + return 1; + } + } unpackProgressMb = 0; @@ -60,6 +83,12 @@ static int unpackFiles(const char *archive, const char *script, const char *dele if( strlen(deleteOldDataMarkerFile) > 0 && stat( fname, &st ) == 0 && stat( fname2, &st ) == 0 ) { + __android_log_print(ANDROID_LOG_INFO, "XSDL", "Upgrade detected, showing warning dialog"); + upgradeWarning = UPGRADE_WARNING_ASK; + while( upgradeWarning == UPGRADE_WARNING_ASK ) + SDL_Delay(200); + if( upgradeWarning == UPGRADE_WARNING_CANCEL ) + return 1; __android_log_print(ANDROID_LOG_INFO, "XSDL", "Deleting old installation..."); sprintf(unpackLog[0], "Deleting old installation..."); @@ -95,22 +124,11 @@ static int unpackFiles(const char *archive, const char *script, const char *dele system( fname ); - strcpy( fname, getenv("SECURE_STORAGE_DIR") ); - strcat( fname, "/../cache/busybox" ); - strcat( fname, " setsid " ); - strcat( fname, getenv("SECURE_STORAGE_DIR") ); - strcat( fname, "/../cache/busybox" ); - strcat( fname, " nohup " ); - strcat( fname, getenv("SECURE_STORAGE_DIR") ); - strcat( fname, "/../cache/busybox" ); - strcat( fname, " ash -c 'sleep 2 ; /system/bin/am start --user 0 -n " ); - strcat( fname, getenv("ANDROID_PACKAGE_NAME") ); - strcat( fname, "/.MainActivity'" ); - sprintf(unpackLog[0], "Restarting the app..."); __android_log_print(ANDROID_LOG_INFO, "XSDL", "Restarting the app: %s", fname); - popen( fname, "r" ); + SDL_ANDROID_OpenExternalApp(getenv("ANDROID_PACKAGE_NAME"), ".RestartMainActivity", NULL); + sleep(1); exit(0); } @@ -120,7 +138,9 @@ static int unpackFiles(const char *archive, const char *script, const char *dele strcpy( fname, getenv("SECURE_STORAGE_DIR") ); strcat( fname, "/busybox" ); - strcat( fname, " tar xz -C " ); + strcat( fname, " " ); + strcat( fname, tarExtractCommand ); + strcat( fname, " " ); strcat( fname, getenv("SECURE_STORAGE_DIR") ); FILE * fo = popen(fname, "w"); FILE * ff = fopen(archive, "rb"); @@ -273,6 +293,9 @@ void XSDL_unpackFiles() void * status; memset(unpackLog, 0, sizeof(unpackLog)); pthread_create(&thread_id, NULL, &unpackFilesThread, NULL); + int progress = 0; + enum {PROGRESS_WHEEL_NUM = 8}; + const char *progressWheel[PROGRESS_WHEEL_NUM] = { ";,,,,,,,", ",;,,,,,,", ",,;,,,,,", ",,,;,,,,", ",,,,;,,,", ",,,,,;,,", ",,,,,,;,", ",,,,,,,;" }; while (!unpackFinished) { @@ -282,8 +305,43 @@ void XSDL_unpackFiles() renderString(unpackLog[1], VID_X/2, VID_Y*3/8); renderString(unpackLog[2], VID_X/2, VID_Y*4/8); renderString(unpackLog[3], VID_X/2, VID_Y*5/8); + progress++; + renderString(progressWheel[progress % PROGRESS_WHEEL_NUM], VID_X/2, VID_Y*6/8); renderString("You may put this app to background while it's unpacking", VID_X/2, VID_Y*7/8); SDL_Flip(SDL_GetVideoSurface()); + int x, y; + while( upgradeWarning == UPGRADE_WARNING_ASK ) + { + char s[PATH_MAX]; + sprintf(s, "New update available for %s", getenv("ANDROID_APP_NAME")); + renderString(s, VID_X/2, VID_Y*2/8); + sprintf(s, "Please move all your %s files to SD card", getenv("ANDROID_APP_NAME")); + renderString(s, VID_X/2, VID_Y*3/8); + renderString("or they will be deleted during upgrade", VID_X/2, VID_Y*4/8); + renderString("Install now", VID_X/4, VID_Y*6/8); + renderString("Install later", VID_X*3/4, VID_Y*6/8); + SDL_Flip(SDL_GetVideoSurface()); + SDL_Event event; + while (SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_KEYDOWN: + if (event.key.keysym.sym == SDLK_HELP) + upgradeWarning = UPGRADE_WARNING_CANCEL; + break; + case SDL_MOUSEBUTTONUP: + if( y > VID_Y*5/8 && y < VID_Y*7/8 ) + upgradeWarning = (x > VID_X/2) ? UPGRADE_WARNING_CANCEL : UPGRADE_WARNING_PROCEED; + break; + case SDL_JOYBALLMOTION: + x = event.jball.xrel; + y = event.jball.yrel; + break; + } + } + SDL_Delay(200); + } } pthread_join(thread_id, &status); diff --git a/project/jni/sdl-1.2/include/SDL_android.h b/project/jni/sdl-1.2/include/SDL_android.h index 43627f1f7..279e1920e 100644 --- a/project/jni/sdl-1.2/include/SDL_android.h +++ b/project/jni/sdl-1.2/include/SDL_android.h @@ -118,7 +118,9 @@ Returns 1 if load succeeded, 0 if user aborted sign-in, or there was no network */ extern DECLSPEC int SDLCALL SDL_ANDROID_CloudLoad(const char *filename, const char *saveId, const char *dialogTitle); -/* Open an Android web browser, or Chrome, or Youtube for video links */ +/* Open Android application, any parameter may be NULL */ +extern DECLSPEC void SDLCALL SDL_ANDROID_OpenExternalApp(const char *package, const char *activity, const char *data); +/* Open an Android web browser, or Chrome, or Youtube for video links. Just a wrapper for SDL_ANDROID_OpenExternalApp(NULL, NULL, url) */ extern DECLSPEC void SDLCALL SDL_ANDROID_OpenExternalWebBrowser(const char *url); #ifdef __cplusplus diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c index af72a9375..e393cac08 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c @@ -84,7 +84,7 @@ static jmethodID JavaSetAdvertisementPosition = NULL; static jmethodID JavaRequestNewAdvertisement = NULL; static jmethodID JavaRequestCloudSave = NULL; static jmethodID JavaRequestCloudLoad = NULL; -static jmethodID JavaRequestOpenExternalWebBrowser = NULL; +static jmethodID JavaRequestOpenExternalApp = NULL; static int glContextLost = 0; static int showScreenKeyboardDeferred = 0; static const char * showScreenKeyboardOldText = ""; @@ -356,7 +356,7 @@ JAVA_EXPORT_NAME(DemoRenderer_nativeInitJavaCallbacks) ( JNIEnv* env, jobject t "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)Z"); JavaRequestCloudLoad = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "cloudLoad", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z"); - JavaRequestOpenExternalWebBrowser = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "openExternalWebBrowser", "(Ljava/lang/String;)V"); + JavaRequestOpenExternalApp = (*JavaEnv)->GetMethodID(JavaEnv, JavaRendererClass, "openExternalApp", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); ANDROID_InitOSKeymap(); } @@ -571,13 +571,25 @@ int SDLCALL SDL_ANDROID_CloudLoad(const char *filename, const char *saveId, cons return result; } +void SDLCALL SDL_ANDROID_OpenExternalApp(const char *package, const char *activity, const char *data) +{ + (*JavaEnv)->PushLocalFrame(JavaEnv, 3); + jstring s1 = package ? (*JavaEnv)->NewStringUTF(JavaEnv, package) : NULL; + jstring s2 = activity ? (*JavaEnv)->NewStringUTF(JavaEnv, activity) : NULL; + jstring s3 = data ? (*JavaEnv)->NewStringUTF(JavaEnv, data) : NULL; + (*JavaEnv)->CallVoidMethod( JavaEnv, JavaRenderer, JavaRequestOpenExternalApp, s1, s2, s3 ); + if (s3) + (*JavaEnv)->DeleteLocalRef(JavaEnv, s3); + if (s2) + (*JavaEnv)->DeleteLocalRef(JavaEnv, s2); + if (s1) + (*JavaEnv)->DeleteLocalRef(JavaEnv, s1); + (*JavaEnv)->PopLocalFrame(JavaEnv, NULL); +} + void SDLCALL SDL_ANDROID_OpenExternalWebBrowser(const char *url) { - (*JavaEnv)->PushLocalFrame(JavaEnv, 1); - jstring s1 = (*JavaEnv)->NewStringUTF(JavaEnv, url); - (*JavaEnv)->CallVoidMethod( JavaEnv, JavaRenderer, JavaRequestOpenExternalWebBrowser, s1 ); - (*JavaEnv)->DeleteLocalRef(JavaEnv, s1); - (*JavaEnv)->PopLocalFrame(JavaEnv, NULL); + SDL_ANDROID_OpenExternalApp(NULL, NULL, url); } // Dummy callback for SDL2 to satisfy linker diff --git a/project/res/raw/ultimatedroid.raw b/project/res/raw/ultimatedroid.raw index 56e9f423854b93f06ad5cd5b89d6588f173d310c..c86a54055336575cb96a0c725ae17028c642f75a 100644 GIT binary patch literal 8917 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 X;Fp^%|0enYEWY5lI7 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 diff --git a/recordUserInput.sh b/recordUserInput.sh index 6bbd8959f..0817f0c98 100755 --- a/recordUserInput.sh +++ b/recordUserInput.sh @@ -1,16 +1,10 @@ #!/bin/sh -#if [ -z "$1" ]; then echo "Record user touch/key input, and replay it back via script" ; echo "Usage: $0 ScriptName.sh" ; exit ; fi - echo "#!/bin/sh" echo "# Record user touch/key input, and replay it back via script" echo "# Usage: $0 | tee ScriptName.sh ; chmod a+x ScriptName.sh ; ./ScriptName.sh" echo "# Press Ctrl-C when done" -#convert_input() { -#awk '{ if (($1 != "") && (substr($0,1,1)=="/")){ sub(":","",$1); printf("adb shell sendevent %s %d %d %d\n",$1,strtonum("0x"$2),strtonum("0x"$3),strtonum("0x"$4)); } }' -#} - CURTIME=0 export CURTIME