Skip to content

Commit e7f9963

Browse files
authored
Merge pull request #2806 from blundell/update-min-sdk-to-api-21
Update minimum SDK to API 26 (Android 8.0 Oreo)
2 parents 0cbefba + 2cbdce2 commit e7f9963

39 files changed

+69
-606
lines changed

.github/workflows/main.yml

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,10 @@ jobs:
3636
target: [ google_apis ]
3737
channel: [ stable ]
3838
api-level:
39-
- 21
40-
- 23
4139
- 26
4240
- 31
4341
- 33
4442
- 34
45-
include:
46-
- arch: x86
47-
api-level: 16
48-
target: google_apis
49-
channel: stable
50-
- arch: x86
51-
api-level: 19
52-
target: google_apis
53-
channel: stable
5443
steps:
5544
- name: Enable KVM group perms
5645
run: |

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ androidXJunit = "1.1.5"
2323
workManager = "2.7.0"
2424
detekt = "1.23.8"
2525
hilt = "2.53"
26-
androidMinSdk = "14"
26+
androidMinSdk = "26"
2727
androidCompileSdk = "35"
2828

2929
[libraries]
@@ -60,7 +60,7 @@ androidX-test-monitor = { module = "androidx.test:monitor", version = "1.6.1" }
6060
androidX-test-rules = { module = "androidx.test:rules", version.ref = "androidXTest" }
6161
# Exposed transitively, avoid increasing
6262
androidX-test-runner = { module = "androidx.test:runner", version = "1.5.2" }
63-
androidX-test-orchestrator = { module = "androidx.test:orchestrator", version = "1.4.2" } # 1.5.0+ requires API 21+, keeping at 1.4.2 for API 16 compatibility
63+
androidX-test-orchestrator = { module = "androidx.test:orchestrator", version = "1.5.0" }
6464
androidX-test-espresso = { module = "androidx.test.espresso:espresso-core", version = "3.5.1" }
6565
androidX-test-junit = { module = "androidx.test.ext:junit", version.ref = "androidXJunit" }
6666
androidX-test-junitKtx = { module = "androidx.test.ext:junit-ktx", version.ref = "androidXJunit" }

leakcanary/leakcanary-android-core/src/main/java/leakcanary/LeakCanaryAndroidInternalUtils.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import android.content.Intent
77
import android.content.pm.ShortcutInfo.Builder
88
import android.content.pm.ShortcutManager
99
import android.graphics.drawable.Icon
10-
import android.os.Build.VERSION
11-
import android.os.Build.VERSION_CODES
1210
import com.squareup.leakcanary.core.R
1311
import shark.SharkLog
1412

@@ -18,9 +16,6 @@ internal object LeakCanaryAndroidInternalUtils {
1816

1917
@Suppress("ReturnCount")
2018
fun addLeakActivityDynamicShortcut(application: Application) {
21-
if (VERSION.SDK_INT < VERSION_CODES.N_MR1) {
22-
return
23-
}
2419
if (!application.resources.getBoolean(R.bool.leak_canary_add_dynamic_shortcut)) {
2520
return
2621
}
@@ -124,6 +119,6 @@ internal object LeakCanaryAndroidInternalUtils {
124119
}
125120

126121
fun isInstantApp(application: Application): Boolean {
127-
return VERSION.SDK_INT >= VERSION_CODES.O && application.packageManager.isInstantApp
122+
return application.packageManager.isInstantApp
128123
}
129124
}

leakcanary/leakcanary-android-core/src/main/java/leakcanary/NotificationEventListener.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import android.app.Notification
44
import android.app.NotificationManager
55
import android.app.PendingIntent
66
import android.content.Context
7-
import android.os.Build
87
import com.squareup.leakcanary.core.R
98
import leakcanary.EventListener.Event
109
import leakcanary.EventListener.Event.DumpingHeap
@@ -67,11 +66,7 @@ object NotificationEventListener : EventListener {
6766
} else {
6867
appContext.getString(R.string.leak_canary_analysis_failed)
6968
}
70-
val flags = if (Build.VERSION.SDK_INT >= 23) {
71-
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
72-
} else {
73-
PendingIntent.FLAG_UPDATE_CURRENT
74-
}
69+
val flags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
7570
val pendingIntent = PendingIntent.getActivity(appContext, 1, event.showIntent, flags)
7671
showHeapAnalysisResultNotification(contentTitle,pendingIntent)
7772
}

leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LeakCanaryFileProvider.kt

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import android.content.pm.ProviderInfo
2424
import android.database.Cursor
2525
import android.database.MatrixCursor
2626
import android.net.Uri
27-
import android.os.Build
2827
import android.os.Environment
2928
import android.os.ParcelFileDescriptor
3029
import android.os.StrictMode
@@ -499,7 +498,7 @@ internal class LeakCanaryFileProvider : ContentProvider() {
499498
if (externalCacheDirs.isNotEmpty()) {
500499
target = externalCacheDirs[0]
501500
}
502-
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && TAG_EXTERNAL_MEDIA == tag) {
501+
} else if (TAG_EXTERNAL_MEDIA == tag) {
503502
val externalMediaDirs = context.externalMediaDirs
504503
if (externalMediaDirs.isNotEmpty()) {
505504
target = externalMediaDirs[0]
@@ -519,19 +518,11 @@ internal class LeakCanaryFileProvider : ContentProvider() {
519518
context: Context,
520519
type: String?
521520
): Array<File> {
522-
return if (Build.VERSION.SDK_INT >= 19) {
523-
context.getExternalFilesDirs(type)
524-
} else {
525-
arrayOf(context.getExternalFilesDir(type)!!)
526-
}
521+
return context.getExternalFilesDirs(type)
527522
}
528523

529524
private fun getExternalCacheDirs(context: Context): Array<File> {
530-
return if (Build.VERSION.SDK_INT >= 19) {
531-
context.externalCacheDirs
532-
} else {
533-
arrayOf(context.externalCacheDir!!)
534-
}
525+
return context.externalCacheDirs
535526
}
536527

537528
/**

leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/LeakDirectoryProvider.kt

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,8 @@
1616
package leakcanary.internal
1717

1818
import android.Manifest.permission.WRITE_EXTERNAL_STORAGE
19-
import android.annotation.TargetApi
2019
import android.content.Context
2120
import android.content.pm.PackageManager.PERMISSION_GRANTED
22-
import android.os.Build.VERSION.SDK_INT
23-
import android.os.Build.VERSION_CODES.M
2421
import android.os.Environment
2522
import android.os.Environment.DIRECTORY_DOWNLOADS
2623
import com.squareup.leakcanary.core.R
@@ -79,12 +76,7 @@ internal class LeakDirectoryProvider constructor(
7976
return File(storageDirectory, fileName)
8077
}
8178

82-
@TargetApi(M) fun hasStoragePermission(): Boolean {
83-
// Defensive check: @TargetApi doesn't prevent this method from being called on older APIs
84-
@Suppress("ObsoleteSdkInt")
85-
if (SDK_INT < M) {
86-
return true
87-
}
79+
fun hasStoragePermission(): Boolean {
8880
// Once true, this won't change for the life of the process so we can cache it.
8981
if (writeExternalStorageGranted) {
9082
return true

leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/NotificationReceiver.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import android.app.PendingIntent
44
import android.content.BroadcastReceiver
55
import android.content.Context
66
import android.content.Intent
7-
import android.os.Build
87
import leakcanary.internal.NotificationReceiver.Action.CANCEL_NOTIFICATION
98
import leakcanary.internal.NotificationReceiver.Action.DUMP_HEAP
109
import shark.SharkLog
@@ -40,11 +39,7 @@ internal class NotificationReceiver : BroadcastReceiver() {
4039
): PendingIntent {
4140
val broadcastIntent = Intent(context, NotificationReceiver::class.java)
4241
broadcastIntent.action = action.name
43-
val flags = if (Build.VERSION.SDK_INT >= 23) {
44-
PendingIntent.FLAG_IMMUTABLE
45-
} else {
46-
0
47-
}
42+
val flags = PendingIntent.FLAG_IMMUTABLE
4843
return PendingIntent.getBroadcast(context, 0, broadcastIntent, flags)
4944
}
5045
}

leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/Notifications.kt

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ import android.app.NotificationManager
2222
import android.app.PendingIntent
2323
import android.content.Context
2424
import android.os.Build.VERSION.SDK_INT
25-
import android.os.Build.VERSION_CODES.JELLY_BEAN
26-
import android.os.Build.VERSION_CODES.O
2725
import com.squareup.leakcanary.core.R
2826
import leakcanary.LeakCanary
2927
import leakcanary.internal.InternalLeakCanary.FormFactor.MOBILE
@@ -90,9 +88,7 @@ internal object Notifications {
9088
return
9189
}
9290

93-
val builder = if (SDK_INT >= O) {
94-
Notification.Builder(context, type.name)
95-
} else Notification.Builder(context)
91+
val builder = Notification.Builder(context, type.name)
9692

9793
builder
9894
.setContentText(contentText)
@@ -115,26 +111,19 @@ internal object Notifications {
115111
builder.setSmallIcon(R.drawable.leak_canary_leak)
116112
.setWhen(System.currentTimeMillis())
117113

118-
if (SDK_INT >= O) {
119-
val notificationManager =
120-
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
121-
var notificationChannel: NotificationChannel? =
122-
notificationManager.getNotificationChannel(type.name)
123-
if (notificationChannel == null) {
124-
val channelName = context.getString(type.nameResId)
125-
notificationChannel =
126-
NotificationChannel(type.name, channelName, type.importance)
127-
notificationManager.createNotificationChannel(notificationChannel)
128-
}
129-
builder.setChannelId(type.name)
130-
builder.setGroup(type.name)
114+
val notificationManager =
115+
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
116+
var notificationChannel: NotificationChannel? =
117+
notificationManager.getNotificationChannel(type.name)
118+
if (notificationChannel == null) {
119+
val channelName = context.getString(type.nameResId)
120+
notificationChannel =
121+
NotificationChannel(type.name, channelName, type.importance)
122+
notificationManager.createNotificationChannel(notificationChannel)
131123
}
124+
builder.setChannelId(type.name)
125+
builder.setGroup(type.name)
132126

133-
return if (SDK_INT < JELLY_BEAN) {
134-
@Suppress("DEPRECATION")
135-
builder.notification
136-
} else {
137-
builder.build()
138-
}
127+
return builder.build()
139128
}
140129
}

leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/RequestPermissionActivity.kt

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package leakcanary.internal
1717

18-
import android.annotation.TargetApi
1918
import android.app.Activity
2019
import android.app.PendingIntent
2120
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
@@ -26,12 +25,10 @@ import android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP
2625
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
2726
import android.content.pm.PackageManager.PERMISSION_GRANTED
2827
import android.os.Bundle
29-
import android.os.Build
3028
import android.widget.Toast
3129
import android.widget.Toast.LENGTH_LONG
3230
import com.squareup.leakcanary.core.R
3331

34-
@TargetApi(Build.VERSION_CODES.M) //
3532
internal class RequestPermissionActivity : Activity() {
3633

3734
private val targetPermission: String
@@ -84,13 +81,7 @@ internal class RequestPermissionActivity : Activity() {
8481

8582
fun createPendingIntent(context: Context, permission: String): PendingIntent {
8683
val intent = createIntent(context, permission)
87-
// Defensive check: @TargetApi on class doesn't prevent this method from being called on older APIs
88-
@Suppress("ObsoleteSdkInt")
89-
val flags = if (Build.VERSION.SDK_INT >= 23) {
90-
FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE
91-
} else {
92-
FLAG_UPDATE_CURRENT
93-
}
84+
val flags = FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE
9485
return PendingIntent.getActivity(context, 1, intent, flags)
9586
}
9687
}

leakcanary/leakcanary-android-core/src/main/java/leakcanary/internal/SquigglySpanRenderer.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import android.content.Context
44
import android.graphics.Canvas
55
import android.graphics.Paint
66
import android.graphics.Path
7-
import android.os.Build
87
import android.text.Layout
98
import com.squareup.leakcanary.core.R
109
import kotlin.math.max
@@ -107,7 +106,7 @@ internal abstract class SquigglySpanRenderer(context: Context) {
107106

108107
private fun Layout.getLineBottomWithoutSpacing(line: Int): Int {
109108
val lineBottom = getLineBottom(line)
110-
val lastLineSpacingNotAdded = Build.VERSION.SDK_INT >= 19
109+
val lastLineSpacingNotAdded = true
111110
val isLastLine = line == lineCount - 1
112111

113112
val lineBottomWithoutSpacing: Int

0 commit comments

Comments
 (0)