feat: Modernisation UI/UX et configuration Flutter multi-plateforme

Phase 1 - Corrections Critiques:
- Fixed memory leaks dans music_provider.dart (stream subscriptions)
- Fixed race conditions dans search_provider.dart (stale results)
- Fixed token refresh errors dans api_service.dart
- Improved error handling avec messages utilisateur
- Changed API URL to HTTPS by default

Phase 2 - Améliorations UX Desktop:
- Ajouté cursor pointers sur tous les éléments cliquables
- Implémenté hover states avec effets néon glow (200ms transitions)
- Créé skeleton loading states avec shimmer animation
- Ajouté widgets: ClickableWrapper, ErrorDisplay, SkeletonLoading
- Enhanced visual feedback pour desktop users

Phase 3 - Configuration Flutter:
- Configuré Android (Gradle 8.1.0, Kotlin 1.9.0, minSdk 21, targetSdk 34)
- Créé launcher icons cyberpunk néon (5 densités)
- Configuré Windows desktop (structure complète)
- Activé Linux desktop support
- Ajouté package équatable pour entités de domaine
- Corrigé imports (colors.dart, auth_provider.dart)
- Fixed Dio API compatibility (RequestOptions)

Documentation:
- STYLE_GUIDE.md: Guide complet (100+ pages)
- DESIGN_IMPLEMENTATION_GUIDE.md: Implémentation Flutter
- BUILD_STATUS.md: Status builds + troubleshooting
- QUICKSTART_BUILDS.md: Guide rapide
- BUILD_INDEX.md: Index documentation
- PHASE_1_CORRECTIONS.md: Corrections Phase 1
- PHASE_2_UX_IMPROVEMENTS.md: Améliorations Phase 2
- PR_REVIEW_SUMMARY.md: Revue code complète
- CODE_ANALYSIS_AND_PRIORITIES.md: Analyse code

Scripts & Builds:
- BUILD_ALL.sh: Script automatisé builds multi-plateforme
- builds/: Structure avec README par plateforme
- design-system/: Système de design complet

Backend:
- Ajouté streaming HTTP Range pour audio progressif
- Enhanced YouTube service avec métadonnées complètes
- Improved error handling et validation

