AudioCutter is an Android-first audio trimmer that lets you import a clip, preview a selection, apply speed or codec tweaks, and export a polished file ready for ringtones, notifications or loops. It combines Jetpack Compose UX, FFmpegKit trimming, and lightweight AdMob monetization so the feature set stays focused and responsive.
- Jetpack Compose + Material 3 for responsive mobile-only layouts with waveform preview, chip controls, and contextual dialogs.
- FFmpegKit-backed trimming + waveform generation with selectable output formats (MP3, AAC/M4A, OGG, FLAC and WAV), quality presets, and configurable speed.
- Integrated AdMob banner & interstitial hooks (keys live in
app/build.gradle) so you can swap demo IDs with your production unit IDs. - Easy-to-understand ViewModel state (
AudioCutterViewModel) powering playback, trimming, waveform loading and user messaging. - Sample assets such as
autunno.mp3(for test imports) andlogo.jpegfor quick marketing/preview needs.
-
Prerequisites
- Java 17 (Coherent with the Gradle JVM defined in
app/build.gradle). - Android SDK 35 (compile + target).
- Android Studio Flamingo or newer if you want visual editing; otherwise the Gradle CLI via
./gradlew. - A
local.propertiesfile pointing to your SDK directory (Android Studio normally creates this automatically).
- Java 17 (Coherent with the Gradle JVM defined in
-
Clone & inspect
git clone <repo-url> cd audio_cutter
The Compose sources live under
app/src/main/java/com/workwavestudio/audiocutter, resources underapp/src/main/res, and the trimming logic insideAudioTrimProcessor. -
Build and run
- Run on emulator or device:
./gradlew installDebug(or open in Android Studio and hit the play button). - Assemble a ready-to-install APK:
./gradlew assembleRelease(release signing useskeystore.jks; rotate credentials for your production build). - Produce an AAB for Play Store:
./gradlew bundleRelease.
- Run on emulator or device:
-
Testing
- Unit tests:
./gradlew test - Instrumented/compose UI tests (requires device/emulator):
./gradlew connectedAndroidTest
- Unit tests:
-
Documentation
docs/USER_GUIDE.md: step-by-step instructions for end users and QA team expectations.docs/DEVELOPER_GUIDE.md: environment setup, dependency notes, architecture overview, and release reminders.docs/STORE_LISTING.md: ASO-friendly Play Store listing draft and keyword ideas.docs/PRIVACY_POLICY.md: privacy policy text you can publish on your site.docs/TERMS_OF_SERVICE.md: terms of service text for publishing.
AudioCutterViewModelhandles UI state, playback viaMediaPlayer, trimming requests and waveform generation.AudioTrimProcessorcopies the chosen audio to cache, invokes FFmpegKit for trimming and waveform data, and returns an AndroidUri.- Compose UI sits in
app/src/main/java/com/workwavestudio/audiocutter/uiwith the screen, helper cards, custom waveform canvas, and a small Ads interop view (BannerAd). - AdMob keys are injected via
BuildConfigfields defined insideapp/build.gradle, which differentiates production vs debug IDs. res/strings.xml,colors.xml, andthemes.xmldrive the Material theming used across cards/buttons/focus states.- Assets such as
logo.jpegandautunno.mp3live in the repository root for easy reference.
- Keep your real AdMob units in
admob.properties(gitignored). Copyadmob.properties.example, populate the four keys for production (BANNER_AD_UNIT_ID,INTERSTITIAL_AD_UNIT_ID) and debug (BANNER_AD_UNIT_ID_DEBUG,INTERSTITIAL_AD_UNIT_ID_DEBUG), and keep the resulting file private—the build script loads these values automatically. - To switch to your own AdMob credentials, update
BANNER_AD_UNIT_IDandINTERSTITIAL_AD_UNIT_IDin thereleaseanddebugbuild types insideapp/build.gradle. - The FFmpeg dependency currently pulls
com.moizhassan.ffmpeg:ffmpeg-kit-16kb:6.0.0. If you dropapp/libs/ffmpeg-kit-16kb-libshine.aarin place, Gradle will use it to enable MP3 via libshine. You can also enable MP3 via libmp3lame (standalone NDK) by placinglibmp3lame.soinapp/src/main/jniLibs/<abi>/and thelame.hheader inapp/src/main/cpp/include/lame/. Uncomment the localffmpeg-kit-full-gpl-6.0-2.LTS.aarblock if you prefer the full GPL build. - Keep the
keystore.jksfile in a secure place and rotate the passwords before publishing; update the signing config if the keystore moves or the alias changes.
This project is available under the MIT license. See LICENSE for details.