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:
@@ -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"
|
||||
}
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user