1 package leakcanary
2 
3 import android.app.Application
4 import leakcanary.HeapAnalysisInterceptor.Chain
5 import leakcanary.ProcessInfo.AvailableRam.BelowThreshold
6 import leakcanary.ProcessInfo.AvailableRam.LowRamDevice
7 import leakcanary.ProcessInfo.AvailableRam.Memory
8 
9 class MinimumMemoryInterceptor(
10   private val application: Application,
11   private val minimumRequiredAvailableMemoryBytes: Long = 100_000_000,
12   private val processInfo: ProcessInfo = ProcessInfo.Real
13 ) : HeapAnalysisInterceptor {
14 
interceptnull15   override fun intercept(chain: Chain): HeapAnalysisJob.Result {
16     when (val memory = processInfo.availableRam(application)) {
17       LowRamDevice -> {
18         chain.job.cancel("low ram device")
19       }
20       BelowThreshold -> {
21         chain.job.cancel("low memory")
22       }
23       is Memory -> {
24         if (memory.bytes < minimumRequiredAvailableMemoryBytes) {
25           chain.job.cancel(
26             "not enough free memory: available ${memory.bytes} < min $minimumRequiredAvailableMemoryBytes"
27           )
28         }
29       }
30     }
31 
32     return chain.proceed()
33   }
34 }