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:
parent
11752d061f
commit
1c2eb2d056
7 changed files with 56 additions and 137 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 };
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue