| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/testing/android/native_activity/native_activity.h" |
| |
| #include "flutter/fml/message_loop.h" |
| |
| namespace flutter { |
| |
| NativeActivity::NativeActivity(ANativeActivity* activity) |
| : activity_(activity) { |
| fml::MessageLoop::EnsureInitializedForCurrentThread(); |
| |
| activity->instance = this; |
| |
| activity->callbacks->onStart = [](ANativeActivity* activity) { |
| reinterpret_cast<NativeActivity*>(activity->instance)->OnStart(); |
| }; |
| activity->callbacks->onStop = [](ANativeActivity* activity) { |
| reinterpret_cast<NativeActivity*>(activity->instance)->OnStop(); |
| }; |
| activity->callbacks->onPause = [](ANativeActivity* activity) { |
| reinterpret_cast<NativeActivity*>(activity->instance)->OnPause(); |
| }; |
| activity->callbacks->onResume = [](ANativeActivity* activity) { |
| reinterpret_cast<NativeActivity*>(activity->instance)->OnResume(); |
| }; |
| activity->callbacks->onDestroy = [](ANativeActivity* activity) { |
| delete reinterpret_cast<NativeActivity*>(activity->instance); |
| }; |
| activity->callbacks->onSaveInstanceState = [](ANativeActivity* activity, |
| size_t* out_size) -> void* { |
| auto mapping = reinterpret_cast<NativeActivity*>(activity->instance) |
| ->OnSaveInstanceState(); |
| if (mapping == nullptr || mapping->GetMapping() == nullptr) { |
| *out_size = 0; |
| return nullptr; |
| } |
| |
| // This will be `free`d by the framework. |
| auto copied = malloc(mapping->GetSize()); |
| FML_CHECK(copied != nullptr) |
| << "Allocation failure while saving instance state."; |
| memcpy(copied, mapping->GetMapping(), mapping->GetSize()); |
| *out_size = mapping->GetSize(); |
| return copied; |
| }; |
| activity->callbacks->onWindowFocusChanged = [](ANativeActivity* activity, |
| int has_focus) { |
| reinterpret_cast<NativeActivity*>(activity->instance) |
| ->OnWindowFocusChanged(has_focus); |
| }; |
| activity->callbacks->onNativeWindowCreated = [](ANativeActivity* activity, |
| ANativeWindow* window) { |
| reinterpret_cast<NativeActivity*>(activity->instance) |
| ->OnNativeWindowCreated(window); |
| }; |
| activity->callbacks->onNativeWindowResized = [](ANativeActivity* activity, |
| ANativeWindow* window) { |
| reinterpret_cast<NativeActivity*>(activity->instance) |
| ->OnNativeWindowResized(window); |
| }; |
| activity->callbacks->onNativeWindowRedrawNeeded = |
| [](ANativeActivity* activity, ANativeWindow* window) { |
| reinterpret_cast<NativeActivity*>(activity->instance) |
| ->OnNativeWindowRedrawNeeded(window); |
| }; |
| activity->callbacks->onNativeWindowDestroyed = [](ANativeActivity* activity, |
| ANativeWindow* window) { |
| reinterpret_cast<NativeActivity*>(activity->instance) |
| ->OnNativeWindowDestroyed(window); |
| }; |
| activity->callbacks->onInputQueueCreated = [](ANativeActivity* activity, |
| AInputQueue* queue) { |
| reinterpret_cast<NativeActivity*>(activity->instance) |
| ->OnInputQueueCreated(queue); |
| }; |
| activity->callbacks->onInputQueueDestroyed = [](ANativeActivity* activity, |
| AInputQueue* queue) { |
| reinterpret_cast<NativeActivity*>(activity->instance) |
| ->OnInputQueueDestroyed(queue); |
| }; |
| activity->callbacks->onConfigurationChanged = [](ANativeActivity* activity) { |
| reinterpret_cast<NativeActivity*>(activity->instance) |
| ->OnConfigurationChanged(); |
| }; |
| activity->callbacks->onLowMemory = [](ANativeActivity* activity) { |
| reinterpret_cast<NativeActivity*>(activity->instance)->OnLowMemory(); |
| }; |
| } |
| |
| NativeActivity::~NativeActivity() = default; |
| |
| void NativeActivity::OnStart() {} |
| |
| void NativeActivity::OnStop() {} |
| |
| void NativeActivity::OnPause() {} |
| |
| void NativeActivity::OnResume() {} |
| |
| std::shared_ptr<fml::Mapping> NativeActivity::OnSaveInstanceState() { |
| return nullptr; |
| } |
| |
| void NativeActivity::OnWindowFocusChanged(bool has_focus) {} |
| |
| void NativeActivity::OnNativeWindowCreated(ANativeWindow* window) {} |
| |
| void NativeActivity::OnNativeWindowResized(ANativeWindow* window) {} |
| |
| void NativeActivity::OnNativeWindowRedrawNeeded(ANativeWindow* window) {} |
| |
| void NativeActivity::OnNativeWindowDestroyed(ANativeWindow* window) {} |
| |
| void NativeActivity::OnInputQueueCreated(AInputQueue* queue) {} |
| |
| void NativeActivity::OnInputQueueDestroyed(AInputQueue* queue) {} |
| |
| void NativeActivity::OnConfigurationChanged() {} |
| |
| void NativeActivity::OnLowMemory() {} |
| |
| void NativeActivity::Terminate() { |
| ANativeActivity_finish(activity_); |
| } |
| |
| } // namespace flutter |
| |
| extern "C" __attribute__((visibility("default"))) void ANativeActivity_onCreate( |
| ANativeActivity* activity, |
| void* saved_state, |
| size_t saved_state_size) { |
| std::unique_ptr<fml::Mapping> saved_state_mapping; |
| if (saved_state_size > 0u) { |
| saved_state_mapping = std::make_unique<fml::MallocMapping>( |
| fml::MallocMapping::Copy(saved_state, saved_state_size)); |
| } |
| flutter::NativeActivityMain(activity, std::move(saved_state_mapping)) |
| .release(); // Will be freed when the frame calls the onDestroy. See the |
| // delete in that callback. |
| } |