Work around some Views not using ThemedReactContext

Summary:
ThemedReactContext should be what is stored as the context on all RN views, but some legacy components use other things like an Activity.

Changelog: [Internal]

Reviewed By: cortinico

Differential Revision: D37356865

fbshipit-source-id: bc914cd06a8846037506a50f254995a6e10c8a9c
This commit is contained in:
Joshua Gross 2022-06-22 14:28:08 -07:00 коммит произвёл Facebook GitHub Bot
Родитель 97291bfa31
Коммит 777a92de2f
1 изменённых файлов: 22 добавлений и 1 удалений

Просмотреть файл

@ -11,6 +11,7 @@ import android.content.Context;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.facebook.common.logging.FLog;
import com.facebook.react.bridge.BaseJavaModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReadableArray;
@ -36,6 +37,8 @@ import java.util.Stack;
public abstract class ViewManager<T extends View, C extends ReactShadowNode>
extends BaseJavaModule {
private static String NAME = ViewManager.class.getSimpleName();
/**
* For View recycling: we store a Stack of unused, dead Views. This is null by default, and when
* null signals that View Recycling is disabled. `enableViewRecycling` must be explicitly called
@ -199,8 +202,26 @@ public abstract class ViewManager<T extends View, C extends ReactShadowNode>
* {@link ViewManager} subclass.
*/
public void onDropViewInstance(@NonNull T view) {
// Some legacy components will return an Activity here instead of a ThemedReactContext
Context viewContext = view.getContext();
if (viewContext == null) {
// Who knows! Anything is possible. Checking instanceof on null is an NPE,
// So this is not redundant.
FLog.e(NAME, "onDropViewInstance: view [" + view.getId() + "] has a null context");
return;
}
if (!(viewContext instanceof ThemedReactContext)) {
FLog.e(
NAME,
"onDropViewInstance: view ["
+ view.getId()
+ "] has a context that is not a ThemedReactContext: "
+ viewContext);
return;
}
// View recycling
ThemedReactContext themedReactContext = (ThemedReactContext) view.getContext();
ThemedReactContext themedReactContext = (ThemedReactContext) viewContext;
int surfaceId = themedReactContext.getSurfaceId();
@Nullable Stack<T> recyclableViews = getRecyclableViewStack(surfaceId);