From 52f0312c5c3153db382830a9c3a20ee64623aff9 Mon Sep 17 00:00:00 2001 From: "anthony@rabine.fr" Date: Mon, 20 May 2024 15:41:30 +0200 Subject: [PATCH] (wip) Flutter App v1.1: fix logo, fix build warning (updated to last), freezed SDL libraries to a tag --- .gitignore | 4 +++ .vscode/launch.json | 8 +++++ docs/player-dev.md | 11 ++++++- story-editor/CMakeLists.txt | 13 ++++---- story-player/android/app/build.gradle | 30 +++++++++-------- .../android/app/src/main/AndroidManifest.xml | 3 ++ story-player/android/build.gradle | 12 ------- story-player/android/settings.gradle | 31 +++++++++++++----- story-player/assets/320x240.png | Bin 4446 -> 0 bytes story-player/assets/logo.png | Bin 0 -> 24181 bytes story-player/lib/libstory/indexfile.dart | 19 ++++++----- story-player/lib/main.dart | 12 +++---- .../flutter/generated_plugin_registrant.cc | 11 ------- .../linux/flutter/generated_plugins.cmake | 23 ------------- story-player/linux/my_application.cc | 4 +-- story-player/pubspec.yaml | 2 +- 16 files changed, 89 insertions(+), 94 deletions(-) delete mode 100644 story-player/assets/320x240.png create mode 100644 story-player/assets/logo.png delete mode 100644 story-player/linux/flutter/generated_plugin_registrant.cc delete mode 100644 story-player/linux/flutter/generated_plugins.cmake diff --git a/.gitignore b/.gitignore index 97360a2..c559c9e 100644 --- a/.gitignore +++ b/.gitignore @@ -91,3 +91,7 @@ story-player/storyvm/build/ story-player-sdl/build/ story-player-raylib/build/ + +story-player/linux/flutter/generated_plugin_registrant.cc + +story-player/linux/flutter/generated_plugins.cmake diff --git a/.vscode/launch.json b/.vscode/launch.json index 2290ea5..0dec3ed 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,14 @@ // Pour plus d'informations, visitez : https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "name": "Flutter (debug)", + "type": "dart", + "request": "launch", + "program": "lib/main.dart", + "flutterMode": "debug", + "cwd": "${workspaceFolder}/story-player" + }, { "name": "Debug Story Editor (GDB)", "type": "cppdbg", diff --git a/docs/player-dev.md b/docs/player-dev.md index 0798775..193ed05 100644 --- a/docs/player-dev.md +++ b/docs/player-dev.md @@ -8,14 +8,23 @@ sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev # Environment variables +``` +export PATH=$PATH:/home/anthony/development/flutter +export ANDROID_HOME=/mnt/work/android-sdk +export PATH=$PATH:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools +``` # Build for Linux flutter build linux -# Build for Android +# Build and run for Android flutter build apk + +adb devices +adb -s emulator-5554 install -r build/app/outputs/flutter-apk/app-release.apk +adb push stories /storage/emulated/0/Download/ diff --git a/story-editor/CMakeLists.txt b/story-editor/CMakeLists.txt index 1fc4748..322e3e3 100644 --- a/story-editor/CMakeLists.txt +++ b/story-editor/CMakeLists.txt @@ -132,10 +132,10 @@ include_directories(${sdl3_SOURCE_DIR}/include) FetchContent_Declare( sdl3_mixer GIT_REPOSITORY https://github.com/libsdl-org/SDL_mixer.git - GIT_TAG origin/main - GIT_SHALLOW TRUE - GIT_PROGRESS TRUE - GIT_SUBMODULES "" + GIT_TAG cc78718f6e87354fee8ffe4dc516a20f608c2d65 + # GIT_SHALLOW TRUE + # GIT_PROGRESS TRUE + # GIT_SUBMODULES "" ) set(BUILD_SHARED_LIBS TRUE) @@ -151,10 +151,9 @@ include_directories(${sdl3_mixer_SOURCE_DIR}/include) FetchContent_Declare( sdl_image GIT_REPOSITORY https://github.com/libsdl-org/SDL_image.git - GIT_TAG origin/main - GIT_SHALLOW TRUE + GIT_TAG ff62eb68aebe9801f06695c86a67292c6f166b16 GIT_PROGRESS TRUE -) +) set(SDL3IMAGE_INSTALL OFF) diff --git a/story-player/android/app/build.gradle b/story-player/android/app/build.gradle index e1da9c7..cc53734 100644 --- a/story-player/android/app/build.gradle +++ b/story-player/android/app/build.gradle @@ -1,3 +1,9 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { @@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) { } } -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' @@ -21,9 +22,6 @@ if (flutterVersionName == null) { flutterVersionName = '1.0' } -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { namespace "org.openstoryteller.story_player" @@ -43,15 +41,20 @@ android { main.java.srcDirs += 'src/main/kotlin' } + lintOptions { + checkReleaseBuilds false + } + defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "org.openstoryteller.story_player" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion flutter.minSdkVersion - targetSdkVersion flutter.targetSdkVersion - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName + maxSdkVersion 23 + targetSdkVersion 23 + versionCode 2 + versionName "1.1.0" } buildTypes { @@ -73,6 +76,5 @@ flutter { source '../..' } -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" -} +dependencies {} + diff --git a/story-player/android/app/src/main/AndroidManifest.xml b/story-player/android/app/src/main/AndroidManifest.xml index e6c7ac5..4d246bc 100644 --- a/story-player/android/app/src/main/AndroidManifest.xml +++ b/story-player/android/app/src/main/AndroidManifest.xml @@ -5,6 +5,9 @@ + + + diff --git a/story-player/android/build.gradle b/story-player/android/build.gradle index f7eb7f6..1e73c4f 100644 --- a/story-player/android/build.gradle +++ b/story-player/android/build.gradle @@ -1,15 +1,3 @@ -buildscript { - ext.kotlin_version = '1.7.10' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} allprojects { repositories { diff --git a/story-player/android/settings.gradle b/story-player/android/settings.gradle index 44e62bc..a7fce79 100644 --- a/story-player/android/settings.gradle +++ b/story-player/android/settings.gradle @@ -1,11 +1,26 @@ -include ':app' +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() + // includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false +} + +include ":app" \ No newline at end of file diff --git a/story-player/assets/320x240.png b/story-player/assets/320x240.png deleted file mode 100644 index 240eff579451039b8c2d1f8792643619174ba8fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4446 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 diff --git a/story-player/assets/logo.png b/story-player/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2f44da5cce98a30905e20a32fda662ac6cbfce83 GIT binary patch literal 24181 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 literal 0 HcmV?d00001 diff --git a/story-player/lib/libstory/indexfile.dart b/story-player/lib/libstory/indexfile.dart index 0ab5cb5..4b21c81 100644 --- a/story-player/lib/libstory/indexfile.dart +++ b/story-player/lib/libstory/indexfile.dart @@ -121,16 +121,17 @@ class IndexFile { String indexFileName = '$libraryRoot/index.ost'; - bool isGranted = true; + bool isGranted = false; - // if (Platform.isAndroid) { - - // if (await Permission.manageExternalStorage.request().isGranted) { - // isGranted = true; - // } - // } else { - // isGranted = true; - // } + if (Platform.isAndroid) { + if (await Permission.storage.request().isGranted) { + if (await Permission.manageExternalStorage.request().isGranted) { + isGranted = true; + } + } + } else { + isGranted = true; + } if (isGranted) { final file = File(indexFileName); diff --git a/story-player/lib/main.dart b/story-player/lib/main.dart index 939f82a..cd1304a 100644 --- a/story-player/lib/main.dart +++ b/story-player/lib/main.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart' hide Router; +import 'package:path/path.dart'; import 'dart:io'; import 'dart:convert'; @@ -98,18 +99,14 @@ enum PlayerState { disabled, indexFile, inStory } class _MyHomePageState extends State { String myPath = 'fffff'; IndexFile indexFile = IndexFile(); - String currentImage = 'assets/320x240.png'; + String currentImage = 'assets/logo.png'; final player = AudioPlayer(); StreamSubscription? mediaPub; PlayerState state = PlayerState.disabled; StreamSubscription? audioPlayerSub; - Image img = const Image(image: AssetImage('assets/320x240.png')); + Image img = const Image(image: AssetImage('assets/logo.png')); - // final Permission _permission = Permission.storage; - PermissionStatus _permissionStatus = PermissionStatus.denied; - - var _openResult = 'Unknown'; void initPaths() async { Directory? dir; @@ -221,7 +218,10 @@ class _MyHomePageState extends State { ); }).toList(); }, + ), + const Divider() + , const Text("v1.1") ], ), body: Center( diff --git a/story-player/linux/flutter/generated_plugin_registrant.cc b/story-player/linux/flutter/generated_plugin_registrant.cc deleted file mode 100644 index e71a16d..0000000 --- a/story-player/linux/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,11 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - - -void fl_register_plugins(FlPluginRegistry* registry) { -} diff --git a/story-player/linux/flutter/generated_plugins.cmake b/story-player/linux/flutter/generated_plugins.cmake deleted file mode 100644 index 2e1de87..0000000 --- a/story-player/linux/flutter/generated_plugins.cmake +++ /dev/null @@ -1,23 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/story-player/linux/my_application.cc b/story-player/linux/my_application.cc index bf8eca2..874d97e 100644 --- a/story-player/linux/my_application.cc +++ b/story-player/linux/my_application.cc @@ -40,11 +40,11 @@ static void my_application_activate(GApplication* application) { if (use_header_bar) { GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "flutter_launcher"); + gtk_header_bar_set_title(header_bar, "Story Player"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); } else { - gtk_window_set_title(window, "flutter_launcher"); + gtk_window_set_title(window, "Story Player"); } gtk_window_set_default_size(window, 1280, 720); diff --git a/story-player/pubspec.yaml b/story-player/pubspec.yaml index 3f67bca..fd016de 100644 --- a/story-player/pubspec.yaml +++ b/story-player/pubspec.yaml @@ -103,5 +103,5 @@ flutter: # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages assets: - - assets/320x240.png + - assets/logo.png \ No newline at end of file