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
+49
View File
@@ -0,0 +1,49 @@
plugins {
id "com.android.application"
id "kotlin-android"
id "com.google.gms.google-services"
}
android {
namespace "com.audiohm.audiOhm"
compileSdk 34
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
defaultConfig {
applicationId "com.audiohm.audiOhm"
minSdk 21
targetSdk 34
versionCode 1
versionName "1.0.0"
multiDexEnabled true
}
buildTypes {
release {
signingConfig signingConfigs.debug
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-rules.pro')
}
}
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
+18
View File
@@ -0,0 +1,18 @@
{
"project_info": {
"project_number": "your-project-number",
"firebase_url": "https://your-project-id.firebaseio.com",
"project_id": "your-project-id",
"storage_bucket": "your-project-id.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:123456789:android:abcdef",
"android_client_info": {
"package_name": "com.audiohm.audiOhm"
}
}
}
]
}
@@ -0,0 +1,43 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.audiohm.audiOhm">
<uses-permission android:name="android.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:label="AudiOhm"
android:name=".Application"
android:icon="@mipmap/ic_launcher"
android:usesCleartextTrafficPermitted="true"
android:networkSecurityConfig="@xml/network_security_config">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|layoutDirection|locale"
android:hardwareAccelerated="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="com.ryanheise.audioservice.AudioService"
android:exported="false"
android:foregroundServiceType="mediaPlayback">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</service>
</application>
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</manifest>
@@ -0,0 +1,89 @@
package io.flutter.plugins;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import io.flutter.Log;
import io.flutter.embedding.engine.FlutterEngine;
/**
* Generated file. Do not edit.
* This file is generated by the Flutter tool based on the
* plugins that support the Android platform.
*/
@Keep
public final class GeneratedPluginRegistrant {
private static final String TAG = "GeneratedPluginRegistrant";
public static void registerWith(@NonNull FlutterEngine flutterEngine) {
try {
flutterEngine.getPlugins().add(new com.ryanheise.audioservice.AudioServicePlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin audio_service, com.ryanheise.audioservice.AudioServicePlugin", e);
}
try {
flutterEngine.getPlugins().add(new com.ryanheise.audio_session.AudioSessionPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin audio_session, com.ryanheise.audio_session.AudioSessionPlugin", e);
}
try {
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.connectivity.ConnectivityPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin connectivity_plus, dev.fluttercommunity.plus.connectivity.ConnectivityPlugin", e);
}
try {
flutterEngine.getPlugins().add(new io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin flutter_plugin_android_lifecycle, io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin", e);
}
try {
flutterEngine.getPlugins().add(new com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin flutter_secure_storage, com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin", e);
}
try {
flutterEngine.getPlugins().add(new io.flutter.plugins.imagepicker.ImagePickerPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin image_picker_android, io.flutter.plugins.imagepicker.ImagePickerPlugin", e);
}
try {
flutterEngine.getPlugins().add(new com.ryanheise.just_audio.JustAudioPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin just_audio, com.ryanheise.just_audio.JustAudioPlugin", e);
}
try {
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.packageinfo.PackageInfoPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin package_info_plus, dev.fluttercommunity.plus.packageinfo.PackageInfoPlugin", e);
}
try {
flutterEngine.getPlugins().add(new io.flutter.plugins.pathprovider.PathProviderPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin path_provider_android, io.flutter.plugins.pathprovider.PathProviderPlugin", e);
}
try {
flutterEngine.getPlugins().add(new com.baseflow.permissionhandler.PermissionHandlerPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin permission_handler_android, com.baseflow.permissionhandler.PermissionHandlerPlugin", e);
}
try {
flutterEngine.getPlugins().add(new io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin shared_preferences_android, io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin", e);
}
try {
flutterEngine.getPlugins().add(new com.tekartik.sqflite.SqflitePlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin sqflite_android, com.tekartik.sqflite.SqflitePlugin", e);
}
try {
flutterEngine.getPlugins().add(new eu.simonbinder.sqlite3_flutter_libs.Sqlite3FlutterLibsPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin sqlite3_flutter_libs, eu.simonbinder.sqlite3_flutter_libs.Sqlite3FlutterLibsPlugin", e);
}
try {
flutterEngine.getPlugins().add(new io.flutter.plugins.urllauncher.UrlLauncherPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin url_launcher_android, io.flutter.plugins.urllauncher.UrlLauncherPlugin", e);
}
}
}
@@ -0,0 +1,9 @@
package com.audiohm.audiOhm
import io.flutter.app.FlutterApplication
class Application: FlutterApplication() {
override fun onCreate() {
super.onCreate()
}
}
@@ -0,0 +1,11 @@
package com.audiohm.audiOhm
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
}
}
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M40,44 m6,6 l12,0 l-4,-4 l-8,8 m12,0 l-4,-4"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M68,44 m-6,6 l12,0 l-4,4 l-8,-8"/>
</vector>
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<!-- Background Circle - Cyberpunk Gradient -->
<path
android:fillColor="#0A0E27"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<!-- Neon Glow Circle -->
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"
android:fillAlpha="0.2"/>
<!-- Music Note Icon -->
<path
android:fillColor="#00F0FF"
android:pathData="M45,35 L45,35 L45,55 C45,58 47,60 50,60 C55,60 58,55 58,50 C58,43 54,38 50,35 L45,35 Z M45,30 C50,30 54,33 54,38 C54,43 50,46 45,50 L45,50 L40,50 L35,45 L35,45 L35,45 L38,42 C38,39 40,38 42,38 L45,35 Z M45,55 L50,60 L55,65 L65,65 L65,75 L65,85 L60,90 L50,90 L40,90 L35,85 L35,85 L35,75 L40,70 L45,55 Z"/>
<!-- Play Triangle -->
<path
android:fillColor="#F0F4F8"
android:pathData="M50,42 L50,42 L65,50 L50,58 L35,58 L50,42 Z"/>
<!-- Accent Lines - Cyberpunk Style -->
<path
android:fillColor="#BF00FF"
android:fillAlpha="0.8"
android:pathData="M35,65 L40,60 L45,65"/>
<path
android:fillColor="#FF006E"
android:fillAlpha="0.8"
android:pathData="M63,65 L68,60 L73,65"/>
<!-- Glow dots -->
<circle
android:fillColor="#00F0FF"
android:cx="30"
android:cy="45"
android:r="2"/>
<circle
android:fillColor="#00F0FF"
android:cx="78"
android:cy="45"
android:r="2"/>
</vector>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M40,44 m6,6 l12,0 l-4,-4 l-8,8 m12,0 l-4,-4"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M68,44 m-6,6 l12,0 l-4,4 l-8,-8"/>
</vector>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M40,44 m6,6 l12,0 l-4,-4 l-8,8 m12,0 l-4,-4"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M68,44 m-6,6 l12,0 l-4,4 l-8,-8"/>
</vector>
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<!-- Background Circle - Cyberpunk Gradient -->
<path
android:fillColor="#0A0E27"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<!-- Neon Glow Circle -->
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"
android:fillAlpha="0.2"/>
<!-- Music Note Icon -->
<path
android:fillColor="#00F0FF"
android:pathData="M45,35 L45,35 L45,55 C45,58 47,60 50,60 C55,60 58,55 58,50 C58,43 54,38 50,35 L45,35 Z M45,30 C50,30 54,33 54,38 C54,43 50,46 45,50 L45,50 L40,50 L35,45 L35,45 L35,45 L38,42 C38,39 40,38 42,38 L45,35 Z M45,55 L50,60 L55,65 L65,65 L65,75 L65,85 L60,90 L50,90 L40,90 L35,85 L35,85 L35,75 L40,70 L45,55 Z"/>
<!-- Play Triangle -->
<path
android:fillColor="#F0F4F8"
android:pathData="M50,42 L50,42 L65,50 L50,58 L35,58 L50,42 Z"/>
<!-- Accent Lines - Cyberpunk Style -->
<path
android:fillColor="#BF00FF"
android:fillAlpha="0.8"
android:pathData="M35,65 L40,60 L45,65"/>
<path
android:fillColor="#FF006E"
android:fillAlpha="0.8"
android:pathData="M63,65 L68,60 L73,65"/>
<!-- Glow dots -->
<circle
android:fillColor="#00F0FF"
android:cx="30"
android:cy="45"
android:r="2"/>
<circle
android:fillColor="#00F0FF"
android:cx="78"
android:cy="45"
android:r="2"/>
</vector>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M40,44 m6,6 l12,0 l-4,-4 l-8,8 m12,0 l-4,-4"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M68,44 m-6,6 l12,0 l-4,4 l-8,-8"/>
</vector>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M40,44 m6,6 l12,0 l-4,-4 l-8,8 m12,0 l-4,-4"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M68,44 m-6,6 l12,0 l-4,4 l-8,-8"/>
</vector>
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<!-- Background Circle - Cyberpunk Gradient -->
<path
android:fillColor="#0A0E27"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<!-- Neon Glow Circle -->
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"
android:fillAlpha="0.2"/>
<!-- Music Note Icon -->
<path
android:fillColor="#00F0FF"
android:pathData="M45,35 L45,35 L45,55 C45,58 47,60 50,60 C55,60 58,55 58,50 C58,43 54,38 50,35 L45,35 Z M45,30 C50,30 54,33 54,38 C54,43 50,46 45,50 L45,50 L40,50 L35,45 L35,45 L35,45 L38,42 C38,39 40,38 42,38 L45,35 Z M45,55 L50,60 L55,65 L65,65 L65,75 L65,85 L60,90 L50,90 L40,90 L35,85 L35,85 L35,75 L40,70 L45,55 Z"/>
<!-- Play Triangle -->
<path
android:fillColor="#F0F4F8"
android:pathData="M50,42 L50,42 L65,50 L50,58 L35,58 L50,42 Z"/>
<!-- Accent Lines - Cyberpunk Style -->
<path
android:fillColor="#BF00FF"
android:fillAlpha="0.8"
android:pathData="M35,65 L40,60 L45,65"/>
<path
android:fillColor="#FF006E"
android:fillAlpha="0.8"
android:pathData="M63,65 L68,60 L73,65"/>
<!-- Glow dots -->
<circle
android:fillColor="#00F0FF"
android:cx="30"
android:cy="45"
android:r="2"/>
<circle
android:fillColor="#00F0FF"
android:cx="78"
android:cy="45"
android:r="2"/>
</vector>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M40,44 m6,6 l12,0 l-4,-4 l-8,8 m12,0 l-4,-4"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M68,44 m-6,6 l12,0 l-4,4 l-8,-8"/>
</vector>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M40,44 m6,6 l12,0 l-4,-4 l-8,8 m12,0 l-4,-4"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M68,44 m-6,6 l12,0 l-4,4 l-8,-8"/>
</vector>
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<!-- Background Circle - Cyberpunk Gradient -->
<path
android:fillColor="#0A0E27"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<!-- Neon Glow Circle -->
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"
android:fillAlpha="0.2"/>
<!-- Music Note Icon -->
<path
android:fillColor="#00F0FF"
android:pathData="M45,35 L45,35 L45,55 C45,58 47,60 50,60 C55,60 58,55 58,50 C58,43 54,38 50,35 L45,35 Z M45,30 C50,30 54,33 54,38 C54,43 50,46 45,50 L45,50 L40,50 L35,45 L35,45 L35,45 L38,42 C38,39 40,38 42,38 L45,35 Z M45,55 L50,60 L55,65 L65,65 L65,75 L65,85 L60,90 L50,90 L40,90 L35,85 L35,85 L35,75 L40,70 L45,55 Z"/>
<!-- Play Triangle -->
<path
android:fillColor="#F0F4F8"
android:pathData="M50,42 L50,42 L65,50 L50,58 L35,58 L50,42 Z"/>
<!-- Accent Lines - Cyberpunk Style -->
<path
android:fillColor="#BF00FF"
android:fillAlpha="0.8"
android:pathData="M35,65 L40,60 L45,65"/>
<path
android:fillColor="#FF006E"
android:fillAlpha="0.8"
android:pathData="M63,65 L68,60 L73,65"/>
<!-- Glow dots -->
<circle
android:fillColor="#00F0FF"
android:cx="30"
android:cy="45"
android:r="2"/>
<circle
android:fillColor="#00F0FF"
android:cx="78"
android:cy="45"
android:r="2"/>
</vector>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M40,44 m6,6 l12,0 l-4,-4 l-8,8 m12,0 l-4,-4"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M68,44 m-6,6 l12,0 l-4,4 l-8,-8"/>
</vector>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M40,44 m6,6 l12,0 l-4,-4 l-8,8 m12,0 l-4,-4"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M68,44 m-6,6 l12,0 l-4,4 l-8,-8"/>
</vector>
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<!-- Background Circle - Cyberpunk Gradient -->
<path
android:fillColor="#0A0E27"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<!-- Neon Glow Circle -->
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"
android:fillAlpha="0.2"/>
<!-- Music Note Icon -->
<path
android:fillColor="#00F0FF"
android:pathData="M45,35 L45,35 L45,55 C45,58 47,60 50,60 C55,60 58,55 58,50 C58,43 54,38 50,35 L45,35 Z M45,30 C50,30 54,33 54,38 C54,43 50,46 45,50 L45,50 L40,50 L35,45 L35,45 L35,45 L38,42 C38,39 40,38 42,38 L45,35 Z M45,55 L50,60 L55,65 L65,65 L65,75 L65,85 L60,90 L50,90 L40,90 L35,85 L35,85 L35,75 L40,70 L45,55 Z"/>
<!-- Play Triangle -->
<path
android:fillColor="#F0F4F8"
android:pathData="M50,42 L50,42 L65,50 L50,58 L35,58 L50,42 Z"/>
<!-- Accent Lines - Cyberpunk Style -->
<path
android:fillColor="#BF00FF"
android:fillAlpha="0.8"
android:pathData="M35,65 L40,60 L45,65"/>
<path
android:fillColor="#FF006E"
android:fillAlpha="0.8"
android:pathData="M63,65 L68,60 L73,65"/>
<!-- Glow dots -->
<circle
android:fillColor="#00F0FF"
android:cx="30"
android:cy="45"
android:r="2"/>
<circle
android:fillColor="#00F0FF"
android:cx="78"
android:cy="45"
android:r="2"/>
</vector>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#00F0FF"
android:pathData="M54,10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 C30,10 10,30 10,54 C10,78 30,98 54,98 C78,98 98,78 98,54 C98,30 78,10 54,10 10 Z"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M40,44 m6,6 l12,0 l-4,-4 l-8,8 m12,0 l-4,-4"/>
<path
android:fillColor="#F0F4F8"
android:pathData="M68,44 m-6,6 l12,0 l-4,4 l-8,-8"/>
</vector>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">@android:color/white</item>
</style>
</resources>
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextPermitted="false">
<trust-anchors>
<certificates src="system" />
<certificates src="user"/>
</trust-anchors>
</base-config>
<!-- Allow localhost for development -->
<domain-config cleartextPermitted="true">
<domain includeSubdomains="true">localhost</domain>
<domain includeSubdomains="true">10.0.2.2</domain>
<domain includeSubdomains="true">10.0.0.1</domain>
</domain-config>
<!-- Production API -->
<domain-config cleartextPermitted="false">
<domain includeSubdomains="true">api.audiOhm.com</domain>
</domain-config>
</network-security-config>