<lambda>null1 package leakcanary.internal
2 
3 import android.content.Context
4 import androidx.work.ForegroundInfo
5 import androidx.work.WorkerParameters
6 import androidx.work.impl.utils.futures.SettableFuture
7 import androidx.work.multiprocess.RemoteListenableWorker
8 import com.google.common.util.concurrent.ListenableFuture
9 import leakcanary.BackgroundThreadHeapAnalyzer.heapAnalyzerThreadHandler
10 import leakcanary.EventListener.Event.HeapDump
11 import leakcanary.internal.HeapAnalyzerWorker.Companion.asEvent
12 import leakcanary.internal.HeapAnalyzerWorker.Companion.heapAnalysisForegroundInfoAsync
13 import shark.SharkLog
14 
15 internal class RemoteHeapAnalyzerWorker(appContext: Context, workerParams: WorkerParameters) :
16   RemoteListenableWorker(appContext, workerParams) {
17 
18   override fun startRemoteWork(): ListenableFuture<Result> {
19     val heapDump = inputData.asEvent<HeapDump>()
20     val result = SettableFuture.create<Result>()
21     heapAnalyzerThreadHandler.post {
22       val doneEvent = AndroidDebugHeapAnalyzer.runAnalysisBlocking(heapDump, isCanceled = {
23         result.isCancelled
24       }) { progressEvent ->
25         if (!result.isCancelled) {
26           InternalLeakCanary.sendEvent(progressEvent)
27         }
28       }
29       if (result.isCancelled) {
30         SharkLog.d { "Remote heap analysis for ${heapDump.file} was canceled" }
31       } else {
32         InternalLeakCanary.sendEvent(doneEvent)
33         result.set(Result.success())
34       }
35     }
36     return result
37   }
38 
39   override fun getForegroundInfoAsync(): ListenableFuture<ForegroundInfo> {
40     return applicationContext.heapAnalysisForegroundInfoAsync()
41   }
42 }
43