#pragma once #include #include #include #include #include #include "ActivityManager.h" // for using the ActivityManager singleton #include "ActivityResult.h" #include "GfxRenderer.h" #include "MappedInputManager.h" #include "RenderLock.h" class Activity { protected: std::string name; GfxRenderer& renderer; MappedInputManager& mappedInput; public: ActivityResultHandler resultHandler; ActivityResult result; explicit Activity(std::string name, GfxRenderer& renderer, MappedInputManager& mappedInput) : name(std::move(name)), renderer(renderer), mappedInput(mappedInput) {} virtual ~Activity() = default; virtual void onEnter(); virtual void onExit(); virtual void loop() {} virtual void render(RenderLock&&) {} // If immediate is true, the update will be triggered immediately. // Otherwise, it will be deferred until the end of the current loop iteration. virtual void requestUpdate(bool immediate = false); // Request an immediate render and block until it completes. virtual void requestUpdateAndWait(); virtual bool skipLoopDelay() { return false; } virtual bool preventAutoSleep() { return false; } virtual bool isReaderActivity() const { return false; } // Start a new activity without destroying the current one // Note: requestUpdate() will be invoked automatically once resultHandler finishes void startActivityForResult(std::unique_ptr&& activity, ActivityResultHandler resultHandler); // Set the result to be passed back to the previous activity when this activity finishes void setResult(ActivityResult&& result); // Finish this activity and return to the previous one on the stack (if any) void finish(); // Convenience method to facilitate API transition to ActivityManager // TODO: remove this in near future void onGoHome(); void onSelectBook(const std::string& path); };