diff --git a/project/java/MainActivity.java b/project/java/MainActivity.java index c1e371d5c..b77d518d8 100644 --- a/project/java/MainActivity.java +++ b/project/java/MainActivity.java @@ -598,6 +598,7 @@ public class MainActivity extends Activity public void onActivityResult(int request, int response, Intent data) { super.onActivityResult(request, response, data); cloudSave.onActivityResult(request, response, data); + SettingsMenuMisc.StorageAccessConfig.onActivityResult(this, request, response, data); } private int TextInputKeyboardList[][] = diff --git a/project/java/SettingsMenu.java b/project/java/SettingsMenu.java index c1ceddf12..57233f7f8 100644 --- a/project/java/SettingsMenu.java +++ b/project/java/SettingsMenu.java @@ -248,6 +248,7 @@ class SettingsMenu new SettingsMenuKeyboard.ScreenGesturesConfig(), new SettingsMenuMisc.VideoSettingsConfig(), new SettingsMenuMisc.CommandlineConfig(), + new SettingsMenuMisc.StorageAccessConfig(), new SettingsMenuMisc.ResetToDefaultsConfig(), new OkButton(), }; diff --git a/project/java/SettingsMenuMisc.java b/project/java/SettingsMenuMisc.java index 68d813e16..ed7b56bb9 100644 --- a/project/java/SettingsMenuMisc.java +++ b/project/java/SettingsMenuMisc.java @@ -542,6 +542,42 @@ class SettingsMenuMisc extends SettingsMenu } } + public static class StorageAccessConfig extends Menu + { + public static int REQUEST_STORAGE_ID = 42; + + public static void onActivityResult(final MainActivity p, final int requestCode, final int resultCode, final Intent resultData) + { + if (requestCode == REQUEST_STORAGE_ID) + { + if (resultCode == Activity.RESULT_OK) + { + Uri treeUri = resultData.getData(); + p.getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + Log.i("SDL", "Storage write permission granted to path " + treeUri.toString()); + } + else + { + Log.i("SDL", "Storage write permission rejected"); + } + } + } + + String title(final MainActivity p) + { + return p.getResources().getString(R.string.storage_access); + } + void run (final MainActivity p) + { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) + { + p.startActivityForResult(new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), REQUEST_STORAGE_ID); + } + + goBack(p); + } + } + static class CommandlineConfig extends Menu { String title(final MainActivity p) diff --git a/project/java/googleplaygameservices/CloudSave.java b/project/java/googleplaygameservices/CloudSave.java index e91e9ca4d..5983c8d55 100644 --- a/project/java/googleplaygameservices/CloudSave.java +++ b/project/java/googleplaygameservices/CloudSave.java @@ -41,6 +41,7 @@ public class CloudSave implements GameHelper.GameHelperListener { // The game helper object. This class is mainly a wrapper around this object. protected GameHelper mHelper; + public int REQUEST_CLOUD_SAVE_ID = 38; MainActivity parent; @@ -72,6 +73,8 @@ public class CloudSave implements GameHelper.GameHelperListener { boolean createNewSave = false; public void onActivityResult(int request, int response, Intent intent) { + if (request != REQUEST_CLOUD_SAVE_ID) + return; Log.d("SDL", "CloudSave: onActivityResult() response " + response + " intent " + (intent != null)); try { @@ -119,7 +122,7 @@ public class CloudSave implements GameHelper.GameHelperListener { { public void run() { - parent.startActivityForResult(snapshotIntent, 0); + parent.startActivityForResult(snapshotIntent, REQUEST_CLOUD_SAVE_ID); } }); semaphore.acquireUninterruptibly(); @@ -192,7 +195,7 @@ public class CloudSave implements GameHelper.GameHelperListener { { public void run() { - parent.startActivityForResult(snapshotIntent, 0); + parent.startActivityForResult(snapshotIntent, REQUEST_CLOUD_SAVE_ID); } }); semaphore.acquireUninterruptibly(); diff --git a/project/java/translations/values-ru/strings.xml b/project/java/translations/values-ru/strings.xml index 5cdf50521..87397a16e 100644 --- a/project/java/translations/values-ru/strings.xml +++ b/project/java/translations/values-ru/strings.xml @@ -16,6 +16,7 @@ Внутреннее хранение - %d Мб SD карта - %d Мб Куда сохранять данные приложения +Разрешение на запись на SD карту Дополнительные загрузки Продолжить Стрелки / джойстик / Dpad diff --git a/project/java/translations/values-uk/strings.xml b/project/java/translations/values-uk/strings.xml index d45a4c2cf..5c7ff45b1 100644 --- a/project/java/translations/values-uk/strings.xml +++ b/project/java/translations/values-uk/strings.xml @@ -16,6 +16,7 @@ Внутрішнє зберігання - %d Мб SD карта - %d Мб Куди зберігати дані програми +Дозвіл на запис на SD карту Додаткові завантаження ОК Стрілки / джойстік / Dpad diff --git a/project/java/translations/values/strings.xml b/project/java/translations/values/strings.xml index 586d67de1..f421cf504 100644 --- a/project/java/translations/values/strings.xml +++ b/project/java/translations/values/strings.xml @@ -26,6 +26,7 @@ Specify directory Command line parameters, one argument per line Data installation location + Permission to write to SD card Downloads Downloads OK diff --git a/project/jni/application/ballfield/ballfield.c b/project/jni/application/ballfield/ballfield.c index 858833471..5abc00c3f 100644 --- a/project/jni/application/ballfield/ballfield.c +++ b/project/jni/application/ballfield/ballfield.c @@ -587,8 +587,26 @@ int main(int argc, char* argv[]) //SDL_ANDROID_SetScreenKeyboardButtonGenerateTouchEvents(SDL_ANDROID_SCREENKEYBOARD_BUTTON_0, 1); //SDL_ANDROID_SetScreenKeyboardButtonGenerateTouchEvents(SDL_ANDROID_SCREENKEYBOARD_BUTTON_3, 1); - create_server_socket(6000); - + { + // Write to SD card + FILE * ff = fopen("/storage/C164-1DEC/ballfield.txt", "wb"); + if (ff) + { + fputs("Ballfield!\n", ff); + fclose(ff); + } + } + + { + // Write to shared storage + FILE * ff = fopen("/storage/emulated/0/ballfield2.txt", "wb"); + if (ff) + { + fputs("Ballfield!\n", ff); + fclose(ff); + } + } + while(1) { SDL_Rect r; diff --git a/project/jni/application/ballfield/socket.c b/project/jni/application/ballfield/socket.c deleted file mode 100644 index 6a83f1040..000000000 --- a/project/jni/application/ballfield/socket.c +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include - -#define fprintf(X, ...) __android_log_print(ANDROID_LOG_INFO, "Ballfield", __VA_ARGS__) -#define printf(...) __android_log_print(ANDROID_LOG_INFO, "Ballfield", __VA_ARGS__) - - - -void error(const char *msg) -{ - perror(msg); - __android_log_print(ANDROID_LOG_ERROR, "Ballfield", "%s", msg); - exit(1); -} - -int create_server_socket(int portno) -{ - int sockfd, newsockfd; - socklen_t clilen; - char buffer[256]; - struct sockaddr_in serv_addr, cli_addr; - int n; - sockfd = socket(AF_INET, SOCK_STREAM, 0); - if (sockfd < 0) error("ERROR opening socket"); - bzero((char *) &serv_addr, sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - serv_addr.sin_addr.s_addr = INADDR_ANY; - serv_addr.sin_port = htons(portno); - if (bind(sockfd, (struct sockaddr *) &serv_addr, - sizeof(serv_addr)) < 0) error("ERROR on binding"); - listen(sockfd,5); - __android_log_print(ANDROID_LOG_INFO, "Ballfield", "Opened TCP socket %d port %d", sockfd, portno); - return 0; - /* - clilen = sizeof(cli_addr); - newsockfd = accept(sockfd, - (struct sockaddr *) &cli_addr, - &clilen); - if (newsockfd < 0) - error("ERROR on accept"); - bzero(buffer,256); - n = read(newsockfd,buffer,255); - if (n < 0) error("ERROR reading from socket"); - printf("Here is the message: %s\n",buffer); - n = write(newsockfd,"I got your message",18); - if (n < 0) error("ERROR writing to socket"); - close(newsockfd); - close(sockfd); - return 0; - */ -}