minSdkVersion: 24 (Android 7.0 Nougat, August 2016)compileSdkVersion: 35 (Android 15)targetSdkVersion: 35 (Android 15)
Benefits:
- Notification channels are always available (no version check needed)
- Can use
Notification.Builderdirectly instead ofNotificationCompat - Oreo has ~<3% of active devices (as of late 2024)
Files to simplify:
NotificationChannels.kt- RemoveBuild.VERSION.SDK_INT < Build.VERSION_CODES.Ocheck
Benefits:
FLAG_IMMUTABLEalways required for PendingIntents- Can remove
pendingIntentFlagCompat()wrapper entirely - Just always add
PendingIntent.FLAG_IMMUTABLE
Files to simplify:
SystemUtils.kt- RemovependingIntentFlagCompat(), inline the flagCalendarMonitor.kt- Direct use of FLAG_IMMUTABLEEventNotificationManager.kt- Direct use of FLAG_IMMUTABLE
Benefits:
POST_NOTIFICATIONSpermission always required- Can simplify notification permission flow
- Runtime receiver export flags always required
Files to simplify:
PermissionsManager.kt- Remove version checks inhasNotificationPermission()MainActivity.kt- Simplify runtime receiver registration (always use RECEIVER_NOT_EXPORTED flag)
-
Conservative approach: Raise to minSdk 26 first
- Small user impact (~3% of users)
- Removes notification channel version checks
- Aligns with modern Android development practices
-
Aggressive approach: Raise to minSdk 31
- Moderate user impact
- Significant code simplification
- PendingIntent flags become much simpler
Check current distribution at: https://apilevels.com/
As of late 2024:
- API 24-25 (Nougat): ~2%
- API 26-27 (Oreo): ~3%
- API 28 (Pie): ~5%
- API 29-30 (Android 10-11): ~20%
- API 31+ (Android 12+): ~70%
When raising minSdk:
- Update
minSdkVersionin bothandroid/build.gradleandandroid/app/build.gradle - Search for version checks:
grep -r "VERSION_CODES\." android/app/src/main/ - Remove/simplify checks that are now always true
- Update Robolectric test
@Config(sdk = [...])annotations if needed - Test on emulator at the new minimum API level