Generated with [Claude Code](https://claude.com/claude-code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
This commit is contained in:
root
2026-01-19 07:44:40 +00:00
parent a89c7894cf
commit 85dad89d5b
100 changed files with 13570 additions and 323 deletions
+43
View File
@@ -0,0 +1,43 @@
cmake_minimum_required(VERSION 3.10)
project(runner LANGUAGES CXX)
# Define the application target. To change its name, change BINARY_NAME in the
# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer
# work.
#
# Any new source files that you add to the application should be added here.
add_executable(${BINARY_NAME}
# "flutter/flutter_window.cc"
# "flutter/flutter_window.h"
# "flutter/engine_connection.cc"
# "flutter/engine_connection.h"
# "flutter/process_launcher.cc"
# "flutter/process_launcher.h"
"main.cpp"
"my_flutter_app.cc"
"my_flutter_app.h"
)
# Apply the standard set of build settings. This can be removed for applications
# that need different build settings.
apply_standard_settings(${BINARY_NAME})
# Add preprocessor definitions for the build version.
target_compile_definitions(${BINARY_NAME} PRIVATE
"FLUTTER_VERSION=\"${FLUTTER_VERSION}\""
"FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}"
"FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}"
"FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}"
"FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}"
)
# Disable Linux macros in Flutter headers.
target_compile_definitions(${BINARY_NAME} PRIVATE "_GNU_SOURCE=1")
# Add dependency libraries and include directories. Add any application-specific
# dependencies here.
target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
# Run the Flutter tool portions of the build. This must not be removed.
add_dependencies(${BINARY_NAME} flutter_assemble)
+89
View File
@@ -0,0 +1,89 @@
#include <my_flutter_app.h>
#include <flutter_linux/flutter_linux.h>
#ifdef GDK_WINDOWING_X11
#include <gdk/gdkx.h>
#endif
#include "flutter/generated_plugin_registrant.h"
struct _MyFlutterApp {
GtkApplication parent_instance;
char** dart_entrypoint_arguments;
};
G_DEFINE_TYPE(MyFlutterApp, my_flutter_app, GTK_TYPE_APPLICATION)
// Implements GApplication::activate.
static void my_flutter_app_activate(GApplication* application) {
MyFlutterApp* self = MY_FLUTTER_APP(application);
GtkWindow* window =
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
// Use a header bar when running in GNOME as this is the common style used
// by applications and is the layout most users expect.
gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(gtk_header_bar_new()),
TRUE);
gtk_window_set_titlebar(window, GTK_HEADER_BAR(gtk_header_bar_new()));
gtk_window_set_default_size(window, 1280, 720);
gtk_widget_show(GTK_WIDGET(window));
g_autoptr(FlutterDartProject) project = flutter_dart_project_new();
flutter_dart_project_set_dart_entrypoint_arguments(
project, self->dart_entrypoint_arguments);
FlView* view = fl_view_new(project);
gtk_widget_show(GTK_WIDGET(view));
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
fl_register_plugins(FL_PLUGIN_REGISTRY(view));
gtk_widget_grab_focus(GTK_WIDGET(view));
}
// Implements GApplication::local_command_line.
static gboolean my_flutter_app_local_command_line(GApplication* application,
gchar*** arguments,
int* exit_status) {
MyFlutterApp* self = MY_FLUTTER_APP(application);
// Strip out the first argument as it is the binary name.
self->dart_entrypoint_arguments = *arguments + 1;
g_autoptr(GError) error = nullptr;
if (!g_application_register(application, nullptr, &error)) {
g_warning("Failed to register: %s", error->message);
*exit_status = 1;
return TRUE;
}
g_application_activate(application);
*exit_status = 0;
return TRUE;
}
// Implements GObject::dispose.
static void my_flutter_app_dispose(GObject* object) {
G_OBJECT_CLASS(my_flutter_app_parent_class)->dispose(object);
}
static void my_flutter_app_class_init(MyFlutterAppClass* klass) {
G_APPLICATION_CLASS(klass)->activate = my_flutter_app_activate;
G_APPLICATION_CLASS(klass)->local_command_line =
my_flutter_app_local_command_line;
G_OBJECT_CLASS(klass)->dispose = my_flutter_app_dispose;
}
static void my_flutter_app_init(MyFlutterApp* self) {}
MyFlutterApp* my_flutter_app_new() {
return MY_FLUTTER_APP(g_object_new(my_flutter_app_get_type(),
"application-id", APPLICATION_ID,
"flags", G_APPLICATION_NON_UNIQUE,
nullptr));
}
int main(int argc, char** argv) {
g_autoptr(MyFlutterApp) app = my_flutter_app_new();
return g_application_run(G_APPLICATION(app), argc, argv);
}
+85
View File
@@ -0,0 +1,85 @@
#include "my_flutter_app.h"
#include <flutter_linux/flutter_linux.h>
#ifdef GDK_WINDOWING_X11
#include <gdk/gdkx.h>
#endif
#include "flutter/generated_plugin_registrant.h"
struct _MyFlutterApp {
GtkApplication parent_instance;
char** dart_entrypoint_arguments;
};
G_DEFINE_TYPE(MyFlutterApp, my_flutter_app, GTK_TYPE_APPLICATION)
// Implements GApplication::activate.
static void my_flutter_app_activate(GApplication* application) {
MyFlutterApp* self = MY_FLUTTER_APP(application);
GtkWindow* window =
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
// Use a header bar when running in GNOME as this is the common style used
// by applications and is the layout most users expect.
gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(gtk_header_bar_new()),
TRUE);
gtk_window_set_titlebar(window, GTK_HEADER_BAR(gtk_header_bar_new()));
gtk_window_set_default_size(window, 1280, 720);
gtk_widget_show(GTK_WIDGET(window));
g_autoptr(FlutterDartProject) project = flutter_dart_project_new();
flutter_dart_project_set_dart_entrypoint_arguments(
project, self->dart_entrypoint_arguments);
FlView* view = fl_view_new(project);
gtk_widget_show(GTK_WIDGET(view));
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
fl_register_plugins(FL_PLUGIN_REGISTRY(view));
gtk_widget_grab_focus(GTK_WIDGET(view));
}
// Implements GApplication::local_command_line.
static gboolean my_flutter_app_local_command_line(GApplication* application,
gchar*** arguments,
int* exit_status) {
MyFlutterApp* self = MY_FLUTTER_APP(application);
// Strip out the first argument as it is the binary name.
self->dart_entrypoint_arguments = *arguments + 1;
g_autoptr(GError) error = nullptr;
if (!g_application_register(application, nullptr, &error)) {
g_warning("Failed to register: %s", error->message);
*exit_status = 1;
return TRUE;
}
g_application_activate(application);
*exit_status = 0;
return TRUE;
}
// Implements GObject::dispose.
static void my_flutter_app_dispose(GObject* object) {
G_OBJECT_CLASS(my_flutter_app_parent_class)->dispose(object);
}
static void my_flutter_app_class_init(MyFlutterAppClass* klass) {
G_APPLICATION_CLASS(klass)->activate = my_flutter_app_activate;
G_APPLICATION_CLASS(klass)->local_command_line =
my_flutter_app_local_command_line;
G_OBJECT_CLASS(klass)->dispose = my_flutter_app_dispose;
}
static void my_flutter_app_init(MyFlutterApp* self) {}
MyFlutterApp* my_flutter_app_new() {
return MY_FLUTTER_APP(g_object_new(my_flutter_app_get_type(),
"application-id", APPLICATION_ID,
"flags", G_APPLICATION_NON_UNIQUE,
nullptr));
}
+17
View File
@@ -0,0 +1,17 @@
#ifndef FLUTTER_MY_FLUTTER_APP_H_
#define FLUTTER_MY_FLUTTER_APP_H_
#include <gtk/gtk.h>
G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE(MyFlutterApp, my_flutter_app, MY, FLUTTER_APP,
GtkApplication)
MyFlutterApp* my_flutter_app_new();
#define APPLICATION_ID "com.audiohm.audiOhm"
G_END_DECLS
#endif // FLUTTER_MY_FLUTTER_APP_H_