- Подложка adaptive-иконки: градиент под акцент темы + радиальное свечение + мягкая тень от логотипа (ic_bg_<тема>, было плоским цветом). Иконку-лого не трогал. - Сплэш под выбранную тему: системный сплэш Android 12+ нельзя перекрасить под выбор пользователя (alias-тема на ColorOS игнорится), поэтому системный = просто тёмный (splash_transparent), а красивый сплэш рисуем сами на Compose (SplashOverlay): 3D-лого + акцентное свечение + тень + анимация, цвет берём из текущей темы. - Тему на старте читаем синхронно из SharedPreferences (мгновенно, без блокировки кадра). - Ускорен холодный старт до первого кадра 1.48с→1.11с: сплэш рисуется на первом дешёвом кадре, тяжёлый контент (ViewModels/плеер) композится под ним; старт PlayerService уведён с критического пути. Остаток — оверхед debug-сборки.
141 lines
8.3 KiB
XML
141 lines
8.3 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
xmlns:tools="http://schemas.android.com/tools">
|
|
|
|
<uses-permission android:name="android.permission.INTERNET" />
|
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
|
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
|
android:maxSdkVersion="28" />
|
|
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
|
|
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
|
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
|
<!-- Авто-обновление: установка скачанного APK -->
|
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
|
<!-- Держать CPU/Wi-Fi активными во время проигрывания при выключенном экране
|
|
(иначе поток глохнет в фоне — особенно в машине по Bluetooth). -->
|
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
|
<!-- Просить исключение из оптимизации батареи (Doze/ColorOS душат фоновое аудио). -->
|
|
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
|
|
|
<application
|
|
android:name=".RadiolaApplication"
|
|
android:allowBackup="true"
|
|
android:dataExtractionRules="@xml/data_extraction_rules"
|
|
android:fullBackupContent="@xml/backup_rules"
|
|
android:icon="@mipmap/ic_launcher"
|
|
android:label="@string/app_name"
|
|
android:roundIcon="@mipmap/ic_launcher_round"
|
|
android:supportsRtl="true"
|
|
android:theme="@style/Theme.Radiola"
|
|
android:usesCleartextTraffic="true"
|
|
tools:targetApi="31">
|
|
|
|
<activity
|
|
android:name=".MainActivity"
|
|
android:exported="true"
|
|
android:theme="@style/Theme.Radiola.Splash"
|
|
android:configChanges="orientation|screenSize|smallestScreenSize" />
|
|
|
|
<!-- Иконка лаунчера под цветовую тему: всегда включён ровно ОДИН alias.
|
|
Переключается в рантайме (LauncherIconManager) при смене темы. -->
|
|
<activity-alias android:name=".MainAliasForest" android:enabled="true" android:exported="true"
|
|
android:targetActivity=".MainActivity" android:label="@string/app_name"
|
|
android:icon="@mipmap/ic_launcher_forest" android:roundIcon="@mipmap/ic_launcher_forest_round"
|
|
android:theme="@style/Theme.Radiola.Splash.Forest">
|
|
<intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter>
|
|
</activity-alias>
|
|
<activity-alias android:name=".MainAliasOcean" android:enabled="false" android:exported="true"
|
|
android:targetActivity=".MainActivity" android:label="@string/app_name"
|
|
android:icon="@mipmap/ic_launcher_ocean" android:roundIcon="@mipmap/ic_launcher_ocean_round"
|
|
android:theme="@style/Theme.Radiola.Splash.Ocean">
|
|
<intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter>
|
|
</activity-alias>
|
|
<activity-alias android:name=".MainAliasSunset" android:enabled="false" android:exported="true"
|
|
android:targetActivity=".MainActivity" android:label="@string/app_name"
|
|
android:icon="@mipmap/ic_launcher_sunset" android:roundIcon="@mipmap/ic_launcher_sunset_round"
|
|
android:theme="@style/Theme.Radiola.Splash.Sunset">
|
|
<intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter>
|
|
</activity-alias>
|
|
<activity-alias android:name=".MainAliasAmethyst" android:enabled="false" android:exported="true"
|
|
android:targetActivity=".MainActivity" android:label="@string/app_name"
|
|
android:icon="@mipmap/ic_launcher_amethyst" android:roundIcon="@mipmap/ic_launcher_amethyst_round"
|
|
android:theme="@style/Theme.Radiola.Splash.Amethyst">
|
|
<intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter>
|
|
</activity-alias>
|
|
<activity-alias android:name=".MainAliasNeon" android:enabled="false" android:exported="true"
|
|
android:targetActivity=".MainActivity" android:label="@string/app_name"
|
|
android:icon="@mipmap/ic_launcher_neon" android:roundIcon="@mipmap/ic_launcher_neon_round"
|
|
android:theme="@style/Theme.Radiola.Splash.Neon">
|
|
<intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter>
|
|
</activity-alias>
|
|
<activity-alias android:name=".MainAliasAmber" android:enabled="false" android:exported="true"
|
|
android:targetActivity=".MainActivity" android:label="@string/app_name"
|
|
android:icon="@mipmap/ic_launcher_amber" android:roundIcon="@mipmap/ic_launcher_amber_round"
|
|
android:theme="@style/Theme.Radiola.Splash.Amber">
|
|
<intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter>
|
|
</activity-alias>
|
|
<activity-alias android:name=".MainAliasIce" android:enabled="false" android:exported="true"
|
|
android:targetActivity=".MainActivity" android:label="@string/app_name"
|
|
android:icon="@mipmap/ic_launcher_ice" android:roundIcon="@mipmap/ic_launcher_ice_round"
|
|
android:theme="@style/Theme.Radiola.Splash.Ice">
|
|
<intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter>
|
|
</activity-alias>
|
|
<activity-alias android:name=".MainAliasRose" android:enabled="false" android:exported="true"
|
|
android:targetActivity=".MainActivity" android:label="@string/app_name"
|
|
android:icon="@mipmap/ic_launcher_rose" android:roundIcon="@mipmap/ic_launcher_rose_round"
|
|
android:theme="@style/Theme.Radiola.Splash.Rose">
|
|
<intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter>
|
|
</activity-alias>
|
|
|
|
<service
|
|
android:name=".service.PlayerService"
|
|
android:exported="false"
|
|
android:foregroundServiceType="mediaPlayback">
|
|
<intent-filter>
|
|
<action android:name="androidx.media3.session.MediaSessionService" />
|
|
</intent-filter>
|
|
</service>
|
|
|
|
<service
|
|
android:name=".service.RecordingService"
|
|
android:exported="false"
|
|
android:foregroundServiceType="mediaPlayback" />
|
|
|
|
<provider
|
|
android:name="androidx.core.content.FileProvider"
|
|
android:authorities="${applicationId}.fileprovider"
|
|
android:exported="false"
|
|
android:grantUriPermissions="true">
|
|
<meta-data
|
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
|
android:resource="@xml/file_paths" />
|
|
</provider>
|
|
|
|
<receiver
|
|
android:name=".service.AlarmReceiver"
|
|
android:exported="false" />
|
|
|
|
<receiver
|
|
android:name=".service.BootReceiver"
|
|
android:exported="true">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
|
</intent-filter>
|
|
</receiver>
|
|
|
|
<receiver
|
|
android:name=".widget.PlayerWidgetProvider"
|
|
android:exported="false">
|
|
<intent-filter>
|
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
|
</intent-filter>
|
|
<meta-data
|
|
android:name="android.appwidget.provider"
|
|
android:resource="@xml/player_widget_info" />
|
|
</receiver>
|
|
</application>
|
|
|
|
</manifest>
|