package io.flutter.view; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Insets; import android.graphics.Rect; import android.graphics.SurfaceTexture; import android.os.Build; import android.os.Handler; import android.text.format.DateFormat; import android.util.AttributeSet; import android.util.SparseArray; import android.view.DisplayCutout; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.PointerIcon; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewStructure; import android.view.WindowInsets; import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeProvider; import android.view.autofill.AutofillValue; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputMethodManager; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.annotation.UiThread; import io.flutter.Log; import io.flutter.app.FlutterPluginRegistry; import io.flutter.embedding.android.AndroidTouchProcessor; import io.flutter.embedding.android.KeyChannelResponder; import io.flutter.embedding.android.KeyboardManager; import io.flutter.embedding.engine.dart.DartExecutor; import io.flutter.embedding.engine.renderer.FlutterRenderer; import io.flutter.embedding.engine.renderer.SurfaceTextureWrapper; import io.flutter.embedding.engine.systemchannels.AccessibilityChannel; import io.flutter.embedding.engine.systemchannels.KeyEventChannel; import io.flutter.embedding.engine.systemchannels.LifecycleChannel; import io.flutter.embedding.engine.systemchannels.LocalizationChannel; import io.flutter.embedding.engine.systemchannels.MouseCursorChannel; import io.flutter.embedding.engine.systemchannels.NavigationChannel; import io.flutter.embedding.engine.systemchannels.PlatformChannel; import io.flutter.embedding.engine.systemchannels.SettingsChannel; import io.flutter.embedding.engine.systemchannels.SystemChannel; import io.flutter.embedding.engine.systemchannels.TextInputChannel; import io.flutter.plugin.common.ActivityLifecycleListener; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.editing.TextInputPlugin; import io.flutter.plugin.localization.LocalizationPlugin; import io.flutter.plugin.mouse.MouseCursorPlugin; import io.flutter.plugin.platform.PlatformPlugin; import io.flutter.plugin.platform.PlatformViewsController; import io.flutter.util.ViewUtils; import io.flutter.view.AccessibilityBridge; import io.flutter.view.TextureRegistry; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicLong; @Deprecated public class FlutterView extends SurfaceView implements BinaryMessenger, TextureRegistry, MouseCursorPlugin.MouseCursorViewDelegate { private static final String TAG = "FlutterView"; private final AndroidTouchProcessor androidTouchProcessor; private final DartExecutor dartExecutor; private boolean didRenderFirstFrame; private final FlutterRenderer flutterRenderer; private final KeyEventChannel keyEventChannel; private final LifecycleChannel lifecycleChannel; private final LocalizationChannel localizationChannel; private AccessibilityBridge mAccessibilityNodeProvider; private final List<ActivityLifecycleListener> mActivityLifecycleListeners; private final List<FirstFrameListener> mFirstFrameListeners; private final InputMethodManager mImm; private boolean mIsSoftwareRenderingEnabled; private final KeyboardManager mKeyboardManager; private final LocalizationPlugin mLocalizationPlugin; private final ViewportMetrics mMetrics; private final MouseCursorPlugin mMouseCursorPlugin; private FlutterNativeView mNativeView; private final SurfaceHolder.Callback mSurfaceCallback; private final TextInputPlugin mTextInputPlugin; private final NavigationChannel navigationChannel; private final AtomicLong nextTextureId; private final AccessibilityBridge.OnAccessibilityChangeListener onAccessibilityChangeListener; private final PlatformChannel platformChannel; private final SettingsChannel settingsChannel; private final SystemChannel systemChannel; public interface FirstFrameListener { void onFirstFrame(); } public interface Provider { FlutterView getFlutterView(); } /* access modifiers changed from: private */ public enum ZeroSides { NONE, LEFT, RIGHT, BOTH } private void postRun() { } /* access modifiers changed from: package-private */ public static final class ViewportMetrics { float devicePixelRatio = 1.0f; int physicalHeight = 0; int physicalTouchSlop = -1; int physicalViewInsetBottom = 0; int physicalViewInsetLeft = 0; int physicalViewInsetRight = 0; int physicalViewInsetTop = 0; int physicalViewPaddingBottom = 0; int physicalViewPaddingLeft = 0; int physicalViewPaddingRight = 0; int physicalViewPaddingTop = 0; int physicalWidth = 0; int systemGestureInsetBottom = 0; int systemGestureInsetLeft = 0; int systemGestureInsetRight = 0; int systemGestureInsetTop = 0; ViewportMetrics() { } } public FlutterView(Context context) { this(context, null); } public FlutterView(Context context, AttributeSet attributeSet) { this(context, attributeSet, null); } public FlutterView(Context context, AttributeSet attributeSet, FlutterNativeView flutterNativeView) { super(context, attributeSet); this.nextTextureId = new AtomicLong(0); this.mIsSoftwareRenderingEnabled = false; this.didRenderFirstFrame = false; this.onAccessibilityChangeListener = new AccessibilityBridge.OnAccessibilityChangeListener() { /* class io.flutter.view.FlutterView.AnonymousClass1 */ @Override // io.flutter.view.AccessibilityBridge.OnAccessibilityChangeListener public void onAccessibilityChanged(boolean z, boolean z2) { FlutterView.this.resetWillNotDraw(z, z2); } }; Activity activity = ViewUtils.getActivity(getContext()); if (activity != null) { if (flutterNativeView == null) { this.mNativeView = new FlutterNativeView(activity.getApplicationContext()); } else { this.mNativeView = flutterNativeView; } this.dartExecutor = this.mNativeView.getDartExecutor(); this.flutterRenderer = new FlutterRenderer(this.mNativeView.getFlutterJNI()); this.mIsSoftwareRenderingEnabled = this.mNativeView.getFlutterJNI().getIsSoftwareRenderingEnabled(); this.mMetrics = new ViewportMetrics(); this.mMetrics.devicePixelRatio = context.getResources().getDisplayMetrics().density; this.mMetrics.physicalTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); setFocusable(true); setFocusableInTouchMode(true); this.mNativeView.attachViewAndActivity(this, activity); this.mSurfaceCallback = new SurfaceHolder.Callback() { /* class io.flutter.view.FlutterView.AnonymousClass2 */ public void surfaceCreated(SurfaceHolder surfaceHolder) { FlutterView.this.assertAttached(); FlutterView.this.mNativeView.getFlutterJNI().onSurfaceCreated(surfaceHolder.getSurface()); } public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) { FlutterView.this.assertAttached(); FlutterView.this.mNativeView.getFlutterJNI().onSurfaceChanged(i2, i3); } public void surfaceDestroyed(SurfaceHolder surfaceHolder) { FlutterView.this.assertAttached(); FlutterView.this.mNativeView.getFlutterJNI().onSurfaceDestroyed(); } }; getHolder().addCallback(this.mSurfaceCallback); this.mActivityLifecycleListeners = new ArrayList(); this.mFirstFrameListeners = new ArrayList(); this.navigationChannel = new NavigationChannel(this.dartExecutor); this.keyEventChannel = new KeyEventChannel(this.dartExecutor); this.lifecycleChannel = new LifecycleChannel(this.dartExecutor); this.localizationChannel = new LocalizationChannel(this.dartExecutor); this.platformChannel = new PlatformChannel(this.dartExecutor); this.systemChannel = new SystemChannel(this.dartExecutor); this.settingsChannel = new SettingsChannel(this.dartExecutor); final PlatformPlugin platformPlugin = new PlatformPlugin(activity, this.platformChannel); addActivityLifecycleListener(new ActivityLifecycleListener() { /* class io.flutter.view.FlutterView.AnonymousClass3 */ @Override // io.flutter.plugin.common.ActivityLifecycleListener public void onPostResume() { platformPlugin.updateSystemUiOverlays(); } }); this.mImm = (InputMethodManager) getContext().getSystemService("input_method"); PlatformViewsController platformViewsController = this.mNativeView.getPluginRegistry().getPlatformViewsController(); this.mTextInputPlugin = new TextInputPlugin(this, new TextInputChannel(this.dartExecutor), platformViewsController); this.mKeyboardManager = new KeyboardManager(this, this.mTextInputPlugin, new KeyChannelResponder[]{new KeyChannelResponder(this.keyEventChannel)}); if (Build.VERSION.SDK_INT >= 24) { this.mMouseCursorPlugin = new MouseCursorPlugin(this, new MouseCursorChannel(this.dartExecutor)); } else { this.mMouseCursorPlugin = null; } this.mLocalizationPlugin = new LocalizationPlugin(context, this.localizationChannel); this.androidTouchProcessor = new AndroidTouchProcessor(this.flutterRenderer, false); platformViewsController.attachToFlutterRenderer(this.flutterRenderer); this.mNativeView.getPluginRegistry().getPlatformViewsController().attachTextInputPlugin(this.mTextInputPlugin); this.mNativeView.getFlutterJNI().setLocalizationPlugin(this.mLocalizationPlugin); this.mLocalizationPlugin.sendLocalesToFlutter(getResources().getConfiguration()); sendUserPlatformSettingsToDart(); return; } throw new IllegalArgumentException("Bad context"); } @NonNull public DartExecutor getDartExecutor() { return this.dartExecutor; } public boolean dispatchKeyEvent(KeyEvent keyEvent) { Log.e(TAG, "dispatchKeyEvent: " + keyEvent.toString()); if (keyEvent.getAction() == 0 && keyEvent.getRepeatCount() == 0) { getKeyDispatcherState().startTracking(keyEvent, this); } else if (keyEvent.getAction() == 1) { getKeyDispatcherState().handleUpEvent(keyEvent); } if ((!isAttached() || !this.mKeyboardManager.handleEvent(keyEvent)) && !super.dispatchKeyEvent(keyEvent)) { return false; } return true; } public FlutterNativeView getFlutterNativeView() { return this.mNativeView; } public FlutterPluginRegistry getPluginRegistry() { return this.mNativeView.getPluginRegistry(); } public String getLookupKeyForAsset(String str) { return FlutterMain.getLookupKeyForAsset(str); } public String getLookupKeyForAsset(String str, String str2) { return FlutterMain.getLookupKeyForAsset(str, str2); } public void addActivityLifecycleListener(ActivityLifecycleListener activityLifecycleListener) { this.mActivityLifecycleListeners.add(activityLifecycleListener); } public void onStart() { this.lifecycleChannel.appIsInactive(); } public void onPause() { this.lifecycleChannel.appIsInactive(); } public void onPostResume() { for (ActivityLifecycleListener activityLifecycleListener : this.mActivityLifecycleListeners) { activityLifecycleListener.onPostResume(); } this.lifecycleChannel.appIsResumed(); } public void onStop() { this.lifecycleChannel.appIsPaused(); } public void onMemoryPressure() { this.mNativeView.getFlutterJNI().notifyLowMemoryWarning(); this.systemChannel.sendMemoryPressureWarning(); } public boolean hasRenderedFirstFrame() { return this.didRenderFirstFrame; } public void addFirstFrameListener(FirstFrameListener firstFrameListener) { this.mFirstFrameListeners.add(firstFrameListener); } public void removeFirstFrameListener(FirstFrameListener firstFrameListener) { this.mFirstFrameListeners.remove(firstFrameListener); } @Deprecated public void enableTransparentBackground() { Log.w(TAG, "FlutterView in the v1 embedding is always a SurfaceView and will cover accessibility highlights when transparent. Consider migrating to the v2 Android embedding. https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects"); setZOrderOnTop(true); getHolder().setFormat(-2); } public void disableTransparentBackground() { setZOrderOnTop(false); getHolder().setFormat(-1); } public void setInitialRoute(String str) { this.navigationChannel.setInitialRoute(str); } public void pushRoute(String str) { this.navigationChannel.pushRoute(str); } public void popRoute() { this.navigationChannel.popRoute(); } private void sendUserPlatformSettingsToDart() { this.settingsChannel.startMessage().setTextScaleFactor(getResources().getConfiguration().fontScale).setUse24HourFormat(DateFormat.is24HourFormat(getContext())).setPlatformBrightness((getResources().getConfiguration().uiMode & 48) == 32 ? SettingsChannel.PlatformBrightness.dark : SettingsChannel.PlatformBrightness.light).send(); } /* access modifiers changed from: protected */ public void onConfigurationChanged(Configuration configuration) { super.onConfigurationChanged(configuration); this.mLocalizationPlugin.sendLocalesToFlutter(configuration); sendUserPlatformSettingsToDart(); } /* access modifiers changed from: package-private */ public float getDevicePixelRatio() { return this.mMetrics.devicePixelRatio; } public FlutterNativeView detach() { if (!isAttached()) { return null; } getHolder().removeCallback(this.mSurfaceCallback); this.mNativeView.detachFromFlutterView(); FlutterNativeView flutterNativeView = this.mNativeView; this.mNativeView = null; return flutterNativeView; } public void destroy() { if (isAttached()) { getHolder().removeCallback(this.mSurfaceCallback); releaseAccessibilityNodeProvider(); this.mNativeView.destroy(); this.mNativeView = null; } } public InputConnection onCreateInputConnection(EditorInfo editorInfo) { return this.mTextInputPlugin.createInputConnection(this, this.mKeyboardManager, editorInfo); } public boolean checkInputConnectionProxy(View view) { return this.mNativeView.getPluginRegistry().getPlatformViewsController().checkInputConnectionProxy(view); } public void onProvideAutofillVirtualStructure(ViewStructure viewStructure, int i) { super.onProvideAutofillVirtualStructure(viewStructure, i); this.mTextInputPlugin.onProvideAutofillVirtualStructure(viewStructure, i); } @Override // android.view.View public void autofill(SparseArray<AutofillValue> sparseArray) { this.mTextInputPlugin.autofill(sparseArray); } public boolean onTouchEvent(MotionEvent motionEvent) { if (!isAttached()) { return super.onTouchEvent(motionEvent); } if (Build.VERSION.SDK_INT >= 21) { requestUnbufferedDispatch(motionEvent); } return this.androidTouchProcessor.onTouchEvent(motionEvent); } public boolean onHoverEvent(MotionEvent motionEvent) { if (!isAttached()) { return super.onHoverEvent(motionEvent); } return this.mAccessibilityNodeProvider.onAccessibilityHoverEvent(motionEvent); } public boolean onGenericMotionEvent(MotionEvent motionEvent) { if (isAttached() && this.androidTouchProcessor.onGenericMotionEvent(motionEvent)) { return true; } return super.onGenericMotionEvent(motionEvent); } /* access modifiers changed from: protected */ public void onSizeChanged(int i, int i2, int i3, int i4) { ViewportMetrics viewportMetrics = this.mMetrics; viewportMetrics.physicalWidth = i; viewportMetrics.physicalHeight = i2; updateViewportMetrics(); super.onSizeChanged(i, i2, i3, i4); } private ZeroSides calculateShouldZeroSides() { Context context = getContext(); int i = context.getResources().getConfiguration().orientation; int rotation = ((WindowManager) context.getSystemService("window")).getDefaultDisplay().getRotation(); if (i == 2) { if (rotation == 1) { return ZeroSides.RIGHT; } if (rotation == 3) { return Build.VERSION.SDK_INT >= 23 ? ZeroSides.LEFT : ZeroSides.RIGHT; } if (rotation == 0 || rotation == 2) { return ZeroSides.BOTH; } } return ZeroSides.NONE; } @RequiresApi(20) @TargetApi(20) private int guessBottomKeyboardInset(WindowInsets windowInsets) { if (((double) windowInsets.getSystemWindowInsetBottom()) < ((double) getRootView().getHeight()) * 0.18d) { return 0; } return windowInsets.getSystemWindowInsetBottom(); } @RequiresApi(20) @SuppressLint({"InlinedApi", "NewApi"}) @TargetApi(20) public final WindowInsets onApplyWindowInsets(WindowInsets windowInsets) { if (Build.VERSION.SDK_INT == 29) { Insets systemGestureInsets = windowInsets.getSystemGestureInsets(); this.mMetrics.systemGestureInsetTop = systemGestureInsets.top; this.mMetrics.systemGestureInsetRight = systemGestureInsets.right; this.mMetrics.systemGestureInsetBottom = systemGestureInsets.bottom; this.mMetrics.systemGestureInsetLeft = systemGestureInsets.left; } boolean z = true; int i = 0; boolean z2 = (getWindowSystemUiVisibility() & 4) == 0; if ((getWindowSystemUiVisibility() & 2) != 0) { z = false; } if (Build.VERSION.SDK_INT >= 30) { if (z) { i = 0 | WindowInsets.Type.navigationBars(); } if (z2) { i |= WindowInsets.Type.statusBars(); } Insets insets = windowInsets.getInsets(i); this.mMetrics.physicalViewPaddingTop = insets.top; this.mMetrics.physicalViewPaddingRight = insets.right; this.mMetrics.physicalViewPaddingBottom = insets.bottom; this.mMetrics.physicalViewPaddingLeft = insets.left; Insets insets2 = windowInsets.getInsets(WindowInsets.Type.ime()); this.mMetrics.physicalViewInsetTop = insets2.top; this.mMetrics.physicalViewInsetRight = insets2.right; this.mMetrics.physicalViewInsetBottom = insets2.bottom; this.mMetrics.physicalViewInsetLeft = insets2.left; Insets insets3 = windowInsets.getInsets(WindowInsets.Type.systemGestures()); this.mMetrics.systemGestureInsetTop = insets3.top; this.mMetrics.systemGestureInsetRight = insets3.right; this.mMetrics.systemGestureInsetBottom = insets3.bottom; this.mMetrics.systemGestureInsetLeft = insets3.left; DisplayCutout displayCutout = windowInsets.getDisplayCutout(); if (displayCutout != null) { Insets waterfallInsets = displayCutout.getWaterfallInsets(); ViewportMetrics viewportMetrics = this.mMetrics; viewportMetrics.physicalViewPaddingTop = Math.max(Math.max(viewportMetrics.physicalViewPaddingTop, waterfallInsets.top), displayCutout.getSafeInsetTop()); ViewportMetrics viewportMetrics2 = this.mMetrics; viewportMetrics2.physicalViewPaddingRight = Math.max(Math.max(viewportMetrics2.physicalViewPaddingRight, waterfallInsets.right), displayCutout.getSafeInsetRight()); ViewportMetrics viewportMetrics3 = this.mMetrics; viewportMetrics3.physicalViewPaddingBottom = Math.max(Math.max(viewportMetrics3.physicalViewPaddingBottom, waterfallInsets.bottom), displayCutout.getSafeInsetBottom()); ViewportMetrics viewportMetrics4 = this.mMetrics; viewportMetrics4.physicalViewPaddingLeft = Math.max(Math.max(viewportMetrics4.physicalViewPaddingLeft, waterfallInsets.left), displayCutout.getSafeInsetLeft()); } } else { ZeroSides zeroSides = ZeroSides.NONE; if (!z) { zeroSides = calculateShouldZeroSides(); } this.mMetrics.physicalViewPaddingTop = z2 ? windowInsets.getSystemWindowInsetTop() : 0; this.mMetrics.physicalViewPaddingRight = (zeroSides == ZeroSides.RIGHT || zeroSides == ZeroSides.BOTH) ? 0 : windowInsets.getSystemWindowInsetRight(); this.mMetrics.physicalViewPaddingBottom = (!z || guessBottomKeyboardInset(windowInsets) != 0) ? 0 : windowInsets.getSystemWindowInsetBottom(); this.mMetrics.physicalViewPaddingLeft = (zeroSides == ZeroSides.LEFT || zeroSides == ZeroSides.BOTH) ? 0 : windowInsets.getSystemWindowInsetLeft(); ViewportMetrics viewportMetrics5 = this.mMetrics; viewportMetrics5.physicalViewInsetTop = 0; viewportMetrics5.physicalViewInsetRight = 0; viewportMetrics5.physicalViewInsetBottom = guessBottomKeyboardInset(windowInsets); this.mMetrics.physicalViewInsetLeft = 0; } updateViewportMetrics(); return super.onApplyWindowInsets(windowInsets); } /* access modifiers changed from: protected */ public boolean fitSystemWindows(Rect rect) { if (Build.VERSION.SDK_INT > 19) { return super.fitSystemWindows(rect); } this.mMetrics.physicalViewPaddingTop = rect.top; this.mMetrics.physicalViewPaddingRight = rect.right; ViewportMetrics viewportMetrics = this.mMetrics; viewportMetrics.physicalViewPaddingBottom = 0; viewportMetrics.physicalViewPaddingLeft = rect.left; ViewportMetrics viewportMetrics2 = this.mMetrics; viewportMetrics2.physicalViewInsetTop = 0; viewportMetrics2.physicalViewInsetRight = 0; viewportMetrics2.physicalViewInsetBottom = rect.bottom; this.mMetrics.physicalViewInsetLeft = 0; updateViewportMetrics(); return true; } private boolean isAttached() { FlutterNativeView flutterNativeView = this.mNativeView; return flutterNativeView != null && flutterNativeView.isAttached(); } /* access modifiers changed from: package-private */ public void assertAttached() { if (!isAttached()) { throw new AssertionError("Platform view is not attached"); } } private void preRun() { resetAccessibilityTree(); } /* access modifiers changed from: package-private */ public void resetAccessibilityTree() { AccessibilityBridge accessibilityBridge = this.mAccessibilityNodeProvider; if (accessibilityBridge != null) { accessibilityBridge.reset(); } } public void runFromBundle(FlutterRunArguments flutterRunArguments) { assertAttached(); preRun(); this.mNativeView.runFromBundle(flutterRunArguments); postRun(); } public Bitmap getBitmap() { assertAttached(); return this.mNativeView.getFlutterJNI().getBitmap(); } private void updateViewportMetrics() { if (isAttached()) { this.mNativeView.getFlutterJNI().setViewportMetrics(this.mMetrics.devicePixelRatio, this.mMetrics.physicalWidth, this.mMetrics.physicalHeight, this.mMetrics.physicalViewPaddingTop, this.mMetrics.physicalViewPaddingRight, this.mMetrics.physicalViewPaddingBottom, this.mMetrics.physicalViewPaddingLeft, this.mMetrics.physicalViewInsetTop, this.mMetrics.physicalViewInsetRight, this.mMetrics.physicalViewInsetBottom, this.mMetrics.physicalViewInsetLeft, this.mMetrics.systemGestureInsetTop, this.mMetrics.systemGestureInsetRight, this.mMetrics.systemGestureInsetBottom, this.mMetrics.systemGestureInsetLeft, this.mMetrics.physicalTouchSlop); } } public void onFirstFrame() { this.didRenderFirstFrame = true; for (FirstFrameListener firstFrameListener : new ArrayList(this.mFirstFrameListeners)) { firstFrameListener.onFirstFrame(); } } /* access modifiers changed from: protected */ public void onAttachedToWindow() { super.onAttachedToWindow(); this.mAccessibilityNodeProvider = new AccessibilityBridge(this, new AccessibilityChannel(this.dartExecutor, getFlutterNativeView().getFlutterJNI()), (AccessibilityManager) getContext().getSystemService("accessibility"), getContext().getContentResolver(), getPluginRegistry().getPlatformViewsController()); this.mAccessibilityNodeProvider.setOnAccessibilityChangeListener(this.onAccessibilityChangeListener); resetWillNotDraw(this.mAccessibilityNodeProvider.isAccessibilityEnabled(), this.mAccessibilityNodeProvider.isTouchExplorationEnabled()); } /* access modifiers changed from: protected */ public void onDetachedFromWindow() { super.onDetachedFromWindow(); releaseAccessibilityNodeProvider(); } /* access modifiers changed from: private */ /* access modifiers changed from: public */ private void resetWillNotDraw(boolean z, boolean z2) { boolean z3 = false; if (!this.mIsSoftwareRenderingEnabled) { if (!z && !z2) { z3 = true; } setWillNotDraw(z3); return; } setWillNotDraw(false); } public AccessibilityNodeProvider getAccessibilityNodeProvider() { AccessibilityBridge accessibilityBridge = this.mAccessibilityNodeProvider; if (accessibilityBridge == null || !accessibilityBridge.isAccessibilityEnabled()) { return null; } return this.mAccessibilityNodeProvider; } private void releaseAccessibilityNodeProvider() { AccessibilityBridge accessibilityBridge = this.mAccessibilityNodeProvider; if (accessibilityBridge != null) { accessibilityBridge.release(); this.mAccessibilityNodeProvider = null; } } @Override // io.flutter.plugin.mouse.MouseCursorPlugin.MouseCursorViewDelegate @NonNull @RequiresApi(24) @TargetApi(24) public PointerIcon getSystemPointerIcon(int i) { return PointerIcon.getSystemIcon(getContext(), i); } @Override // io.flutter.plugin.common.BinaryMessenger @UiThread public void send(String str, ByteBuffer byteBuffer) { send(str, byteBuffer, null); } @Override // io.flutter.plugin.common.BinaryMessenger @UiThread public void send(String str, ByteBuffer byteBuffer, BinaryMessenger.BinaryReply binaryReply) { if (!isAttached()) { Log.d(TAG, "FlutterView.send called on a detached view, channel=" + str); return; } this.mNativeView.send(str, byteBuffer, binaryReply); } @Override // io.flutter.plugin.common.BinaryMessenger @UiThread public void setMessageHandler(String str, BinaryMessenger.BinaryMessageHandler binaryMessageHandler) { this.mNativeView.setMessageHandler(str, binaryMessageHandler); } @Override // io.flutter.view.TextureRegistry public TextureRegistry.SurfaceTextureEntry createSurfaceTexture() { SurfaceTexture surfaceTexture = new SurfaceTexture(0); surfaceTexture.detachFromGLContext(); SurfaceTextureRegistryEntry surfaceTextureRegistryEntry = new SurfaceTextureRegistryEntry(this.nextTextureId.getAndIncrement(), surfaceTexture); this.mNativeView.getFlutterJNI().registerTexture(surfaceTextureRegistryEntry.id(), surfaceTextureRegistryEntry.textureWrapper()); return surfaceTextureRegistryEntry; } final class SurfaceTextureRegistryEntry implements TextureRegistry.SurfaceTextureEntry { private final long id; private SurfaceTexture.OnFrameAvailableListener onFrameListener = new SurfaceTexture.OnFrameAvailableListener() { /* class io.flutter.view.FlutterView.SurfaceTextureRegistryEntry.AnonymousClass1 */ public void onFrameAvailable(SurfaceTexture surfaceTexture) { if (!SurfaceTextureRegistryEntry.this.released && FlutterView.this.mNativeView != null) { FlutterView.this.mNativeView.getFlutterJNI().markTextureFrameAvailable(SurfaceTextureRegistryEntry.this.id); } } }; private boolean released; private final SurfaceTextureWrapper textureWrapper; SurfaceTextureRegistryEntry(long j, SurfaceTexture surfaceTexture) { this.id = j; this.textureWrapper = new SurfaceTextureWrapper(surfaceTexture); if (Build.VERSION.SDK_INT >= 21) { surfaceTexture().setOnFrameAvailableListener(this.onFrameListener, new Handler()); } else { surfaceTexture().setOnFrameAvailableListener(this.onFrameListener); } } public SurfaceTextureWrapper textureWrapper() { return this.textureWrapper; } @Override // io.flutter.view.TextureRegistry.SurfaceTextureEntry public SurfaceTexture surfaceTexture() { return this.textureWrapper.surfaceTexture(); } @Override // io.flutter.view.TextureRegistry.SurfaceTextureEntry public long id() { return this.id; } @Override // io.flutter.view.TextureRegistry.SurfaceTextureEntry public void release() { if (!this.released) { this.released = true; surfaceTexture().setOnFrameAvailableListener(null); this.textureWrapper.release(); FlutterView.this.mNativeView.getFlutterJNI().unregisterTexture(this.id); } } } }