From 7fabfd402f235ebcf64cfde3b399b8b62b969243 Mon Sep 17 00:00:00 2001 From: fhuya Date: Mon, 2 Sep 2019 17:31:51 -0700 Subject: [PATCH 1/2] Split the Android platform java logic into an Android library module (`lib`) and an application module (`app`). The application module `app` serves double duties of providing the prebuilt Godot binaries ('android_debug.apk', 'android_release.apk') and the Godot custom build template ('android_source.zip'). --- editor/export_template_manager.cpp | 89 +--------- editor/export_template_manager.h | 2 - misc/hooks/pre-commit-clang-format | 2 +- misc/travis/clang-format.sh | 2 +- modules/mono/build_scripts/mono_configure.py | 2 +- platform/android/SCsub | 24 +-- platform/android/export/export.cpp | 4 + .../java/{ => app}/AndroidManifest.xml | 10 +- platform/android/java/app/build.gradle | 121 +++++++++++++ platform/android/java/app/config.gradle | 12 ++ .../java/app/src/com/godot/game/GodotApp.java | 10 ++ platform/android/java/build.gradle | 164 ++++++++---------- .../gradle/wrapper/gradle-wrapper.properties | 3 +- platform/android/java/lib/AndroidManifest.xml | 19 ++ platform/android/java/lib/CMakeLists.txt | 18 ++ platform/android/java/{ => lib}/THIRDPARTY.md | 0 .../vending/billing/IInAppBillingService.aidl | 0 .../licensing/ILicenseResultListener.aidl | 0 .../vending/licensing/ILicensingService.aidl | 0 platform/android/java/lib/build.gradle | 91 ++++++++++ ...android.vending.expansion.downloader.patch | 4 +- ...com.google.android.vending.licensing.patch | 2 +- .../notify_panel_notification_icon_bg.png | Bin .../notify_panel_notification_icon_bg.png | Bin .../{ => lib}/res/drawable-nodpi/icon.png | Bin .../notify_panel_notification_icon_bg.png | Bin .../notify_panel_notification_icon_bg.png | Bin .../res/layout/downloading_expansion.xml | 0 .../status_bar_ongoing_event_progress_bar.xml | 0 .../java/{ => lib}/res/values-ar/strings.xml | 0 .../java/{ => lib}/res/values-bg/strings.xml | 0 .../java/{ => lib}/res/values-ca/strings.xml | 0 .../java/{ => lib}/res/values-cs/strings.xml | 0 .../java/{ => lib}/res/values-da/strings.xml | 0 .../java/{ => lib}/res/values-de/strings.xml | 0 .../java/{ => lib}/res/values-el/strings.xml | 0 .../java/{ => lib}/res/values-en/strings.xml | 0 .../{ => lib}/res/values-es-rES/strings.xml | 0 .../java/{ => lib}/res/values-es/strings.xml | 0 .../java/{ => lib}/res/values-fa/strings.xml | 0 .../java/{ => lib}/res/values-fi/strings.xml | 0 .../java/{ => lib}/res/values-fr/strings.xml | 0 .../java/{ => lib}/res/values-hi/strings.xml | 0 .../java/{ => lib}/res/values-hr/strings.xml | 0 .../java/{ => lib}/res/values-hu/strings.xml | 0 .../java/{ => lib}/res/values-in/strings.xml | 0 .../java/{ => lib}/res/values-it/strings.xml | 0 .../java/{ => lib}/res/values-iw/strings.xml | 0 .../java/{ => lib}/res/values-ja/strings.xml | 0 .../java/{ => lib}/res/values-ko/strings.xml | 0 .../java/{ => lib}/res/values-lt/strings.xml | 0 .../java/{ => lib}/res/values-lv/strings.xml | 0 .../java/{ => lib}/res/values-nb/strings.xml | 0 .../java/{ => lib}/res/values-nl/strings.xml | 0 .../java/{ => lib}/res/values-pl/strings.xml | 0 .../java/{ => lib}/res/values-pt/strings.xml | 0 .../java/{ => lib}/res/values-ro/strings.xml | 0 .../java/{ => lib}/res/values-ru/strings.xml | 0 .../java/{ => lib}/res/values-sk/strings.xml | 0 .../java/{ => lib}/res/values-sl/strings.xml | 0 .../java/{ => lib}/res/values-sr/strings.xml | 0 .../java/{ => lib}/res/values-sv/strings.xml | 0 .../java/{ => lib}/res/values-th/strings.xml | 0 .../java/{ => lib}/res/values-tl/strings.xml | 0 .../java/{ => lib}/res/values-tr/strings.xml | 0 .../java/{ => lib}/res/values-uk/strings.xml | 0 .../java/{ => lib}/res/values-vi/strings.xml | 0 .../{ => lib}/res/values-zh-rCN/strings.xml | 0 .../{ => lib}/res/values-zh-rHK/strings.xml | 0 .../{ => lib}/res/values-zh-rTW/strings.xml | 0 .../java/{ => lib}/res/values/strings.xml | 0 .../java/{ => lib}/res/values/styles.xml | 0 .../expansion/downloader/Constants.java | 0 .../downloader/DownloadProgressInfo.java | 0 .../DownloaderClientMarshaller.java | 0 .../DownloaderServiceMarshaller.java | 0 .../vending/expansion/downloader/Helpers.java | 2 +- .../downloader/IDownloaderClient.java | 0 .../downloader/IDownloaderService.java | 0 .../vending/expansion/downloader/IStub.java | 0 .../expansion/downloader/SystemFacade.java | 0 .../downloader/impl/CustomIntentService.java | 0 .../downloader/impl/DownloadInfo.java | 0 .../downloader/impl/DownloadNotification.java | 2 +- .../downloader/impl/DownloadThread.java | 0 .../downloader/impl/DownloaderService.java | 0 .../downloader/impl/DownloadsDB.java | 0 .../downloader/impl/HttpDateTime.java | 0 .../vending/licensing/AESObfuscator.java | 0 .../vending/licensing/APKExpansionPolicy.java | 0 .../vending/licensing/DeviceLimiter.java | 0 .../vending/licensing/LicenseChecker.java | 0 .../licensing/LicenseCheckerCallback.java | 0 .../vending/licensing/LicenseValidator.java | 0 .../vending/licensing/NullDeviceLimiter.java | 0 .../android/vending/licensing/Obfuscator.java | 0 .../android/vending/licensing/Policy.java | 0 .../licensing/PreferenceObfuscator.java | 0 .../vending/licensing/ResponseData.java | 0 .../licensing/ServerManagedPolicy.java | 0 .../vending/licensing/StrictPolicy.java | 0 .../licensing/ValidationException.java | 0 .../vending/licensing/util/Base64.java | 2 +- .../util/Base64DecoderException.java | 0 .../licensing/util/URIQueryDecoder.java | 0 .../src/org/godotengine/godot/Dictionary.java | 0 .../src/org/godotengine/godot/Godot.java | 34 ++-- .../godot/GodotDownloaderAlarmReceiver.java | 0 .../godot/GodotDownloaderService.java | 0 .../src/org/godotengine/godot/GodotIO.java | 8 - .../godot/GodotInstrumentation.java | 0 .../src/org/godotengine/godot/GodotLib.java | 0 .../org/godotengine/godot/GodotPaymentV3.java | 0 .../org/godotengine/godot/GodotRenderer.java | 0 .../src/org/godotengine/godot/GodotView.java | 0 .../godot/input/GodotEditText.java | 0 .../godot/input/GodotInputHandler.java | 0 .../godot/input/GodotTextInputWrapper.java | 1 - .../godot/input/InputManagerCompat.java | 0 .../godot/input/InputManagerV16.java | 0 .../org/godotengine/godot/input/Joystick.java | 0 .../godot/payments/ConsumeTask.java | 1 - .../godot/payments/HandlePurchaseTask.java | 11 -- .../godot/payments/PaymentsCache.java | 0 .../godot/payments/PaymentsManager.java | 1 - .../godot/payments/PurchaseTask.java | 7 - .../payments/ReleaseAllConsumablesTask.java | 0 .../godot/payments/ValidateTask.java | 11 -- .../org/godotengine/godot/utils/Crypt.java | 0 .../godot/utils/CustomSSLSocketFactory.java | 0 .../org/godotengine/godot/utils/GLUtils.java | 0 .../godot/utils/HttpRequester.java | 4 - .../godot/utils/RequestParams.java | 0 .../src/org/godotengine/godot/xr/XRMode.java | 0 .../godot/xr/ovr/OvrConfigChooser.java | 0 .../godot/xr/ovr/OvrContextFactory.java | 0 .../godot/xr/ovr/OvrWindowSurfaceFactory.java | 0 .../xr/regular/RegularConfigChooser.java | 0 .../xr/regular/RegularContextFactory.java | 0 .../regular/RegularFallbackConfigChooser.java | 0 platform/android/java/settings.gradle | 5 + 141 files changed, 386 insertions(+), 282 deletions(-) rename platform/android/java/{ => app}/AndroidManifest.xml (87%) create mode 100644 platform/android/java/app/build.gradle create mode 100644 platform/android/java/app/config.gradle create mode 100644 platform/android/java/app/src/com/godot/game/GodotApp.java create mode 100644 platform/android/java/lib/AndroidManifest.xml create mode 100644 platform/android/java/lib/CMakeLists.txt rename platform/android/java/{ => lib}/THIRDPARTY.md (100%) rename platform/android/java/{ => lib}/aidl/com/android/vending/billing/IInAppBillingService.aidl (100%) rename platform/android/java/{ => lib}/aidl/com/android/vending/licensing/ILicenseResultListener.aidl (100%) rename platform/android/java/{ => lib}/aidl/com/android/vending/licensing/ILicensingService.aidl (100%) create mode 100644 platform/android/java/lib/build.gradle rename platform/android/java/{ => lib}/patches/com.google.android.vending.expansion.downloader.patch (99%) rename platform/android/java/{ => lib}/patches/com.google.android.vending.licensing.patch (97%) rename platform/android/java/{ => lib}/res/drawable-hdpi/notify_panel_notification_icon_bg.png (100%) rename platform/android/java/{ => lib}/res/drawable-mdpi/notify_panel_notification_icon_bg.png (100%) rename platform/android/java/{ => lib}/res/drawable-nodpi/icon.png (100%) rename platform/android/java/{ => lib}/res/drawable-xhdpi/notify_panel_notification_icon_bg.png (100%) rename platform/android/java/{ => lib}/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png (100%) rename platform/android/java/{ => lib}/res/layout/downloading_expansion.xml (100%) rename platform/android/java/{ => lib}/res/layout/status_bar_ongoing_event_progress_bar.xml (100%) rename platform/android/java/{ => lib}/res/values-ar/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-bg/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-ca/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-cs/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-da/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-de/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-el/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-en/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-es-rES/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-es/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-fa/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-fi/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-fr/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-hi/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-hr/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-hu/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-in/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-it/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-iw/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-ja/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-ko/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-lt/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-lv/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-nb/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-nl/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-pl/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-pt/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-ro/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-ru/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-sk/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-sl/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-sr/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-sv/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-th/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-tl/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-tr/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-uk/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-vi/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-zh-rCN/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-zh-rHK/strings.xml (100%) rename platform/android/java/{ => lib}/res/values-zh-rTW/strings.xml (100%) rename platform/android/java/{ => lib}/res/values/strings.xml (100%) rename platform/android/java/{ => lib}/res/values/styles.xml (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/Constants.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/Helpers.java (99%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/IDownloaderService.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/IStub.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/SystemFacade.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java (99%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/AESObfuscator.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/APKExpansionPolicy.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/DeviceLimiter.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/LicenseChecker.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/LicenseCheckerCallback.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/LicenseValidator.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/NullDeviceLimiter.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/Obfuscator.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/Policy.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/PreferenceObfuscator.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/ResponseData.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/ServerManagedPolicy.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/StrictPolicy.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/ValidationException.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/util/Base64.java (99%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/util/Base64DecoderException.java (100%) rename platform/android/java/{ => lib}/src/com/google/android/vending/licensing/util/URIQueryDecoder.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/Dictionary.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/Godot.java (96%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/GodotDownloaderService.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/GodotIO.java (98%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/GodotInstrumentation.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/GodotLib.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/GodotPaymentV3.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/GodotRenderer.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/GodotView.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/input/GodotEditText.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/input/GodotInputHandler.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/input/GodotTextInputWrapper.java (99%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/input/InputManagerCompat.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/input/InputManagerV16.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/input/Joystick.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/payments/ConsumeTask.java (99%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/payments/HandlePurchaseTask.java (91%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/payments/PaymentsCache.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/payments/PaymentsManager.java (99%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/payments/PurchaseTask.java (95%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/payments/ReleaseAllConsumablesTask.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/payments/ValidateTask.java (92%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/utils/Crypt.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/utils/CustomSSLSocketFactory.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/utils/GLUtils.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/utils/HttpRequester.java (98%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/utils/RequestParams.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/xr/XRMode.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/xr/regular/RegularContextFactory.java (100%) rename platform/android/java/{ => lib}/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java (100%) create mode 100644 platform/android/java/settings.gradle diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp index 536cfaa1dd..202b554be4 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -562,10 +562,8 @@ bool ExportTemplateManager::can_install_android_template() { Error ExportTemplateManager::install_android_template() { - // To support custom Android builds, we install various things to the project's res://android folder. - // First is the Java source code and buildsystem from android_source.zip. - // Then we extract the Godot Android libraries from pre-build android_release.apk - // and android_debug.apk, to place them in the libs folder. + // To support custom Android builds, we install the Java source code and buildsystem + // from android_source.zip to the project's res://android folder. DirAccessRef da = DirAccess::open("res://"); ERR_FAIL_COND_V(!da, ERR_CANT_CREATE); @@ -661,89 +659,6 @@ Error ExportTemplateManager::install_android_template() { ProgressDialog::get_singleton()->end_task("uncompress_src"); unzClose(pkg); - // Extract libs from pre-built APKs. - err = _extract_libs_from_apk("release"); - ERR_FAIL_COND_V_MSG(err != OK, err, "Can't extract Android libs from android_release.apk."); - err = _extract_libs_from_apk("debug"); - ERR_FAIL_COND_V_MSG(err != OK, err, "Can't extract Android libs from android_debug.apk."); - - return OK; -} - -Error ExportTemplateManager::_extract_libs_from_apk(const String &p_target_name) { - - const String &templates_path = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG); - const String &apk_file = templates_path.plus_file("android_" + p_target_name + ".apk"); - ERR_FAIL_COND_V(!FileAccess::exists(apk_file), ERR_CANT_OPEN); - - FileAccess *src_f = NULL; - zlib_filefunc_def io = zipio_create_io_from_file(&src_f); - - unzFile pkg = unzOpen2(apk_file.utf8().get_data(), &io); - ERR_FAIL_COND_V_MSG(!pkg, ERR_CANT_OPEN, "Android APK can't be extracted."); - - DirAccessRef da = DirAccess::open("res://"); - ERR_FAIL_COND_V(!da, ERR_CANT_CREATE); - - // 8 steps because 4 arches, 2 libs per arch. - ProgressDialog::get_singleton()->add_task("extract_libs_from_apk", TTR("Extracting Android Libraries From APKs"), 8); - - int ret = unzGoToFirstFile(pkg); - Set dirs_tested; - int idx = 0; - while (ret == UNZ_OK) { - // Get file path. - unz_file_info info; - char fpath[16384]; - ret = unzGetCurrentFileInfo(pkg, &info, fpath, 16384, NULL, 0, NULL, 0); - - String path = fpath; - String base_dir = path.get_base_dir(); - String file = path.get_file(); - - if (!base_dir.begins_with("lib") || path.ends_with("/")) { - ret = unzGoToNextFile(pkg); - continue; - } - - Vector data; - data.resize(info.uncompressed_size); - - // Read. - unzOpenCurrentFile(pkg); - unzReadCurrentFile(pkg, data.ptrw(), data.size()); - unzCloseCurrentFile(pkg); - - // We have a "lib" folder in the APK, but it should be "libs/{release,debug}" in the source dir. - String target_base_dir = base_dir.replace_first("lib", String("libs").plus_file(p_target_name)); - - if (!dirs_tested.has(base_dir)) { - da->make_dir_recursive(String("android/build").plus_file(target_base_dir)); - dirs_tested.insert(base_dir); - } - - String to_write = String("res://android/build").plus_file(target_base_dir.plus_file(path.get_file())); - FileAccess *f = FileAccess::open(to_write, FileAccess::WRITE); - if (f) { - f->store_buffer(data.ptr(), data.size()); - memdelete(f); -#ifndef WINDOWS_ENABLED - // We can't retrieve Unix permissions from the APK it seems, so simply set 0755 as should be. - FileAccess::set_unix_permissions(to_write, 0755); -#endif - } else { - ERR_PRINTS("Can't uncompress file: " + to_write); - } - - ProgressDialog::get_singleton()->task_step("extract_libs_from_apk", path, idx); - - idx++; - ret = unzGoToNextFile(pkg); - } - - ProgressDialog::get_singleton()->end_task("extract_libs_from_apk"); - unzClose(pkg); - return OK; } diff --git a/editor/export_template_manager.h b/editor/export_template_manager.h index ecb8e85b21..ad3ab507b3 100644 --- a/editor/export_template_manager.h +++ b/editor/export_template_manager.h @@ -72,8 +72,6 @@ class ExportTemplateManager : public ConfirmationDialog { virtual void ok_pressed(); bool _install_from_file(const String &p_file, bool p_use_progress = true); - Error _extract_libs_from_apk(const String &p_target_name); - void _http_download_mirror_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data); void _http_download_templates_completed(int p_status, int p_code, const PoolStringArray &headers, const PoolByteArray &p_data); diff --git a/misc/hooks/pre-commit-clang-format b/misc/hooks/pre-commit-clang-format index 3a0ac9f389..e309233a8b 100755 --- a/misc/hooks/pre-commit-clang-format +++ b/misc/hooks/pre-commit-clang-format @@ -86,7 +86,7 @@ do if grep -q "thirdparty" <<< $file; then continue; fi - if grep -q "platform/android/java/src/com" <<< $file; then + if grep -q "platform/android/java/lib/src/com" <<< $file; then continue; fi diff --git a/misc/travis/clang-format.sh b/misc/travis/clang-format.sh index 48378281d4..097b2a9378 100755 --- a/misc/travis/clang-format.sh +++ b/misc/travis/clang-format.sh @@ -11,7 +11,7 @@ else RANGE=HEAD fi -FILES=$(git diff-tree --no-commit-id --name-only -r $RANGE | grep -v thirdparty/ | grep -v platform/android/java/src/com/ | grep -E "\.(c|h|cpp|hpp|cc|hh|cxx|m|mm|inc|java|glsl)$") +FILES=$(git diff-tree --no-commit-id --name-only -r $RANGE | grep -v thirdparty/ | grep -v platform/android/java/lib/src/com/ | grep -E "\.(c|h|cpp|hpp|cc|hh|cxx|m|mm|inc|java|glsl)$") echo "Checking files:\n$FILES" # create a random filename to store our generated patch diff --git a/modules/mono/build_scripts/mono_configure.py b/modules/mono/build_scripts/mono_configure.py index f751719531..4c1ebd8d74 100644 --- a/modules/mono/build_scripts/mono_configure.py +++ b/modules/mono/build_scripts/mono_configure.py @@ -18,7 +18,7 @@ android_arch_dirs = { def get_android_out_dir(env): - return os.path.join(Dir('#platform/android/java/libs').abspath, + return os.path.join(Dir('#platform/android/java/lib/libs').abspath, 'release' if env['target'] == 'release' else 'debug', android_arch_dirs[env['android_arch']]) diff --git a/platform/android/SCsub b/platform/android/SCsub index 1bd8161fa7..65172a12c0 100644 --- a/platform/android/SCsub +++ b/platform/android/SCsub @@ -50,30 +50,8 @@ if lib_arch_dir != '': else: # release_debug, debug lib_type_dir = 'debug' - out_dir = '#platform/android/java/libs/' + lib_type_dir + '/' + lib_arch_dir + out_dir = '#platform/android/java/lib/libs/' + lib_type_dir + '/' + lib_arch_dir env_android.Command(out_dir + '/libgodot_android.so', '#bin/libgodot' + env['SHLIBSUFFIX'], Move("$TARGET", "$SOURCE")) stl_lib_path = str(env['ANDROID_NDK_ROOT']) + '/sources/cxx-stl/llvm-libc++/libs/' + lib_arch_dir + '/libc++_shared.so' env_android.Command(out_dir + '/libc++_shared.so', stl_lib_path, Copy("$TARGET", "$SOURCE")) - -# Zip android/java folder for the source export template. -print("Archiving platform/android/java as bin/android_source.zip...") -import os -import zipfile -# Change dir to avoid have zipped paths start from the android/java folder. -olddir = os.getcwd() -os.chdir(Dir('#platform/android/java').abspath) -bindir = Dir('#bin').abspath -# Make 'bin' dir if missing, can happen on fresh clone. -if not os.path.exists(bindir): - os.makedirs(bindir) -zipf = zipfile.ZipFile(os.path.join(bindir, 'android_source.zip'), 'w', zipfile.ZIP_DEFLATED) -exclude_dirs = ['.gradle', 'build', 'libs', 'patches'] -for root, dirs, files in os.walk('.', topdown=True): - # Change 'dirs' in place to exclude folders we don't want. - # https://stackoverflow.com/a/19859907 - dirs[:] = [d for d in dirs if d not in exclude_dirs] - for f in files: - zipf.write(os.path.join(root, f)) -zipf.close() -os.chdir(olddir) diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index 441fa38bff..1c4450c0c3 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -794,6 +794,10 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { string_table.write[attr_value] = version_name; } + if (tname == "instrumentation" && attrname == "targetPackage") { + string_table.write[attr_value] = get_package_name(package_name); + } + if (tname == "activity" && attrname == "screenOrientation") { encode_uint32(orientation == 0 ? 0 : 1, &p_manifest.write[iofs + 16]); diff --git a/platform/android/java/AndroidManifest.xml b/platform/android/java/app/AndroidManifest.xml similarity index 87% rename from platform/android/java/AndroidManifest.xml rename to platform/android/java/app/AndroidManifest.xml index 5114aeb8c5..d5f4ba18d6 100644 --- a/platform/android/java/AndroidManifest.xml +++ b/platform/android/java/app/AndroidManifest.xml @@ -41,7 +41,7 @@ android:value="xr_mode_metadata_value" /> - - - - diff --git a/platform/android/java/app/build.gradle b/platform/android/java/app/build.gradle new file mode 100644 index 0000000000..9f64c3dc8a --- /dev/null +++ b/platform/android/java/app/build.gradle @@ -0,0 +1,121 @@ +// Gradle build config for Godot Engine's Android port. +// +// Do not remove/modify comments ending with BEGIN/END, they are used to inject +// addon-specific configuration. +apply from: 'config.gradle' + +buildscript { + apply from: 'config.gradle' + + repositories { + google() + jcenter() +//CHUNK_BUILDSCRIPT_REPOSITORIES_BEGIN +//CHUNK_BUILDSCRIPT_REPOSITORIES_END + } + dependencies { + classpath libraries.androidGradlePlugin +//CHUNK_BUILDSCRIPT_DEPENDENCIES_BEGIN +//CHUNK_BUILDSCRIPT_DEPENDENCIES_END + } +} + +apply plugin: 'com.android.application' + +allprojects { + repositories { + mavenCentral() + google() + jcenter() +//CHUNK_ALLPROJECTS_REPOSITORIES_BEGIN +//CHUNK_ALLPROJECTS_REPOSITORIES_END + } +} + +dependencies { + if (rootProject.findProject(":lib")) { + implementation project(":lib") + } else { + // Custom build mode. In this scenario this project is the only one around and the Godot + // library is available through the pre-generated godot-lib.*.aar android archive files. + debugImplementation fileTree(dir: 'libs/debug', include: ['*.jar', '*.aar']) + releaseImplementation fileTree(dir: 'libs/release', include: ['*.jar', '*.aar']) + } +//CHUNK_DEPENDENCIES_BEGIN +//CHUNK_DEPENDENCIES_END +} + +android { + compileSdkVersion versions.compileSdk + buildToolsVersion versions.buildTools + + defaultConfig { + // Feel free to modify the application id to your own. + applicationId "com.godot.game" + minSdkVersion versions.minSdk + targetSdkVersion versions.targetSdk +//CHUNK_ANDROID_DEFAULTCONFIG_BEGIN +//CHUNK_ANDROID_DEFAULTCONFIG_END + } + + lintOptions { + abortOnError false + disable 'MissingTranslation', 'UnusedResources' + } + + packagingOptions { + exclude 'META-INF/LICENSE' + exclude 'META-INF/NOTICE' + } + + // Both signing and zip-aligning will be done at export time + buildTypes.all { buildType -> + buildType.zipAlignEnabled false + buildType.signingConfig null + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = [ + 'src' +//DIR_SRC_BEGIN +//DIR_SRC_END + ] + res.srcDirs = [ + 'res' +//DIR_RES_BEGIN +//DIR_RES_END + ] + aidl.srcDirs = [ + 'aidl' +//DIR_AIDL_BEGIN +//DIR_AIDL_END + ] + assets.srcDirs = [ + 'assets' +//DIR_ASSETS_BEGIN +//DIR_ASSETS_END + ] + } + debug.jniLibs.srcDirs = [ + 'libs/debug' +//DIR_JNI_DEBUG_BEGIN +//DIR_JNI_DEBUG_END + ] + release.jniLibs.srcDirs = [ + 'libs/release' +//DIR_JNI_RELEASE_BEGIN +//DIR_JNI_RELEASE_END + ] + } + + applicationVariants.all { variant -> + variant.outputs.all { output -> + output.outputFileName = "android_${variant.name}.apk" + } + } +} + +//CHUNK_GLOBAL_BEGIN +//CHUNK_GLOBAL_END diff --git a/platform/android/java/app/config.gradle b/platform/android/java/app/config.gradle new file mode 100644 index 0000000000..20c3123221 --- /dev/null +++ b/platform/android/java/app/config.gradle @@ -0,0 +1,12 @@ +ext.versions = [ + androidGradlePlugin : '3.4.2', + compileSdk : 28, + minSdk : 18, + targetSdk : 28, + buildTools : '28.0.3', + +] + +ext.libraries = [ + androidGradlePlugin : "com.android.tools.build:gradle:$versions.androidGradlePlugin" +] diff --git a/platform/android/java/app/src/com/godot/game/GodotApp.java b/platform/android/java/app/src/com/godot/game/GodotApp.java new file mode 100644 index 0000000000..fabd7b1dbb --- /dev/null +++ b/platform/android/java/app/src/com/godot/game/GodotApp.java @@ -0,0 +1,10 @@ +package com.godot.game; + +import org.godotengine.godot.Godot; + +/** + * Template activity for Godot Android custom builds. + * Feel free to extend and modify this class for your custom logic. + */ +public class GodotApp extends Godot { +} diff --git a/platform/android/java/build.gradle b/platform/android/java/build.gradle index 0f8499ba91..99ffa937b0 100644 --- a/platform/android/java/build.gradle +++ b/platform/android/java/build.gradle @@ -1,111 +1,95 @@ -// Gradle build config for Godot Engine's Android port. -// -// Do not remove/modify comments ending with BEGIN/END, they are used to inject -// addon-specific configuration. +apply from: 'app/config.gradle' buildscript { + apply from: 'app/config.gradle' + repositories { google() jcenter() -//CHUNK_BUILDSCRIPT_REPOSITORIES_BEGIN -//CHUNK_BUILDSCRIPT_REPOSITORIES_END } dependencies { - classpath 'com.android.tools.build:gradle:3.4.2' -//CHUNK_BUILDSCRIPT_DEPENDENCIES_BEGIN -//CHUNK_BUILDSCRIPT_DEPENDENCIES_END + classpath libraries.androidGradlePlugin } } -apply plugin: 'com.android.application' - allprojects { repositories { - mavenCentral() google() jcenter() -//CHUNK_ALLPROJECTS_REPOSITORIES_BEGIN -//CHUNK_ALLPROJECTS_REPOSITORIES_END + mavenCentral() } } -dependencies { - implementation "com.android.support:support-core-utils:28.0.0" -//CHUNK_DEPENDENCIES_BEGIN -//CHUNK_DEPENDENCIES_END +def binDir = "../../../bin/" + +/** + * Copy the generated 'android_debug.apk' binary template into the Godot bin directory. + * Depends on the app build task to ensure the binary is generated prior to copying. + */ +task copyDebugBinaryToBin(type: Copy) { + dependsOn ':app:build' + from('app/build/outputs/apk/debug') + into(binDir) + include('android_debug.apk') } -android { - compileSdkVersion 28 - buildToolsVersion "28.0.3" - useLibrary 'org.apache.http.legacy' - - defaultConfig { - minSdkVersion 18 - targetSdkVersion 28 -//CHUNK_ANDROID_DEFAULTCONFIG_BEGIN -//CHUNK_ANDROID_DEFAULTCONFIG_END - } - - lintOptions { - abortOnError false - disable 'MissingTranslation', 'UnusedResources' - } - - packagingOptions { - exclude 'META-INF/LICENSE' - exclude 'META-INF/NOTICE' - } - - // Both signing and zip-aligning will be done at export time - buildTypes.all { buildType -> - buildType.zipAlignEnabled false - buildType.signingConfig null - } - - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = [ - 'src' -//DIR_SRC_BEGIN -//DIR_SRC_END - ] - res.srcDirs = [ - 'res' -//DIR_RES_BEGIN -//DIR_RES_END - ] - aidl.srcDirs = [ - 'aidl' -//DIR_AIDL_BEGIN -//DIR_AIDL_END - ] - assets.srcDirs = [ - 'assets' -//DIR_ASSETS_BEGIN -//DIR_ASSETS_END - ] - } - debug.jniLibs.srcDirs = [ - 'libs/debug' -//DIR_JNI_DEBUG_BEGIN -//DIR_JNI_DEBUG_END - ] - release.jniLibs.srcDirs = [ - 'libs/release' -//DIR_JNI_RELEASE_BEGIN -//DIR_JNI_RELEASE_END - ] - } - - // No longer used, as it's not useful for build source template - //applicationVariants.all { variant -> - // variant.outputs.all { output -> - // output.outputFileName = "../../../../../../../bin/android_${variant.name}.apk" - // } - //} +/** + * Copy the generated 'android_release.apk' binary template into the Godot bin directory. + * Depends on the app build task to ensure the binary is generated prior to copying. + */ +task copyReleaseBinaryToBin(type: Copy) { + dependsOn ':app:build' + from('app/build/outputs/apk/release') + into(binDir) + include('android_release.apk') } -//CHUNK_GLOBAL_BEGIN -//CHUNK_GLOBAL_END +/** + * Copy the Godot android library archive debug file into the app debug libs directory. + * Depends on the library build task to ensure the AAR file is generated prior to copying. + */ +task copyDebugAAR(type: Copy) { + dependsOn ':lib:build' + from('lib/build/outputs/aar') + into('app/libs/debug') + include('godot-lib.debug.aar') +} + +/** + * Copy the Godot android library archive release file into the app release libs directory. + * Depends on the library build task to ensure the AAR file is generated prior to copying. + */ +task copyReleaseAAR(type: Copy) { + dependsOn ':lib:build' + from('lib/build/outputs/aar') + into('app/libs/release') + include('godot-lib.release.aar') +} + +/** + * Generate Godot custom build template by zipping the source files from the app directory, as well + * as the AAR files generated by 'copyDebugAAR' and 'copyReleaseAAR'. + * The zip file also includes some gradle tools to allow building of the custom build. + */ +task zipCustomBuild(type: Zip) { + dependsOn 'copyDebugAAR' + dependsOn 'copyReleaseAAR' + from(fileTree(dir: 'app', excludes: ['**/build/**', '**/.gradle/**', '**/*.iml']), fileTree(dir: '.', includes: ['gradle.properties','gradlew', 'gradlew.bat', 'gradle/**'])) + include '**/*' + archiveName 'android_source.zip' + destinationDir(file(binDir)) +} + +/** + * Master task used to coordinate the tasks defined above to generate the set of Godot templates. + */ +task generateGodotTemplates(type: GradleBuild) { + tasks = [ + // Copy the generated aar library files to the custom build directory. + 'copyDebugAAR', 'copyReleaseAAR', + // Zip the custom build directory. + 'zipCustomBuild', + // Copy the prebuilt binary templates to the bin directory. + 'copyDebugBinaryToBin', 'copyReleaseBinaryToBin', + ] +} diff --git a/platform/android/java/gradle/wrapper/gradle-wrapper.properties b/platform/android/java/gradle/wrapper/gradle-wrapper.properties index 558870dad5..bf50265715 100644 --- a/platform/android/java/gradle/wrapper/gradle-wrapper.properties +++ b/platform/android/java/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Mon Sep 02 02:44:30 PDT 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/platform/android/java/lib/AndroidManifest.xml b/platform/android/java/lib/AndroidManifest.xml new file mode 100644 index 0000000000..517fc403b2 --- /dev/null +++ b/platform/android/java/lib/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/platform/android/java/lib/CMakeLists.txt b/platform/android/java/lib/CMakeLists.txt new file mode 100644 index 0000000000..d3bdf6a5f2 --- /dev/null +++ b/platform/android/java/lib/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.6) +project(godot) + +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +set(GODOT_ROOT_DIR ../../../..) + +# Get sources +file(GLOB_RECURSE SOURCES ${GODOT_ROOT_DIR}/*.c**) +file(GLOB_RECURSE HEADERS ${GODOT_ROOT_DIR}/*.h**) + +add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) +target_include_directories(${PROJECT_NAME} + SYSTEM PUBLIC + ${GODOT_ROOT_DIR} + ${GODOT_ROOT_DIR}/modules/gdnative/include) diff --git a/platform/android/java/THIRDPARTY.md b/platform/android/java/lib/THIRDPARTY.md similarity index 100% rename from platform/android/java/THIRDPARTY.md rename to platform/android/java/lib/THIRDPARTY.md diff --git a/platform/android/java/aidl/com/android/vending/billing/IInAppBillingService.aidl b/platform/android/java/lib/aidl/com/android/vending/billing/IInAppBillingService.aidl similarity index 100% rename from platform/android/java/aidl/com/android/vending/billing/IInAppBillingService.aidl rename to platform/android/java/lib/aidl/com/android/vending/billing/IInAppBillingService.aidl diff --git a/platform/android/java/aidl/com/android/vending/licensing/ILicenseResultListener.aidl b/platform/android/java/lib/aidl/com/android/vending/licensing/ILicenseResultListener.aidl similarity index 100% rename from platform/android/java/aidl/com/android/vending/licensing/ILicenseResultListener.aidl rename to platform/android/java/lib/aidl/com/android/vending/licensing/ILicenseResultListener.aidl diff --git a/platform/android/java/aidl/com/android/vending/licensing/ILicensingService.aidl b/platform/android/java/lib/aidl/com/android/vending/licensing/ILicensingService.aidl similarity index 100% rename from platform/android/java/aidl/com/android/vending/licensing/ILicensingService.aidl rename to platform/android/java/lib/aidl/com/android/vending/licensing/ILicensingService.aidl diff --git a/platform/android/java/lib/build.gradle b/platform/android/java/lib/build.gradle new file mode 100644 index 0000000000..6d07504e45 --- /dev/null +++ b/platform/android/java/lib/build.gradle @@ -0,0 +1,91 @@ +apply plugin: 'com.android.library' + +dependencies { + implementation "com.android.support:support-core-utils:28.0.0" +} + +def pathToRootDir = "../../../../" +// Note: Only keep the abis you support to speed up the gradle 'assemble' task. +def supportedAbis = ["armv7", "arm64v8", "x86", "x86_64"] + +android { + compileSdkVersion versions.compileSdk + buildToolsVersion versions.buildTools + useLibrary 'org.apache.http.legacy' + + defaultConfig { + minSdkVersion versions.minSdk + targetSdkVersion versions.targetSdk + } + + lintOptions { + abortOnError false + disable 'MissingTranslation', 'UnusedResources' + } + + packagingOptions { + exclude 'META-INF/LICENSE' + exclude 'META-INF/NOTICE' + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + res.srcDirs = ['res'] + aidl.srcDirs = ['aidl'] + assets.srcDirs = ['assets'] + } + debug.jniLibs.srcDirs = ['libs/debug'] + release.jniLibs.srcDirs = ['libs/release'] + } + + libraryVariants.all { variant -> + variant.outputs.all { output -> + output.outputFileName = "godot-lib.${variant.name}.aar" + } + + def buildType = variant.buildType.name.capitalize() + + def taskPrefix = "" + if (project.path != ":") { + taskPrefix = project.path + ":" + } + + // Disable the externalNativeBuild* task as it would cause build failures since the cmake build + // files is only setup for editing support. + gradle.startParameter.excludedTaskNames += taskPrefix + "externalNativeBuild" + buildType + + // Create tasks to generate the Godot native libraries. + def taskName = "compileGodotNativeLibs" + buildType + def releaseTarget = "release" + if (buildType == "Debug") { + releaseTarget += "_debug" + } + + def abiTaskNames = [] + // Creating gradle tasks to generate the native libraries for the supported abis. + supportedAbis.each { abi -> + def abiTaskName = taskName + abi.capitalize() + abiTaskNames += abiTaskName + tasks.create(name: abiTaskName, type: Exec) { + executable "scons" + args "--directory=${pathToRootDir}", "platform=android", "target=${releaseTarget}", "android_arch=${abi}" + } + } + + // Creating gradle task to run all of the previously generated tasks. + tasks.create(name: taskName, type: GradleBuild) { + tasks = abiTaskNames + } + + // Schedule the tasks so the generated libs are present before the aar file is packaged. + tasks["merge${buildType}JniLibFolders"].dependsOn taskName + } + + externalNativeBuild { + cmake { + path "CMakeLists.txt" + } + } +} diff --git a/platform/android/java/patches/com.google.android.vending.expansion.downloader.patch b/platform/android/java/lib/patches/com.google.android.vending.expansion.downloader.patch similarity index 99% rename from platform/android/java/patches/com.google.android.vending.expansion.downloader.patch rename to platform/android/java/lib/patches/com.google.android.vending.expansion.downloader.patch index 1189cfbfbb..49cc41e817 100644 --- a/platform/android/java/patches/com.google.android.vending.expansion.downloader.patch +++ b/platform/android/java/lib/patches/com.google.android.vending.expansion.downloader.patch @@ -175,7 +175,7 @@ index e4b1b0f1c..36cd6aacf 100644 -import com.android.vending.expansion.downloader.R; +// -- GODOT start -- +//import com.android.vending.expansion.downloader.R; -+import com.godot.game.R; ++import org.godotengine.godot.R; +// -- GODOT end -- import java.io.File; @@ -250,7 +250,7 @@ index f1536e80e..4b214b22d 100644 -import com.android.vending.expansion.downloader.R; +// -- GODOT start -- +//import com.android.vending.expansion.downloader.R; -+import com.godot.game.R; ++import org.godotengine.godot.R; +// -- GODOT end -- + import com.google.android.vending.expansion.downloader.DownloadProgressInfo; diff --git a/platform/android/java/patches/com.google.android.vending.licensing.patch b/platform/android/java/lib/patches/com.google.android.vending.licensing.patch similarity index 97% rename from platform/android/java/patches/com.google.android.vending.licensing.patch rename to platform/android/java/lib/patches/com.google.android.vending.licensing.patch index 9f8e5b8eab..4adb81d951 100644 --- a/platform/android/java/patches/com.google.android.vending.licensing.patch +++ b/platform/android/java/lib/patches/com.google.android.vending.licensing.patch @@ -21,7 +21,7 @@ index a0d2779af..a8bf65f9c 100644 */ +// -- GODOT start -- -+import com.godot.game.BuildConfig; +import org.godotengine.godot.BuildConfig; +// -- GODOT end -- + /** diff --git a/platform/android/java/res/drawable-hdpi/notify_panel_notification_icon_bg.png b/platform/android/java/lib/res/drawable-hdpi/notify_panel_notification_icon_bg.png similarity index 100% rename from platform/android/java/res/drawable-hdpi/notify_panel_notification_icon_bg.png rename to platform/android/java/lib/res/drawable-hdpi/notify_panel_notification_icon_bg.png diff --git a/platform/android/java/res/drawable-mdpi/notify_panel_notification_icon_bg.png b/platform/android/java/lib/res/drawable-mdpi/notify_panel_notification_icon_bg.png similarity index 100% rename from platform/android/java/res/drawable-mdpi/notify_panel_notification_icon_bg.png rename to platform/android/java/lib/res/drawable-mdpi/notify_panel_notification_icon_bg.png diff --git a/platform/android/java/res/drawable-nodpi/icon.png b/platform/android/java/lib/res/drawable-nodpi/icon.png similarity index 100% rename from platform/android/java/res/drawable-nodpi/icon.png rename to platform/android/java/lib/res/drawable-nodpi/icon.png diff --git a/platform/android/java/res/drawable-xhdpi/notify_panel_notification_icon_bg.png b/platform/android/java/lib/res/drawable-xhdpi/notify_panel_notification_icon_bg.png similarity index 100% rename from platform/android/java/res/drawable-xhdpi/notify_panel_notification_icon_bg.png rename to platform/android/java/lib/res/drawable-xhdpi/notify_panel_notification_icon_bg.png diff --git a/platform/android/java/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png b/platform/android/java/lib/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png similarity index 100% rename from platform/android/java/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png rename to platform/android/java/lib/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png diff --git a/platform/android/java/res/layout/downloading_expansion.xml b/platform/android/java/lib/res/layout/downloading_expansion.xml similarity index 100% rename from platform/android/java/res/layout/downloading_expansion.xml rename to platform/android/java/lib/res/layout/downloading_expansion.xml diff --git a/platform/android/java/res/layout/status_bar_ongoing_event_progress_bar.xml b/platform/android/java/lib/res/layout/status_bar_ongoing_event_progress_bar.xml similarity index 100% rename from platform/android/java/res/layout/status_bar_ongoing_event_progress_bar.xml rename to platform/android/java/lib/res/layout/status_bar_ongoing_event_progress_bar.xml diff --git a/platform/android/java/res/values-ar/strings.xml b/platform/android/java/lib/res/values-ar/strings.xml similarity index 100% rename from platform/android/java/res/values-ar/strings.xml rename to platform/android/java/lib/res/values-ar/strings.xml diff --git a/platform/android/java/res/values-bg/strings.xml b/platform/android/java/lib/res/values-bg/strings.xml similarity index 100% rename from platform/android/java/res/values-bg/strings.xml rename to platform/android/java/lib/res/values-bg/strings.xml diff --git a/platform/android/java/res/values-ca/strings.xml b/platform/android/java/lib/res/values-ca/strings.xml similarity index 100% rename from platform/android/java/res/values-ca/strings.xml rename to platform/android/java/lib/res/values-ca/strings.xml diff --git a/platform/android/java/res/values-cs/strings.xml b/platform/android/java/lib/res/values-cs/strings.xml similarity index 100% rename from platform/android/java/res/values-cs/strings.xml rename to platform/android/java/lib/res/values-cs/strings.xml diff --git a/platform/android/java/res/values-da/strings.xml b/platform/android/java/lib/res/values-da/strings.xml similarity index 100% rename from platform/android/java/res/values-da/strings.xml rename to platform/android/java/lib/res/values-da/strings.xml diff --git a/platform/android/java/res/values-de/strings.xml b/platform/android/java/lib/res/values-de/strings.xml similarity index 100% rename from platform/android/java/res/values-de/strings.xml rename to platform/android/java/lib/res/values-de/strings.xml diff --git a/platform/android/java/res/values-el/strings.xml b/platform/android/java/lib/res/values-el/strings.xml similarity index 100% rename from platform/android/java/res/values-el/strings.xml rename to platform/android/java/lib/res/values-el/strings.xml diff --git a/platform/android/java/res/values-en/strings.xml b/platform/android/java/lib/res/values-en/strings.xml similarity index 100% rename from platform/android/java/res/values-en/strings.xml rename to platform/android/java/lib/res/values-en/strings.xml diff --git a/platform/android/java/res/values-es-rES/strings.xml b/platform/android/java/lib/res/values-es-rES/strings.xml similarity index 100% rename from platform/android/java/res/values-es-rES/strings.xml rename to platform/android/java/lib/res/values-es-rES/strings.xml diff --git a/platform/android/java/res/values-es/strings.xml b/platform/android/java/lib/res/values-es/strings.xml similarity index 100% rename from platform/android/java/res/values-es/strings.xml rename to platform/android/java/lib/res/values-es/strings.xml diff --git a/platform/android/java/res/values-fa/strings.xml b/platform/android/java/lib/res/values-fa/strings.xml similarity index 100% rename from platform/android/java/res/values-fa/strings.xml rename to platform/android/java/lib/res/values-fa/strings.xml diff --git a/platform/android/java/res/values-fi/strings.xml b/platform/android/java/lib/res/values-fi/strings.xml similarity index 100% rename from platform/android/java/res/values-fi/strings.xml rename to platform/android/java/lib/res/values-fi/strings.xml diff --git a/platform/android/java/res/values-fr/strings.xml b/platform/android/java/lib/res/values-fr/strings.xml similarity index 100% rename from platform/android/java/res/values-fr/strings.xml rename to platform/android/java/lib/res/values-fr/strings.xml diff --git a/platform/android/java/res/values-hi/strings.xml b/platform/android/java/lib/res/values-hi/strings.xml similarity index 100% rename from platform/android/java/res/values-hi/strings.xml rename to platform/android/java/lib/res/values-hi/strings.xml diff --git a/platform/android/java/res/values-hr/strings.xml b/platform/android/java/lib/res/values-hr/strings.xml similarity index 100% rename from platform/android/java/res/values-hr/strings.xml rename to platform/android/java/lib/res/values-hr/strings.xml diff --git a/platform/android/java/res/values-hu/strings.xml b/platform/android/java/lib/res/values-hu/strings.xml similarity index 100% rename from platform/android/java/res/values-hu/strings.xml rename to platform/android/java/lib/res/values-hu/strings.xml diff --git a/platform/android/java/res/values-in/strings.xml b/platform/android/java/lib/res/values-in/strings.xml similarity index 100% rename from platform/android/java/res/values-in/strings.xml rename to platform/android/java/lib/res/values-in/strings.xml diff --git a/platform/android/java/res/values-it/strings.xml b/platform/android/java/lib/res/values-it/strings.xml similarity index 100% rename from platform/android/java/res/values-it/strings.xml rename to platform/android/java/lib/res/values-it/strings.xml diff --git a/platform/android/java/res/values-iw/strings.xml b/platform/android/java/lib/res/values-iw/strings.xml similarity index 100% rename from platform/android/java/res/values-iw/strings.xml rename to platform/android/java/lib/res/values-iw/strings.xml diff --git a/platform/android/java/res/values-ja/strings.xml b/platform/android/java/lib/res/values-ja/strings.xml similarity index 100% rename from platform/android/java/res/values-ja/strings.xml rename to platform/android/java/lib/res/values-ja/strings.xml diff --git a/platform/android/java/res/values-ko/strings.xml b/platform/android/java/lib/res/values-ko/strings.xml similarity index 100% rename from platform/android/java/res/values-ko/strings.xml rename to platform/android/java/lib/res/values-ko/strings.xml diff --git a/platform/android/java/res/values-lt/strings.xml b/platform/android/java/lib/res/values-lt/strings.xml similarity index 100% rename from platform/android/java/res/values-lt/strings.xml rename to platform/android/java/lib/res/values-lt/strings.xml diff --git a/platform/android/java/res/values-lv/strings.xml b/platform/android/java/lib/res/values-lv/strings.xml similarity index 100% rename from platform/android/java/res/values-lv/strings.xml rename to platform/android/java/lib/res/values-lv/strings.xml diff --git a/platform/android/java/res/values-nb/strings.xml b/platform/android/java/lib/res/values-nb/strings.xml similarity index 100% rename from platform/android/java/res/values-nb/strings.xml rename to platform/android/java/lib/res/values-nb/strings.xml diff --git a/platform/android/java/res/values-nl/strings.xml b/platform/android/java/lib/res/values-nl/strings.xml similarity index 100% rename from platform/android/java/res/values-nl/strings.xml rename to platform/android/java/lib/res/values-nl/strings.xml diff --git a/platform/android/java/res/values-pl/strings.xml b/platform/android/java/lib/res/values-pl/strings.xml similarity index 100% rename from platform/android/java/res/values-pl/strings.xml rename to platform/android/java/lib/res/values-pl/strings.xml diff --git a/platform/android/java/res/values-pt/strings.xml b/platform/android/java/lib/res/values-pt/strings.xml similarity index 100% rename from platform/android/java/res/values-pt/strings.xml rename to platform/android/java/lib/res/values-pt/strings.xml diff --git a/platform/android/java/res/values-ro/strings.xml b/platform/android/java/lib/res/values-ro/strings.xml similarity index 100% rename from platform/android/java/res/values-ro/strings.xml rename to platform/android/java/lib/res/values-ro/strings.xml diff --git a/platform/android/java/res/values-ru/strings.xml b/platform/android/java/lib/res/values-ru/strings.xml similarity index 100% rename from platform/android/java/res/values-ru/strings.xml rename to platform/android/java/lib/res/values-ru/strings.xml diff --git a/platform/android/java/res/values-sk/strings.xml b/platform/android/java/lib/res/values-sk/strings.xml similarity index 100% rename from platform/android/java/res/values-sk/strings.xml rename to platform/android/java/lib/res/values-sk/strings.xml diff --git a/platform/android/java/res/values-sl/strings.xml b/platform/android/java/lib/res/values-sl/strings.xml similarity index 100% rename from platform/android/java/res/values-sl/strings.xml rename to platform/android/java/lib/res/values-sl/strings.xml diff --git a/platform/android/java/res/values-sr/strings.xml b/platform/android/java/lib/res/values-sr/strings.xml similarity index 100% rename from platform/android/java/res/values-sr/strings.xml rename to platform/android/java/lib/res/values-sr/strings.xml diff --git a/platform/android/java/res/values-sv/strings.xml b/platform/android/java/lib/res/values-sv/strings.xml similarity index 100% rename from platform/android/java/res/values-sv/strings.xml rename to platform/android/java/lib/res/values-sv/strings.xml diff --git a/platform/android/java/res/values-th/strings.xml b/platform/android/java/lib/res/values-th/strings.xml similarity index 100% rename from platform/android/java/res/values-th/strings.xml rename to platform/android/java/lib/res/values-th/strings.xml diff --git a/platform/android/java/res/values-tl/strings.xml b/platform/android/java/lib/res/values-tl/strings.xml similarity index 100% rename from platform/android/java/res/values-tl/strings.xml rename to platform/android/java/lib/res/values-tl/strings.xml diff --git a/platform/android/java/res/values-tr/strings.xml b/platform/android/java/lib/res/values-tr/strings.xml similarity index 100% rename from platform/android/java/res/values-tr/strings.xml rename to platform/android/java/lib/res/values-tr/strings.xml diff --git a/platform/android/java/res/values-uk/strings.xml b/platform/android/java/lib/res/values-uk/strings.xml similarity index 100% rename from platform/android/java/res/values-uk/strings.xml rename to platform/android/java/lib/res/values-uk/strings.xml diff --git a/platform/android/java/res/values-vi/strings.xml b/platform/android/java/lib/res/values-vi/strings.xml similarity index 100% rename from platform/android/java/res/values-vi/strings.xml rename to platform/android/java/lib/res/values-vi/strings.xml diff --git a/platform/android/java/res/values-zh-rCN/strings.xml b/platform/android/java/lib/res/values-zh-rCN/strings.xml similarity index 100% rename from platform/android/java/res/values-zh-rCN/strings.xml rename to platform/android/java/lib/res/values-zh-rCN/strings.xml diff --git a/platform/android/java/res/values-zh-rHK/strings.xml b/platform/android/java/lib/res/values-zh-rHK/strings.xml similarity index 100% rename from platform/android/java/res/values-zh-rHK/strings.xml rename to platform/android/java/lib/res/values-zh-rHK/strings.xml diff --git a/platform/android/java/res/values-zh-rTW/strings.xml b/platform/android/java/lib/res/values-zh-rTW/strings.xml similarity index 100% rename from platform/android/java/res/values-zh-rTW/strings.xml rename to platform/android/java/lib/res/values-zh-rTW/strings.xml diff --git a/platform/android/java/res/values/strings.xml b/platform/android/java/lib/res/values/strings.xml similarity index 100% rename from platform/android/java/res/values/strings.xml rename to platform/android/java/lib/res/values/strings.xml diff --git a/platform/android/java/res/values/styles.xml b/platform/android/java/lib/res/values/styles.xml similarity index 100% rename from platform/android/java/res/values/styles.xml rename to platform/android/java/lib/res/values/styles.xml diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/Constants.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/Constants.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/Constants.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/Constants.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/Helpers.java similarity index 99% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/Helpers.java index 36cd6aacfe..2a72c9818d 100644 --- a/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java +++ b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/Helpers.java @@ -26,7 +26,7 @@ import android.util.Log; // -- GODOT start -- //import com.android.vending.expansion.downloader.R; -import com.godot.game.R; +import org.godotengine.godot.R; // -- GODOT end -- import java.io.File; diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderService.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/IDownloaderService.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderService.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/IDownloaderService.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/IStub.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/IStub.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/IStub.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/IStub.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/SystemFacade.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/SystemFacade.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java similarity index 99% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java index 4b214b22d7..0abaf2e052 100644 --- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java +++ b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java @@ -18,7 +18,7 @@ package com.google.android.vending.expansion.downloader.impl; // -- GODOT start -- //import com.android.vending.expansion.downloader.R; -import com.godot.game.R; +import org.godotengine.godot.R; // -- GODOT end -- import com.google.android.vending.expansion.downloader.DownloadProgressInfo; diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java b/platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java rename to platform/android/java/lib/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/AESObfuscator.java b/platform/android/java/lib/src/com/google/android/vending/licensing/AESObfuscator.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/AESObfuscator.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/AESObfuscator.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/APKExpansionPolicy.java b/platform/android/java/lib/src/com/google/android/vending/licensing/APKExpansionPolicy.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/APKExpansionPolicy.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/APKExpansionPolicy.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/DeviceLimiter.java b/platform/android/java/lib/src/com/google/android/vending/licensing/DeviceLimiter.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/DeviceLimiter.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/DeviceLimiter.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/LicenseChecker.java b/platform/android/java/lib/src/com/google/android/vending/licensing/LicenseChecker.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/LicenseChecker.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/LicenseChecker.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/LicenseCheckerCallback.java b/platform/android/java/lib/src/com/google/android/vending/licensing/LicenseCheckerCallback.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/LicenseCheckerCallback.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/LicenseCheckerCallback.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/LicenseValidator.java b/platform/android/java/lib/src/com/google/android/vending/licensing/LicenseValidator.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/LicenseValidator.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/LicenseValidator.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/NullDeviceLimiter.java b/platform/android/java/lib/src/com/google/android/vending/licensing/NullDeviceLimiter.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/NullDeviceLimiter.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/NullDeviceLimiter.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/Obfuscator.java b/platform/android/java/lib/src/com/google/android/vending/licensing/Obfuscator.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/Obfuscator.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/Obfuscator.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/Policy.java b/platform/android/java/lib/src/com/google/android/vending/licensing/Policy.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/Policy.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/Policy.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java b/platform/android/java/lib/src/com/google/android/vending/licensing/PreferenceObfuscator.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/PreferenceObfuscator.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/ResponseData.java b/platform/android/java/lib/src/com/google/android/vending/licensing/ResponseData.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/ResponseData.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/ResponseData.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/ServerManagedPolicy.java b/platform/android/java/lib/src/com/google/android/vending/licensing/ServerManagedPolicy.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/ServerManagedPolicy.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/ServerManagedPolicy.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/StrictPolicy.java b/platform/android/java/lib/src/com/google/android/vending/licensing/StrictPolicy.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/StrictPolicy.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/StrictPolicy.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/ValidationException.java b/platform/android/java/lib/src/com/google/android/vending/licensing/ValidationException.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/ValidationException.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/ValidationException.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java b/platform/android/java/lib/src/com/google/android/vending/licensing/util/Base64.java similarity index 99% rename from platform/android/java/src/com/google/android/vending/licensing/util/Base64.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/util/Base64.java index a8bf65f9ca..79efca9621 100644 --- a/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java +++ b/platform/android/java/lib/src/com/google/android/vending/licensing/util/Base64.java @@ -32,7 +32,7 @@ package com.google.android.vending.licensing.util; */ // -- GODOT start -- -import com.godot.game.BuildConfig; +import org.godotengine.godot.BuildConfig; // -- GODOT end -- /** diff --git a/platform/android/java/src/com/google/android/vending/licensing/util/Base64DecoderException.java b/platform/android/java/lib/src/com/google/android/vending/licensing/util/Base64DecoderException.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/util/Base64DecoderException.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/util/Base64DecoderException.java diff --git a/platform/android/java/src/com/google/android/vending/licensing/util/URIQueryDecoder.java b/platform/android/java/lib/src/com/google/android/vending/licensing/util/URIQueryDecoder.java similarity index 100% rename from platform/android/java/src/com/google/android/vending/licensing/util/URIQueryDecoder.java rename to platform/android/java/lib/src/com/google/android/vending/licensing/util/URIQueryDecoder.java diff --git a/platform/android/java/src/org/godotengine/godot/Dictionary.java b/platform/android/java/lib/src/org/godotengine/godot/Dictionary.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/Dictionary.java rename to platform/android/java/lib/src/org/godotengine/godot/Dictionary.java diff --git a/platform/android/java/src/org/godotengine/godot/Godot.java b/platform/android/java/lib/src/org/godotengine/godot/Godot.java similarity index 96% rename from platform/android/java/src/org/godotengine/godot/Godot.java rename to platform/android/java/lib/src/org/godotengine/godot/Godot.java index 1b3239777c..7e852b7e08 100644 --- a/platform/android/java/src/org/godotengine/godot/Godot.java +++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.java @@ -97,7 +97,7 @@ import org.godotengine.godot.input.GodotEditText; import org.godotengine.godot.payments.PaymentsManager; import org.godotengine.godot.xr.XRMode; -public class Godot extends Activity implements SensorEventListener, IDownloaderClient { +public abstract class Godot extends Activity implements SensorEventListener, IDownloaderClient { static final int MAX_SINGLETONS = 64; static final int REQUEST_RECORD_AUDIO_PERMISSION = 1; @@ -146,8 +146,8 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC private void setButtonPausedState(boolean paused) { mStatePaused = paused; - int stringResourceID = paused ? com.godot.game.R.string.text_button_resume : - com.godot.game.R.string.text_button_pause; + int stringResourceID = paused ? R.string.text_button_resume : + R.string.text_button_pause; mPauseButton.setText(stringResourceID); } @@ -357,7 +357,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC // Bundle args = new Bundle(); args.putParcelable("intent", mCurrentIntent); - startInstrumentation(new ComponentName(Godot.this, GodotInstrumentation.class), null, args); + startInstrumentation(new ComponentName(this, GodotInstrumentation.class), null, args); } public void alert(final String message, final String title) { @@ -614,17 +614,17 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC mDownloaderClientStub = DownloaderClientMarshaller.CreateStub(this, GodotDownloaderService.class); - setContentView(com.godot.game.R.layout.downloading_expansion); - mPB = (ProgressBar)findViewById(com.godot.game.R.id.progressBar); - mStatusText = (TextView)findViewById(com.godot.game.R.id.statusText); - mProgressFraction = (TextView)findViewById(com.godot.game.R.id.progressAsFraction); - mProgressPercent = (TextView)findViewById(com.godot.game.R.id.progressAsPercentage); - mAverageSpeed = (TextView)findViewById(com.godot.game.R.id.progressAverageSpeed); - mTimeRemaining = (TextView)findViewById(com.godot.game.R.id.progressTimeRemaining); - mDashboard = findViewById(com.godot.game.R.id.downloaderDashboard); - mCellMessage = findViewById(com.godot.game.R.id.approveCellular); - mPauseButton = (Button)findViewById(com.godot.game.R.id.pauseButton); - mWiFiSettingsButton = (Button)findViewById(com.godot.game.R.id.wifiSettingsButton); + setContentView(R.layout.downloading_expansion); + mPB = (ProgressBar)findViewById(R.id.progressBar); + mStatusText = (TextView)findViewById(R.id.statusText); + mProgressFraction = (TextView)findViewById(R.id.progressAsFraction); + mProgressPercent = (TextView)findViewById(R.id.progressAsPercentage); + mAverageSpeed = (TextView)findViewById(R.id.progressAverageSpeed); + mTimeRemaining = (TextView)findViewById(R.id.progressTimeRemaining); + mDashboard = findViewById(R.id.downloaderDashboard); + mCellMessage = findViewById(R.id.approveCellular); + mPauseButton = (Button)findViewById(R.id.pauseButton); + mWiFiSettingsButton = (Button)findViewById(R.id.wifiSettingsButton); return; } @@ -1094,9 +1094,9 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC @Override public void onDownloadProgress(DownloadProgressInfo progress) { - mAverageSpeed.setText(getString(com.godot.game.R.string.kilobytes_per_second, + mAverageSpeed.setText(getString(R.string.kilobytes_per_second, Helpers.getSpeedString(progress.mCurrentSpeed))); - mTimeRemaining.setText(getString(com.godot.game.R.string.time_remaining, + mTimeRemaining.setText(getString(R.string.time_remaining, Helpers.getTimeRemaining(progress.mTimeRemaining))); mPB.setMax((int)(progress.mOverallTotal >> 8)); diff --git a/platform/android/java/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java b/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java rename to platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java diff --git a/platform/android/java/src/org/godotengine/godot/GodotDownloaderService.java b/platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderService.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/GodotDownloaderService.java rename to platform/android/java/lib/src/org/godotengine/godot/GodotDownloaderService.java diff --git a/platform/android/java/src/org/godotengine/godot/GodotIO.java b/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java similarity index 98% rename from platform/android/java/src/org/godotengine/godot/GodotIO.java rename to platform/android/java/lib/src/org/godotengine/godot/GodotIO.java index 98174157ec..04566cf62c 100644 --- a/platform/android/java/src/org/godotengine/godot/GodotIO.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java @@ -29,26 +29,18 @@ /*************************************************************************/ package org.godotengine.godot; -import android.app.*; import android.content.*; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.AssetManager; -import android.graphics.*; -import android.hardware.*; import android.media.*; import android.net.Uri; import android.os.*; -import android.text.*; -import android.text.method.*; import android.util.DisplayMetrics; import android.util.Log; import android.util.SparseArray; -import android.view.*; -import android.view.inputmethod.InputMethodManager; import java.io.IOException; import java.io.InputStream; -import java.util.HashMap; import java.util.Locale; import org.godotengine.godot.input.*; //android.os.Build diff --git a/platform/android/java/src/org/godotengine/godot/GodotInstrumentation.java b/platform/android/java/lib/src/org/godotengine/godot/GodotInstrumentation.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/GodotInstrumentation.java rename to platform/android/java/lib/src/org/godotengine/godot/GodotInstrumentation.java diff --git a/platform/android/java/src/org/godotengine/godot/GodotLib.java b/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/GodotLib.java rename to platform/android/java/lib/src/org/godotengine/godot/GodotLib.java diff --git a/platform/android/java/src/org/godotengine/godot/GodotPaymentV3.java b/platform/android/java/lib/src/org/godotengine/godot/GodotPaymentV3.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/GodotPaymentV3.java rename to platform/android/java/lib/src/org/godotengine/godot/GodotPaymentV3.java diff --git a/platform/android/java/src/org/godotengine/godot/GodotRenderer.java b/platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/GodotRenderer.java rename to platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java diff --git a/platform/android/java/src/org/godotengine/godot/GodotView.java b/platform/android/java/lib/src/org/godotengine/godot/GodotView.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/GodotView.java rename to platform/android/java/lib/src/org/godotengine/godot/GodotView.java diff --git a/platform/android/java/src/org/godotengine/godot/input/GodotEditText.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/input/GodotEditText.java rename to platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java diff --git a/platform/android/java/src/org/godotengine/godot/input/GodotInputHandler.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/input/GodotInputHandler.java rename to platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java diff --git a/platform/android/java/src/org/godotengine/godot/input/GodotTextInputWrapper.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java similarity index 99% rename from platform/android/java/src/org/godotengine/godot/input/GodotTextInputWrapper.java rename to platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java index d6e7ad5b18..9b372c75e3 100644 --- a/platform/android/java/src/org/godotengine/godot/input/GodotTextInputWrapper.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java @@ -32,7 +32,6 @@ package org.godotengine.godot.input; import android.content.Context; import android.text.Editable; import android.text.TextWatcher; -import android.util.Log; import android.view.KeyEvent; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; diff --git a/platform/android/java/src/org/godotengine/godot/input/InputManagerCompat.java b/platform/android/java/lib/src/org/godotengine/godot/input/InputManagerCompat.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/input/InputManagerCompat.java rename to platform/android/java/lib/src/org/godotengine/godot/input/InputManagerCompat.java diff --git a/platform/android/java/src/org/godotengine/godot/input/InputManagerV16.java b/platform/android/java/lib/src/org/godotengine/godot/input/InputManagerV16.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/input/InputManagerV16.java rename to platform/android/java/lib/src/org/godotengine/godot/input/InputManagerV16.java diff --git a/platform/android/java/src/org/godotengine/godot/input/Joystick.java b/platform/android/java/lib/src/org/godotengine/godot/input/Joystick.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/input/Joystick.java rename to platform/android/java/lib/src/org/godotengine/godot/input/Joystick.java diff --git a/platform/android/java/src/org/godotengine/godot/payments/ConsumeTask.java b/platform/android/java/lib/src/org/godotengine/godot/payments/ConsumeTask.java similarity index 99% rename from platform/android/java/src/org/godotengine/godot/payments/ConsumeTask.java rename to platform/android/java/lib/src/org/godotengine/godot/payments/ConsumeTask.java index f872e7af56..4c1050c948 100644 --- a/platform/android/java/src/org/godotengine/godot/payments/ConsumeTask.java +++ b/platform/android/java/lib/src/org/godotengine/godot/payments/ConsumeTask.java @@ -33,7 +33,6 @@ package org.godotengine.godot.payments; import android.content.Context; import android.os.AsyncTask; import android.os.RemoteException; -import android.util.Log; import com.android.vending.billing.IInAppBillingService; import java.lang.ref.WeakReference; diff --git a/platform/android/java/src/org/godotengine/godot/payments/HandlePurchaseTask.java b/platform/android/java/lib/src/org/godotengine/godot/payments/HandlePurchaseTask.java similarity index 91% rename from platform/android/java/src/org/godotengine/godot/payments/HandlePurchaseTask.java rename to platform/android/java/lib/src/org/godotengine/godot/payments/HandlePurchaseTask.java index 5424ebb49d..1a914967a2 100644 --- a/platform/android/java/src/org/godotengine/godot/payments/HandlePurchaseTask.java +++ b/platform/android/java/lib/src/org/godotengine/godot/payments/HandlePurchaseTask.java @@ -31,18 +31,7 @@ package org.godotengine.godot.payments; import android.app.Activity; -import android.app.PendingIntent; -import android.app.ProgressDialog; -import android.content.Context; import android.content.Intent; -import android.content.IntentSender.SendIntentException; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.RemoteException; -import android.util.Log; -import com.android.vending.billing.IInAppBillingService; -import org.godotengine.godot.GodotLib; -import org.godotengine.godot.utils.Crypt; import org.json.JSONException; import org.json.JSONObject; diff --git a/platform/android/java/src/org/godotengine/godot/payments/PaymentsCache.java b/platform/android/java/lib/src/org/godotengine/godot/payments/PaymentsCache.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/payments/PaymentsCache.java rename to platform/android/java/lib/src/org/godotengine/godot/payments/PaymentsCache.java diff --git a/platform/android/java/src/org/godotengine/godot/payments/PaymentsManager.java b/platform/android/java/lib/src/org/godotengine/godot/payments/PaymentsManager.java similarity index 99% rename from platform/android/java/src/org/godotengine/godot/payments/PaymentsManager.java rename to platform/android/java/lib/src/org/godotengine/godot/payments/PaymentsManager.java index a0dbc432c1..c079c55854 100644 --- a/platform/android/java/src/org/godotengine/godot/payments/PaymentsManager.java +++ b/platform/android/java/lib/src/org/godotengine/godot/payments/PaymentsManager.java @@ -43,7 +43,6 @@ import android.util.Log; import com.android.vending.billing.IInAppBillingService; import java.util.ArrayList; import java.util.Arrays; -import org.godotengine.godot.Godot; import org.godotengine.godot.GodotPaymentV3; import org.json.JSONException; import org.json.JSONObject; diff --git a/platform/android/java/src/org/godotengine/godot/payments/PurchaseTask.java b/platform/android/java/lib/src/org/godotengine/godot/payments/PurchaseTask.java similarity index 95% rename from platform/android/java/src/org/godotengine/godot/payments/PurchaseTask.java rename to platform/android/java/lib/src/org/godotengine/godot/payments/PurchaseTask.java index 650c5178f0..9adc85e521 100644 --- a/platform/android/java/src/org/godotengine/godot/payments/PurchaseTask.java +++ b/platform/android/java/lib/src/org/godotengine/godot/payments/PurchaseTask.java @@ -32,19 +32,12 @@ package org.godotengine.godot.payments; import android.app.Activity; import android.app.PendingIntent; -import android.app.ProgressDialog; -import android.content.Context; import android.content.Intent; import android.content.IntentSender.SendIntentException; -import android.os.AsyncTask; import android.os.Bundle; import android.os.RemoteException; import android.util.Log; import com.android.vending.billing.IInAppBillingService; -import org.godotengine.godot.GodotLib; -import org.godotengine.godot.utils.Crypt; -import org.json.JSONException; -import org.json.JSONObject; abstract public class PurchaseTask { diff --git a/platform/android/java/src/org/godotengine/godot/payments/ReleaseAllConsumablesTask.java b/platform/android/java/lib/src/org/godotengine/godot/payments/ReleaseAllConsumablesTask.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/payments/ReleaseAllConsumablesTask.java rename to platform/android/java/lib/src/org/godotengine/godot/payments/ReleaseAllConsumablesTask.java diff --git a/platform/android/java/src/org/godotengine/godot/payments/ValidateTask.java b/platform/android/java/lib/src/org/godotengine/godot/payments/ValidateTask.java similarity index 92% rename from platform/android/java/src/org/godotengine/godot/payments/ValidateTask.java rename to platform/android/java/lib/src/org/godotengine/godot/payments/ValidateTask.java index d32c80e8e0..17a2a197ad 100644 --- a/platform/android/java/src/org/godotengine/godot/payments/ValidateTask.java +++ b/platform/android/java/lib/src/org/godotengine/godot/payments/ValidateTask.java @@ -31,21 +31,10 @@ package org.godotengine.godot.payments; import android.app.Activity; -import android.app.PendingIntent; import android.app.ProgressDialog; -import android.content.Context; -import android.content.Intent; -import android.content.IntentSender.SendIntentException; import android.os.AsyncTask; -import android.os.Bundle; -import android.os.RemoteException; -import android.util.Log; -import com.android.vending.billing.IInAppBillingService; import java.lang.ref.WeakReference; -import org.godotengine.godot.Godot; -import org.godotengine.godot.GodotLib; import org.godotengine.godot.GodotPaymentV3; -import org.godotengine.godot.utils.Crypt; import org.godotengine.godot.utils.HttpRequester; import org.godotengine.godot.utils.RequestParams; import org.json.JSONException; diff --git a/platform/android/java/src/org/godotengine/godot/utils/Crypt.java b/platform/android/java/lib/src/org/godotengine/godot/utils/Crypt.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/utils/Crypt.java rename to platform/android/java/lib/src/org/godotengine/godot/utils/Crypt.java diff --git a/platform/android/java/src/org/godotengine/godot/utils/CustomSSLSocketFactory.java b/platform/android/java/lib/src/org/godotengine/godot/utils/CustomSSLSocketFactory.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/utils/CustomSSLSocketFactory.java rename to platform/android/java/lib/src/org/godotengine/godot/utils/CustomSSLSocketFactory.java diff --git a/platform/android/java/src/org/godotengine/godot/utils/GLUtils.java b/platform/android/java/lib/src/org/godotengine/godot/utils/GLUtils.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/utils/GLUtils.java rename to platform/android/java/lib/src/org/godotengine/godot/utils/GLUtils.java diff --git a/platform/android/java/src/org/godotengine/godot/utils/HttpRequester.java b/platform/android/java/lib/src/org/godotengine/godot/utils/HttpRequester.java similarity index 98% rename from platform/android/java/src/org/godotengine/godot/utils/HttpRequester.java rename to platform/android/java/lib/src/org/godotengine/godot/utils/HttpRequester.java index e98f533c23..02ae753b3e 100644 --- a/platform/android/java/src/org/godotengine/godot/utils/HttpRequester.java +++ b/platform/android/java/lib/src/org/godotengine/godot/utils/HttpRequester.java @@ -39,12 +39,9 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.security.KeyStore; -import java.util.ArrayList; import java.util.Date; -import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; -import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; @@ -58,7 +55,6 @@ import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; -import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; diff --git a/platform/android/java/src/org/godotengine/godot/utils/RequestParams.java b/platform/android/java/lib/src/org/godotengine/godot/utils/RequestParams.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/utils/RequestParams.java rename to platform/android/java/lib/src/org/godotengine/godot/utils/RequestParams.java diff --git a/platform/android/java/src/org/godotengine/godot/xr/XRMode.java b/platform/android/java/lib/src/org/godotengine/godot/xr/XRMode.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/xr/XRMode.java rename to platform/android/java/lib/src/org/godotengine/godot/xr/XRMode.java diff --git a/platform/android/java/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java rename to platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrConfigChooser.java diff --git a/platform/android/java/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java rename to platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrContextFactory.java diff --git a/platform/android/java/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java b/platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java rename to platform/android/java/lib/src/org/godotengine/godot/xr/ovr/OvrWindowSurfaceFactory.java diff --git a/platform/android/java/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java rename to platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularConfigChooser.java diff --git a/platform/android/java/src/org/godotengine/godot/xr/regular/RegularContextFactory.java b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularContextFactory.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/xr/regular/RegularContextFactory.java rename to platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularContextFactory.java diff --git a/platform/android/java/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java b/platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java similarity index 100% rename from platform/android/java/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java rename to platform/android/java/lib/src/org/godotengine/godot/xr/regular/RegularFallbackConfigChooser.java diff --git a/platform/android/java/settings.gradle b/platform/android/java/settings.gradle new file mode 100644 index 0000000000..f6921c70aa --- /dev/null +++ b/platform/android/java/settings.gradle @@ -0,0 +1,5 @@ +// Configure the root project. +rootProject.name = "Godot" + +include ':app' +include ':lib' From f2d203a8a413c3a58ac2761b76323f39bd88b356 Mon Sep 17 00:00:00 2001 From: fhuya Date: Mon, 2 Sep 2019 17:41:14 -0700 Subject: [PATCH 2/2] Remove the jetbrains setup directory as it's now obsolete. --- misc/ide/jetbrains/AndroidManifest.xml | 44 ----- misc/ide/jetbrains/CMakeLists.txt | 18 -- misc/ide/jetbrains/build.gradle | 108 ----------- .../gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - misc/ide/jetbrains/gradlew | 172 ------------------ misc/ide/jetbrains/gradlew.bat | 84 --------- misc/ide/jetbrains/settings.gradle | 2 - 8 files changed, 434 deletions(-) delete mode 100644 misc/ide/jetbrains/AndroidManifest.xml delete mode 100644 misc/ide/jetbrains/CMakeLists.txt delete mode 100644 misc/ide/jetbrains/build.gradle delete mode 100644 misc/ide/jetbrains/gradle/wrapper/gradle-wrapper.jar delete mode 100644 misc/ide/jetbrains/gradle/wrapper/gradle-wrapper.properties delete mode 100755 misc/ide/jetbrains/gradlew delete mode 100644 misc/ide/jetbrains/gradlew.bat delete mode 100644 misc/ide/jetbrains/settings.gradle diff --git a/misc/ide/jetbrains/AndroidManifest.xml b/misc/ide/jetbrains/AndroidManifest.xml deleted file mode 100644 index 232a95e779..0000000000 --- a/misc/ide/jetbrains/AndroidManifest.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/misc/ide/jetbrains/CMakeLists.txt b/misc/ide/jetbrains/CMakeLists.txt deleted file mode 100644 index b6e56e0778..0000000000 --- a/misc/ide/jetbrains/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -cmake_minimum_required(VERSION 3.6) -project(godot) - -set(CMAKE_CXX_STANDARD 14) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) - -set(GODOT_ROOT_DIR ../../..) - -# Get sources -file(GLOB_RECURSE SOURCES ${GODOT_ROOT_DIR}/*.c**) -file(GLOB_RECURSE HEADERS ${GODOT_ROOT_DIR}/*.h**) - -add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) -target_include_directories(${PROJECT_NAME} - SYSTEM PUBLIC - ${GODOT_ROOT_DIR} - ${GODOT_ROOT_DIR}/modules/gdnative/include) diff --git a/misc/ide/jetbrains/build.gradle b/misc/ide/jetbrains/build.gradle deleted file mode 100644 index dea81b4ea3..0000000000 --- a/misc/ide/jetbrains/build.gradle +++ /dev/null @@ -1,108 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:3.4.2' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -dependencies { - implementation "com.android.support:support-core-utils:28.0.0" -} - -def pathToRootDir = "../../../" -// Note: Only keep the abis you support to speed up the gradle 'assemble' task. -def supportedAbis = ["armv7", "arm64v8", "x86", "x86_64"] - -android { - - lintOptions { - abortOnError false - disable "MissingTranslation", 'UnusedResources' - } - - compileSdkVersion 28 - buildToolsVersion "28.0.3" - useLibrary 'org.apache.http.legacy' - - packagingOptions { - exclude 'META-INF/LICENSE' - exclude 'META-INF/NOTICE' - } - defaultConfig { - minSdkVersion 18 - targetSdkVersion 28 - } - - sourceSets { - main { - manifest.srcFile "AndroidManifest.xml" - java.srcDirs = ["${pathToRootDir}platform/android/java/src"] - res.srcDirs = ["${pathToRootDir}platform/android/java/res"] - aidl.srcDirs = ["${pathToRootDir}platform/android/java/aidl"] - assets.srcDirs = ["${pathToRootDir}platform/android/java/assets"] - } - debug.jniLibs.srcDirs = ["${pathToRootDir}platform/android/java/libs/debug"] - release.jniLibs.srcDirs = ["${pathToRootDir}platform/android/java/libs/release"] - } - - libraryVariants.all { variant -> - variant.outputs.all { output -> - output.outputFileName = "godot-lib.${variant.name}.aar" - } - - def buildType = variant.buildType.name.capitalize() - - def taskPrefix = "" - if (project.path != ":") { - taskPrefix = project.path + ":" - } - - // Disable the externalNativeBuild* task as it would cause build failures since the cmake build - // files is only setup for editing support. - gradle.startParameter.excludedTaskNames += taskPrefix + "externalNativeBuild" + buildType - - // Create tasks to generate the Godot native libraries. - def taskName = "compileGodotNativeLibs" + buildType - def releaseTarget = "release" - if (buildType == "Debug") { - releaseTarget += "_debug" - } - - def abiTaskNames = [] - // Creating gradle tasks to generate the native libraries for the supported abis. - supportedAbis.each { abi -> - def abiTaskName = taskName + abi.capitalize() - abiTaskNames += abiTaskName - tasks.create(name: abiTaskName, type: Exec) { - executable "scons" - args "--directory=${pathToRootDir}", "platform=android", "target=${releaseTarget}", "android_arch=${abi}" - } - } - - // Creating gradle task to run all of the previously generated tasks. - tasks.create(name: taskName, type: GradleBuild) { - tasks = abiTaskNames - } - - // Schedule the tasks so the generated libs are present before the aar file is packaged. - tasks["merge${buildType}JniLibFolders"].dependsOn taskName - } - - externalNativeBuild { - cmake { - path "CMakeLists.txt" - } - } -} diff --git a/misc/ide/jetbrains/gradle/wrapper/gradle-wrapper.jar b/misc/ide/jetbrains/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index f6b961fd5a86aa5fbfe90f707c3138408be7c718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54329 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

Y{ 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Ď>lQ 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -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" -a "$nonstop" = "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"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # 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 - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/misc/ide/jetbrains/gradlew.bat b/misc/ide/jetbrains/gradlew.bat deleted file mode 100644 index f9553162f1..0000000000 --- a/misc/ide/jetbrains/gradlew.bat +++ /dev/null @@ -1,84 +0,0 @@ -@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 - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@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= - -@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 Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_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=%* - -: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/misc/ide/jetbrains/settings.gradle b/misc/ide/jetbrains/settings.gradle deleted file mode 100644 index 1904ab94e7..0000000000 --- a/misc/ide/jetbrains/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -// Configure the root project. -rootProject.name = "Godot"