2424import androidx .annotation .NonNull ;
2525import androidx .annotation .Nullable ;
2626import androidx .annotation .VisibleForTesting ;
27+ import androidx .lifecycle .DefaultLifecycleObserver ;
28+ import androidx .lifecycle .LifecycleOwner ;
29+ import androidx .lifecycle .ProcessLifecycleOwner ;
2730import io .flutter .Log ;
2831import io .flutter .embedding .engine .FlutterJNI ;
2932import io .flutter .view .TextureRegistry ;
@@ -78,6 +81,8 @@ public class FlutterRenderer implements TextureRegistry {
7881 private final Set <WeakReference <TextureRegistry .OnTrimMemoryListener >> onTrimMemoryListeners =
7982 new HashSet <>();
8083
84+ @ NonNull private final List <ImageReaderSurfaceProducer > imageReaderProducers = new ArrayList <>();
85+
8186 @ NonNull
8287 private final FlutterUiDisplayListener flutterUiDisplayListener =
8388 new FlutterUiDisplayListener () {
@@ -95,6 +100,20 @@ public void onFlutterUiNoLongerDisplayed() {
95100 public FlutterRenderer (@ NonNull FlutterJNI flutterJNI ) {
96101 this .flutterJNI = flutterJNI ;
97102 this .flutterJNI .addIsDisplayingFlutterUiListener (flutterUiDisplayListener );
103+ ProcessLifecycleOwner .get ()
104+ .getLifecycle ()
105+ .addObserver (
106+ new DefaultLifecycleObserver () {
107+ @ Override
108+ public void onResume (@ NonNull LifecycleOwner owner ) {
109+ Log .v (TAG , "onResume called; notifying SurfaceProducers" );
110+ for (ImageReaderSurfaceProducer producer : imageReaderProducers ) {
111+ if (producer .callback != null ) {
112+ producer .callback .onSurfaceCreated ();
113+ }
114+ }
115+ }
116+ });
98117 }
99118
100119 /**
@@ -197,6 +216,7 @@ public SurfaceProducer createSurfaceProducer() {
197216 final ImageReaderSurfaceProducer producer = new ImageReaderSurfaceProducer (id );
198217 registerImageTexture (id , producer );
199218 addOnTrimMemoryListener (producer );
219+ imageReaderProducers .add (producer );
200220 Log .v (TAG , "New ImageReaderSurfaceProducer ID: " + id );
201221 entry = producer ;
202222 } else {
@@ -453,6 +473,7 @@ final class ImageReaderSurfaceProducer
453473 new HashMap <ImageReader , PerImageReader >();
454474 private PerImage lastDequeuedImage = null ;
455475 private PerImageReader lastReaderDequeuedFrom = null ;
476+ private Callback callback = null ;
456477
457478 /** Internal class: state held per Image produced by ImageReaders. */
458479 private class PerImage {
@@ -673,11 +694,15 @@ public void onTrimMemory(int level) {
673694 }
674695 cleanup ();
675696 createNewReader = true ;
697+ if (this .callback != null ) {
698+ this .callback .onSurfaceDestroyed ();
699+ }
676700 }
677701
678702 private void releaseInternal () {
679703 cleanup ();
680704 released = true ;
705+ imageReaderProducers .remove (this );
681706 }
682707
683708 private void cleanup () {
@@ -732,6 +757,11 @@ private void maybeWaitOnFence(Image image) {
732757 this .id = id ;
733758 }
734759
760+ @ Override
761+ public void setCallback (Callback callback ) {
762+ this .callback = callback ;
763+ }
764+
735765 @ Override
736766 public long id () {
737767 return id ;
0 commit comments