From 1592acd4a9ffc747feff1cfe50b9ba89ff820e2f Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Fri, 29 Mar 2019 01:12:18 -0700 Subject: [PATCH] Small changes to State objects to support Android Summary: Small changes to State objects to support Android. See following diffs. Reviewed By: mdvacca Differential Revision: D14663470 fbshipit-source-id: 878f4dc39265991a7b8ff54ca80bdb862f1dd3de --- ReactCommon/fabric/core/state/ConcreteState.h | 11 +++++++ ReactCommon/fabric/core/state/State.cpp | 19 ++++++++++++ ReactCommon/fabric/core/state/State.h | 6 ++++ ReactCommon/fabric/core/state/StateData.cpp | 30 +++++++++++++++++++ ReactCommon/fabric/core/state/StateData.h | 23 ++++++++++++-- 5 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 ReactCommon/fabric/core/state/StateData.cpp diff --git a/ReactCommon/fabric/core/state/ConcreteState.h b/ReactCommon/fabric/core/state/ConcreteState.h index 3cb378835bc..6e64e04affa 100644 --- a/ReactCommon/fabric/core/state/ConcreteState.h +++ b/ReactCommon/fabric/core/state/ConcreteState.h @@ -27,6 +27,8 @@ class ConcreteState : public State { using Shared = std::shared_ptr; using Data = DataT; + virtual ~ConcreteState() = default; + ConcreteState(Data &&data, StateCoordinator::Shared stateCoordinator) : State(std::move(stateCoordinator)), data_(std::move(data)) {} @@ -80,6 +82,15 @@ class ConcreteState : public State { priority); } +#ifdef ANDROID + const folly::dynamic getDynamic() const override { + return data_.getDynamic(); + } + void updateState(folly::dynamic data) const override { + updateState(std::move(Data(data))); + } +#endif + private: DataT data_; }; diff --git a/ReactCommon/fabric/core/state/State.cpp b/ReactCommon/fabric/core/state/State.cpp index fb9740bfed1..9aa4b248112 100644 --- a/ReactCommon/fabric/core/state/State.cpp +++ b/ReactCommon/fabric/core/state/State.cpp @@ -7,11 +7,16 @@ #include "State.h" +#include #include #include #include #include +#ifdef ANDROID +#include +#endif + namespace facebook { namespace react { @@ -26,5 +31,19 @@ const State::Shared &State::getCommitedState() const { return stateCoordinator_->getTarget().getShadowNode().getState(); } +#ifdef ANDROID +const folly::dynamic State::getDynamic() const { + LOG(FATAL) + << "State::getDynamic should never be called (some virtual method of a concrete implementation should be called instead)"; + abort(); + return folly::dynamic::object(); +} +void State::updateState(folly::dynamic data) const { + LOG(FATAL) + << "State::updateState should never be called (some virtual method of a concrete implementation should be called instead)."; + abort(); +} +#endif + } // namespace react } // namespace facebook diff --git a/ReactCommon/fabric/core/state/State.h b/ReactCommon/fabric/core/state/State.h index 73769c02030..729645850d6 100644 --- a/ReactCommon/fabric/core/state/State.h +++ b/ReactCommon/fabric/core/state/State.h @@ -7,6 +7,7 @@ #pragma once +#include #include namespace facebook { @@ -26,6 +27,11 @@ class State { State(StateCoordinator::Shared stateCoordinator); virtual ~State() = default; +#ifdef ANDROID + virtual const folly::dynamic getDynamic() const; + virtual void updateState(folly::dynamic data) const; +#endif + protected: StateCoordinator::Shared stateCoordinator_; diff --git a/ReactCommon/fabric/core/state/StateData.cpp b/ReactCommon/fabric/core/state/StateData.cpp new file mode 100644 index 00000000000..44f2744e10d --- /dev/null +++ b/ReactCommon/fabric/core/state/StateData.cpp @@ -0,0 +1,30 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "StateData.h" + +#ifdef ANDROID +#include +#endif + +namespace facebook { +namespace react { + +#ifdef ANDROID +StateData::~StateData() { + // This needs to be here or the linker will complain: + // https://gcc.gnu.org/wiki/VerboseDiagnostics#missing_vtable +} +const folly::dynamic StateData::getDynamic() const { + assert(false); // TODO: get rid of this? + return folly::dynamic::object(); +} + +#endif + +} // namespace react +} // namespace facebook diff --git a/ReactCommon/fabric/core/state/StateData.h b/ReactCommon/fabric/core/state/StateData.h index f9ef2523dd1..32b026cfd18 100644 --- a/ReactCommon/fabric/core/state/StateData.h +++ b/ReactCommon/fabric/core/state/StateData.h @@ -9,15 +9,32 @@ #include +#ifdef ANDROID +#include +#endif + namespace facebook { namespace react { /* - * Dummy type that is used as a placeholder for state data for nodes that - * don't have a state. + * Base class for state data. + * Must be used to provide getDynamic for Android. */ -struct StateData { +class StateData { + public: using Shared = std::shared_ptr; + + StateData() {} + +#ifdef ANDROID + StateData(folly::dynamic data) {} + + // Destructor must either be virtual or protected if we have any + // virtual methods + virtual ~StateData(); + + virtual const folly::dynamic getDynamic() const; +#endif }; } // namespace react