1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Android: Refactor lifecycle callbacks to reduce repetition in lifecycle listener registration

This commit is contained in:
reuk 2025-07-28 12:52:16 +01:00
parent 11752d061f
commit 1c2eb2d056
No known key found for this signature in database
7 changed files with 56 additions and 137 deletions

View file

@ -429,7 +429,22 @@ void juce_dispatchDelete (JNIEnv*, jobject /*object*/, jlong host)
}
//==============================================================================
jobject ActivityLifecycleCallbacks::invoke (jobject proxy, jobject method, jobjectArray args)
ActivityLifecycleCallbackForwarder::ActivityLifecycleCallbackForwarder (GlobalRef ctx, ActivityLifecycleCallbacks* cb)
: appContext (ctx),
myself (CreateJavaInterface (this, "android/app/Application$ActivityLifecycleCallbacks")),
callbacks (cb)
{
if (appContext != nullptr && myself != nullptr)
getEnv()->CallVoidMethod (appContext, AndroidApplication.registerActivityLifecycleCallbacks, myself.get());
}
ActivityLifecycleCallbackForwarder::~ActivityLifecycleCallbackForwarder()
{
if (appContext != nullptr && myself != nullptr)
getEnv()->CallVoidMethod (appContext, AndroidApplication.unregisterActivityLifecycleCallbacks, myself.get());
}
jobject ActivityLifecycleCallbackForwarder::invoke (jobject proxy, jobject method, jobjectArray args)
{
auto* env = getEnv();
@ -475,7 +490,7 @@ jobject ActivityLifecycleCallbacks::invoke (jobject proxy, jobject method, jobje
const auto activity = env->GetArrayLength (args) > 0 ? env->GetObjectArrayElement (args, 0) : (jobject) nullptr;
const auto bundle = env->GetArrayLength (args) > 1 ? env->GetObjectArrayElement (args, 1) : (jobject) nullptr;
(iter->second) (*this, activity, bundle);
(iter->second) (*callbacks, activity, bundle);
return nullptr;
}

View file

@ -1016,9 +1016,11 @@ LocalRef<jobject> CreateJavaInterface (AndroidInterfaceImplementer* implementer,
const String& interfaceName);
//==============================================================================
class ActivityLifecycleCallbacks : public AndroidInterfaceImplementer
class ActivityLifecycleCallbacks
{
public:
virtual ~ActivityLifecycleCallbacks() = default;
virtual void onActivityPreCreated (jobject /*activity*/, jobject /*bundle*/) {}
virtual void onActivityPreDestroyed (jobject /*activity*/) {}
virtual void onActivityPrePaused (jobject /*activity*/) {}
@ -1044,15 +1046,27 @@ public:
virtual void onActivityPostStopped (jobject /*activity*/) {}
virtual void onActivityConfigurationChanged (jobject /*activity*/) {}
};
class ActivityLifecycleCallbackForwarder : private AndroidInterfaceImplementer
{
public:
ActivityLifecycleCallbackForwarder (GlobalRef appContext, ActivityLifecycleCallbacks* callbacks);
~ActivityLifecycleCallbackForwarder() override;
private:
jobject invoke (jobject, jobject, jobjectArray) override;
GlobalRef appContext;
GlobalRef myself;
ActivityLifecycleCallbacks* callbacks = nullptr;
};
//==============================================================================
struct SurfaceHolderCallback : AndroidInterfaceImplementer
struct SurfaceHolderCallback : public AndroidInterfaceImplementer
{
virtual ~SurfaceHolderCallback() override = default;
~SurfaceHolderCallback() override = default;
virtual void surfaceChanged (LocalRef<jobject> holder, int format, int width, int height) = 0;
virtual void surfaceCreated (LocalRef<jobject> holder) = 0;

View file

@ -111,33 +111,9 @@ class JuceActivityWatcher final : public ActivityLifecycleCallbacks
public:
JuceActivityWatcher()
{
LocalRef<jobject> appContext (getAppContext());
if (appContext != nullptr)
{
auto* env = getEnv();
myself = GlobalRef (CreateJavaInterface (this, "android/app/Application$ActivityLifecycleCallbacks"));
env->CallVoidMethod (appContext.get(), AndroidApplication.registerActivityLifecycleCallbacks, myself.get());
}
checkActivityIsMain (androidApkContext);
}
~JuceActivityWatcher() override
{
LocalRef<jobject> appContext (getAppContext());
if (appContext != nullptr && myself != nullptr)
{
auto* env = getEnv();
env->CallVoidMethod (appContext.get(), AndroidApplication.unregisterActivityLifecycleCallbacks, myself.get());
clear();
myself.clear();
}
}
void onActivityStarted (jobject activity) override
{
auto* env = getEnv();
@ -273,10 +249,10 @@ private:
return mainActivityClassPath;
}
GlobalRef myself;
CriticalSection currentActivityLock;
jweak currentActivity = nullptr;
jweak mainActivity = nullptr;
ActivityLifecycleCallbackForwarder forwarder { GlobalRef { getAppContext() }, this };
};
//==============================================================================