中文 · English
Smartisan never saw itself as a company concerned with visuals alone. A beautiful interface was only the beginning; a product still had to solve real problems. Design, functionality, and interaction were meant to feel coherent—easy to understand on first use, yet rich enough to reveal small surprises over time. The “artisan” in Smartisan was not about placing a polished skin over a product, but about caring for every touch, response, and pause. Smartisan Music is one of the clearest expressions of that idea. Its turntable, tonearm, scratching, and vinyl crackle make digital music feel tangible, while songs, albums, and the library remain calm and legible. The physical playfulness should never come at the expense of playback or organization; what deserves to be preserved is the balance between texture, order, and utility. Smartisan OS has left the stage, so this project uses Smartisan Music 8.1.0 as its visual and interaction reference and rebuilds it with a modern Android stack. The interface retains the original XML layouts, drawables, NinePatch assets, selectors, animation timing, and view hierarchy wherever practical. Media scanning, background playback, queues, favorites, playlists, and persistence are rebuilt entirely on public Android APIs. The app reads and plays audio stored on the device and contains no built-in content catalog, account system, or media distribution service. ## Improvements over the original - **Modern local playback architecture**: Media3 `MediaLibraryService`, ExoPlayer, and MediaSession power background and lock-screen playback, media notifications, headset and Bluetooth controls, and queue and position recovery after process restarts. - **Rebuilt local library**: MediaStore indexes songs and provides song, album, artist, genre, and folder views, along with library exclusions, rescanning, sorting, filtering, and an alphabetical sidebar. - **Rebuilt favorites and playlists**: The original favorites and user-created playlists are retained, with persistence and play statistics reimplemented in Room. The queue, current item, and playback position are saved and restored as well. - **Expanded playback screen**: Embedded lyrics, a sleep timer, and a reorderable queue complement the original turntable and controls. - **New personalization options**: Custom artist separators, reorderable and pinnable bottom navigation, switchable app icons, and lightweight sound effects are added. Alongside the original icon, the yellow vinyl icon from realme UI 7.0 Music is preserved with color and monochrome layers adapted to Android's adaptive-icon specification. Sound effects include several presets and a custom equalizer curve. - **Refined turntable interaction**: Tonearm dragging, vinyl rotation, scratching, crackle audio, and playback-state transitions are reimplemented for modern touch handling, lifecycles, and frame timing. - **Richer library actions**: Multi-select, swipe actions, playlist insertion, audio-file sharing, and version-appropriate MediaStore deletion authorization are supported. Audio can also be opened directly from file managers and other apps. - **Android 8.1 and later support**: Separate compatibility paths cover legacy and scoped storage, system bars, gesture navigation, display cutouts, WindowInsets, and predictive back without replacing the original visual language. - **Modern data architecture**: Room, DataStore, Coroutines, and StateFlow manage the library, favorites, playlists, settings, and playback state without private Smartisan OS services or system-signature capabilities. - **Removed legacy baggage**: Business code is written in Kotlin and retains only the resources and public APIs required by the current implementation. The original background services, databases, and settings migrations are not carried forward. - **System-following dark mode**: Implemented purely through resources (`values-night` and same-name `drawable-night` variants) with no in-app toggle and no runtime skinning branches. The original 8.1.0 had no dark mode, so the night visuals are this project's own design: the charcoal palette comes from the sibling Smartisan Weather revival (page `#25282D`, title bar `#292C31`, cards `#34373C`), and the night bitmaps are generated from the original assets by `tools/generate_night_drawables.py` (proportional darkening or white-out with alpha and nine-patch markers preserved; safe to re-run). The red and blue brand accents are shared by both themes. ## Current features - Local audio permission flow, scanning, reindexing, and library folder exclusions - Song, album, artist, genre, and folder browsing - Sorting, filtering, alphabetical navigation, multi-select, and swipe actions - Favorites, user-created playlists, and play statistics - System-following dark mode with a charcoal night palette - Background playback, media notifications, and headset and Bluetooth controls - Sequential, shuffle, repeat-one, and repeat-all playback modes - Expandable queue, drag-to-reorder, and queue and position recovery - Vinyl turntable, draggable tonearm, scratching, and crackle audio - Static, line-synchronized, and word-timed lyrics embedded in audio files - Original, Bass, Clear, Vocal, Rock, and custom sound profiles - Sleep timer and system music volume control - External audio opening, audio-file sharing, and MediaStore-backed media deletion - Custom artist separators, bottom-navigation order and pinned items, and switchable app icons ## Local media and permissions The final app manifest does not contain the `INTERNET` permission. The app does not depend on a network connection and does not upload songs, artwork, lyrics, or library metadata. - Android 13 and later use `READ_MEDIA_AUDIO` to read device audio. Android 8.1 through Android 12 use the version-limited `READ_EXTERNAL_STORAGE` permission. - `FOREGROUND_SERVICE_MEDIA_PLAYBACK` is used only to keep user-initiated playback and its media notification active in the background. - `MODIFY_AUDIO_SETTINGS` supports playback effects and system music volume control, while `VIBRATE` provides interaction feedback. - For song deletion, Android 11 and later use the system batch confirmation flow, while Android 10 grants access per file. Android 8.1 and Android 9 request `WRITE_EXTERNAL_STORAGE` only after the user confirms deletion, then delete through MediaStore. - The app does not request modify-system-settings, location, camera, microphone, contacts, SMS, overlay, or accessibility permissions. ## Screenshots