From e7b1eec2cc1bdf4063e3e6cf0a4f16503c7ceeba Mon Sep 17 00:00:00 2001 From: Green Sky Date: Sun, 2 Jun 2024 18:09:20 +0200 Subject: [PATCH] make android ci apk build work, also launches and connects to tox --- .github/workflows/ci.yml | 13 +++ CMakeLists.txt | 101 ++++++++++++++++ android/app/AndroidManifest.xml | 110 ++++++++++++++++++ .../org/libsdl/app/tomato/TomatoActivity.java | 18 +++ android/app/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2683 bytes android/app/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1698 bytes android/app/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3872 bytes android/app/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6874 bytes .../app/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 14526 bytes android/app/res/values/colors.xml | 6 + android/app/res/values/strings.xml | 3 + android/app/res/values/styles.xml | 10 ++ external/sdl/CMakeLists.txt | 2 + src/main.cpp | 6 + src/start_screen.cpp | 2 + 15 files changed, 271 insertions(+) create mode 100644 android/app/AndroidManifest.xml create mode 100644 android/app/java/org/libsdl/app/tomato/TomatoActivity.java create mode 100644 android/app/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/res/values/colors.xml create mode 100644 android/app/res/values/strings.xml create mode 100644 android/app/res/values/styles.xml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cc1a2608..f927b7d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -73,6 +73,19 @@ jobs: - name: Build (tomato) run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t tomato + - name: Build (SDL3-jar) (workaround) + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t SDL3-jar + + - name: Build (apk) + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4 -t tomato-apk + + - uses: actions/upload-artifact@v4 + with: + name: ${{ github.event.repository.name }}-android-arm64 + # TODO: do propper packing + path: | + ${{github.workspace}}/build/tomato.apk + macos: timeout-minutes: 10 diff --git a/CMakeLists.txt b/CMakeLists.txt index 2436386c..e56307bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,3 +70,104 @@ endif() add_subdirectory(./src) +# TODO: move to src +if (ANDROID AND TARGET SDL3::Jar) + message("II building for ANDROID!!!") + + list(APPEND CMAKE_MODULE_PATH "${SDL3_SOURCE_DIR}/cmake/android") + + # here be dragons + + find_package(SdlAndroid MODULE) + find_package(Java) + find_package(SdlAndroidPlatform MODULE) + # the existence of SDL3::Jar usually implies platform + if(SdlAndroid_FOUND) + include(SdlAndroidFunctions) + sdl_create_android_debug_keystore(tomato-debug-keystore) + sdl_android_compile_resources(tomato-resources RESFOLDER android/app/res) + + + set(ANDROID_MANIFEST_PACKAGE "org.libsdl.app.tomato") + #set(generated_manifest_path "${CMAKE_CURRENT_BINARY_DIR}/android/${TEST}-src/AndroidManifest.xml") + string(REPLACE "." "/" JAVA_PACKAGE_DIR "${ANDROID_MANIFEST_PACKAGE}") + #set(GENERATED_SRC_FOLDER "${CMAKE_CURRENT_BINARY_DIR}/android/${TEST}-src") + #set(GENERATED_RES_FOLDER "${GENERATED_SRC_FOLDER}/res") + #set(JAVA_PACKAGE_DIR "${GENERATED_SRC_FOLDER}/${JAVA_PACKAGE_DIR}") + set(JAVA_PACKAGE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android/app/java/${JAVA_PACKAGE_DIR}") + + sdl_android_link_resources(tomato-apk-linked + MANIFEST "android/app/AndroidManifest.xml" + PACKAGE ${ANDROID_MANIFEST_PACKAGE} + RES_TARGETS tomato-resources + TARGET_SDK_VERSION 31 + ) + + set(CMAKE_JAVA_COMPILE_FLAGS "-encoding;utf-8") + set(classes_path "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/tomato-java.dir/classes") + # Some CMake versions have a slow `cmake -E make_directory` implementation + if(NOT IS_DIRECTORY "${classes_path}") + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${classes_path}") + endif() + set(OUT_JAR "${CMAKE_CURRENT_BINARY_DIR}/tomato.jar") + add_custom_command( + OUTPUT "${OUT_JAR}" + COMMAND ${CMAKE_COMMAND} -E rm -rf "${classes_path}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${classes_path}" + COMMAND ${Java_JAVAC_EXECUTABLE} + -source 1.8 -target 1.8 + -bootclasspath "$" + "${JAVA_PACKAGE_DIR}/TomatoActivity.java" + $ + -cp "$:${SDL_ANDROID_PLATFORM_ANDROID_JAR}" + -d "${classes_path}" + COMMAND ${Java_JAR_EXECUTABLE} cf "${OUT_JAR}" -C "${classes_path}" . + DEPENDS $ "$" + ) + add_custom_target(tomato-jar DEPENDS "${OUT_JAR}") + add_dependencies(tomato-jar SDL3::Jar) # HACK: somehow their jar is not registered as an output + set_property(TARGET tomato-jar PROPERTY OUTPUT "${OUT_JAR}") + + set(dexworkdir "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/tomato-dex.dir") + # Some CMake versions have a slow `cmake -E make_directory` implementation + if(NOT IS_DIRECTORY "${dexworkdir}") + execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${dexworkdir}") + endif() + set(classes_dex_base_name "classes.dex") + set(classes_dex "${dexworkdir}/${classes_dex_base_name}") + add_custom_command( + OUTPUT "${classes_dex}" + COMMAND SdlAndroid::d8 + $ + $ + --lib "${SDL_ANDROID_PLATFORM_ANDROID_JAR}" + --output "${dexworkdir}" + DEPENDS $ $ + ) + add_custom_target(tomato-dex DEPENDS "${classes_dex}") + set_property(TARGET tomato-dex PROPERTY OUTPUT "${classes_dex}") + set_property(TARGET tomato-dex PROPERTY OUTPUT_BASE_NAME "${classes_dex_base_name}") + + # file(GLOB RESOURCE_FILES *.bmp *.wav *.hex moose.dat utf8.txt) + + sdl_add_to_apk_unaligned(tomato-unaligned-apk + APK_IN tomato-apk-linked + OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/intermediates" + #ASSETS ${RESOURCE_FILES} + #NATIVE_LIBS SDL3::SDL3-shared tomato + NATIVE_LIBS tomato + DEX tomato-dex + ) + + sdl_apk_align(tomato-aligned-apk tomato-unaligned-apk + OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/intermediates" + ) + sdl_apk_sign(tomato-apk tomato-aligned-apk + KEYSTORE tomato-debug-keystore + ) + + else() + message("FF SdlAndroid module not found") + endif() +endif() + diff --git a/android/app/AndroidManifest.xml b/android/app/AndroidManifest.xml new file mode 100644 index 00000000..5360a3fe --- /dev/null +++ b/android/app/AndroidManifest.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/java/org/libsdl/app/tomato/TomatoActivity.java b/android/app/java/org/libsdl/app/tomato/TomatoActivity.java new file mode 100644 index 00000000..0f983039 --- /dev/null +++ b/android/app/java/org/libsdl/app/tomato/TomatoActivity.java @@ -0,0 +1,18 @@ +package org.libsdl.app.tomato; + +import org.libsdl.app.SDLActivity; + +public class TomatoActivity extends SDLActivity { + protected String[] getLibraries() { + return new String[] { + // "SDL3", // we link statically + // "SDL3_image", + // "SDL3_mixer", + // "SDL3_net", + // "SDL3_ttf", + // "main" + "tomato" + }; + } +} + diff --git a/android/app/res/mipmap-hdpi/ic_launcher.png b/android/app/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d50bdaae06ee5a8d3f39911f81715abd3bf7b24d GIT binary patch literal 2683 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 literal 0 HcmV?d00001 diff --git a/android/app/res/mipmap-mdpi/ic_launcher.png b/android/app/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0a299eb3cc0273ad1fc260cf0b4a2c35f5d373f5 GIT binary patch literal 1698 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 literal 0 HcmV?d00001 diff --git a/android/app/res/mipmap-xxhdpi/ic_launcher.png b/android/app/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d423dac2624cf0b5dc90821a15362bc29e5a1e6b GIT binary patch literal 6874 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 literal 0 HcmV?d00001 diff --git a/android/app/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..959c384b08eb45ef38765fecbfba3891c15132b8 GIT binary patch literal 14526 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 RfKEdMB{? + + #3F51B5 + #303F9F + #FF4081 + diff --git a/android/app/res/values/strings.xml b/android/app/res/values/strings.xml new file mode 100644 index 00000000..fb573710 --- /dev/null +++ b/android/app/res/values/strings.xml @@ -0,0 +1,3 @@ + + Tomato + diff --git a/android/app/res/values/styles.xml b/android/app/res/values/styles.xml new file mode 100644 index 00000000..22248d50 --- /dev/null +++ b/android/app/res/values/styles.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/external/sdl/CMakeLists.txt b/external/sdl/CMakeLists.txt index f461a7fa..5f7937ec 100644 --- a/external/sdl/CMakeLists.txt +++ b/external/sdl/CMakeLists.txt @@ -6,6 +6,7 @@ if (NOT TARGET SDL3::SDL3) set(SDL_SHARED OFF CACHE INTERNAL "") set(SDL_STATIC ON CACHE INTERNAL "") #TODO: pic ? + set(SDL_DISABLE_ANDROID_JAR OFF CACHE INTERNAL "") FetchContent_Declare(SDL3 GIT_REPOSITORY https://github.com/libsdl-org/SDL @@ -16,6 +17,7 @@ if (NOT TARGET SDL3::SDL3) #GIT_TAG 1103294d33f47ab4c697bb22a9cf27c79c658630 # tip 15-05-2024 #GIT_TAG aacafd62336363077470f678b6217214b3b49473 # tip 28-05-2024 GIT_TAG 5fa9432b7d1c1722de93e1ab46e7a9569a47071e # tip 27-05-2024 - before changes made breaking sdl_image + FIND_PACKAGE_ARGS # for the future ) FetchContent_MakeAvailable(SDL3) diff --git a/src/main.cpp b/src/main.cpp index 89822040..f1ed880f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,6 +10,7 @@ #include "./start_screen.hpp" +#include #include #include #include @@ -23,6 +24,11 @@ int main(int argc, char** argv) { args.push_back(argv[i]); } +#ifdef __ANDROID__ + // change current working dir to internal storage + std::filesystem::current_path(SDL_AndroidGetInternalStoragePath()); +#endif + // setup hints if (SDL_SetHint(SDL_HINT_VIDEO_ALLOW_SCREENSAVER, "1") != SDL_TRUE) { std::cerr << "Failed to set '" << SDL_HINT_VIDEO_ALLOW_SCREENSAVER << "' to 1\n"; diff --git a/src/start_screen.cpp b/src/start_screen.cpp index b4f125a4..6e8ac2de 100644 --- a/src/start_screen.cpp +++ b/src/start_screen.cpp @@ -49,6 +49,7 @@ StartScreen::StartScreen(const std::vector& args, SDL_Renderer std::cerr << "TOMATO error: unknown cli arg: '" << args.at(ai) << "'\n"; } } + } Screen* StartScreen::render(float, bool&) { @@ -182,6 +183,7 @@ Screen* StartScreen::render(float, bool&) { } } else { if (ImGui::Button("load", {60, 25})) { + auto new_screen = std::make_unique(std::move(_conf), _renderer, _theme, _tox_profile_path, _password, _user_name, queued_plugin_paths); return new_screen.release(); }