The open source OpenXR runtime

a/android: Add ActivityLifecycleListener class

Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/1655>

authored by

Jarvis Huang and committed by
Rylie Pavlik
84efd4d6 449016be

+195
+6
src/xrt/auxiliary/android/org.freedesktop.monado.auxiliary.cpp
··· 32 32 getDisplayModeIdHeight( 33 33 classRef().getStaticMethod("getDisplayModeIdHeight", "(Landroid/content/Context;II)I")) 34 34 {} 35 + 36 + ActivityLifecycleListener::Meta::Meta(jni::jclass clazz) 37 + : MetaBase(ActivityLifecycleListener::getTypeName(), clazz), init(classRef().getMethod("<init>", "(J)V")), 38 + registerCallback(classRef().getMethod("registerCallback", "(Landroid/app/Activity;)V")), 39 + unregisterCallback(classRef().getMethod("unregisterCallback", "(Landroid/app/Activity;)V")) 40 + {} 35 41 } // namespace org::freedesktop::monado::auxiliary 36 42 } // namespace wrap
+87
src/xrt/auxiliary/android/org.freedesktop.monado.auxiliary.hpp
··· 213 213 }; 214 214 }; 215 215 216 + class ActivityLifecycleListener : public ObjectWrapperBase 217 + { 218 + public: 219 + using ObjectWrapperBase::ObjectWrapperBase; 220 + static constexpr const char * 221 + getTypeName() noexcept 222 + { 223 + return "org/freedesktop/monado/auxiliary/ActivityLifecycleListener"; 224 + } 225 + 226 + static constexpr const char * 227 + getFullyQualifiedTypeName() noexcept 228 + { 229 + return "org.freedesktop.monado.auxiliary.ActivityLifecycleListener"; 230 + } 231 + 232 + /*! 233 + * Initialize the static metadata of this wrapper with a known 234 + * (non-null) Java class. 235 + */ 236 + static void 237 + staticInitClass(jni::jclass clazz) 238 + { 239 + Meta::data(clazz); 240 + } 241 + 242 + /*! 243 + * Wrapper for a constructor 244 + * 245 + * Java prototype: 246 + * `public org.freedesktop.monado.auxiliary.ActivityLifecycleListener(long);` 247 + * 248 + * JNI signature: (J)V 249 + * 250 + */ 251 + static ActivityLifecycleListener 252 + construct(void *nativePointer); 253 + 254 + /*! 255 + * Wrapper for the registerCallback method 256 + * 257 + * Java prototype: 258 + * `public void registerCallback(android.app.Activity);` 259 + * 260 + * JNI signature: (Landroid/app/Activity;)V 261 + * 262 + */ 263 + void 264 + registerCallback(android::app::Activity const &activity); 265 + 266 + /*! 267 + * Wrapper for the unregisterCallback method 268 + * 269 + * Java prototype: 270 + * `public void unregisterCallback(android.app.Activity);` 271 + * 272 + * JNI signature: (Landroid/app/Activity;)V 273 + * 274 + */ 275 + void 276 + unregisterCallback(android::app::Activity const &activity); 277 + 278 + /*! 279 + * Class metadata 280 + */ 281 + struct Meta : public MetaBase 282 + { 283 + jni::method_t init; 284 + jni::method_t registerCallback; 285 + jni::method_t unregisterCallback; 286 + 287 + /*! 288 + * Singleton accessor 289 + */ 290 + static Meta & 291 + data(jni::jclass clazz = nullptr) 292 + { 293 + static Meta instance{clazz}; 294 + return instance; 295 + } 296 + 297 + private: 298 + explicit Meta(jni::jclass clazz); 299 + }; 300 + }; 301 + 216 302 } // namespace org::freedesktop::monado::auxiliary 217 303 } // namespace wrap 304 + 218 305 #include "org.freedesktop.monado.auxiliary.impl.hpp"
+18
src/xrt/auxiliary/android/org.freedesktop.monado.auxiliary.impl.hpp
··· 86 86 object().call<jni::Object>(Meta::data().waitGetSurfaceHolder, wait_ms)); 87 87 } 88 88 89 + inline ActivityLifecycleListener 90 + ActivityLifecycleListener::construct(void *nativePointer) 91 + { 92 + return ActivityLifecycleListener(Meta::data().clazz().newInstance( 93 + Meta::data().init, static_cast<long long>(reinterpret_cast<uintptr_t>(nativePointer)))); 94 + } 95 + 96 + inline void 97 + ActivityLifecycleListener::registerCallback(android::app::Activity const &activity) 98 + { 99 + object().call<void>(Meta::data().registerCallback, activity.object()); 100 + } 101 + 102 + inline void 103 + ActivityLifecycleListener::unregisterCallback(android::app::Activity const &activity) 104 + { 105 + object().call<void>(Meta::data().unregisterCallback, activity.object()); 106 + } 89 107 } // namespace org::freedesktop::monado::auxiliary 90 108 } // namespace wrap
+84
src/xrt/auxiliary/android/src/main/java/org/freedesktop/monado/auxiliary/ActivityLifecycleListener.kt
··· 1 + // Copyright 2022, Qualcomm Innovation Center, Inc. 2 + // SPDX-License-Identifier: BSL-1.0 3 + /*! 4 + * @file 5 + * @brief Class that listens to activity lifecycle change event. 6 + * @author Jarvis Huang 7 + * @ingroup aux_android_java 8 + */ 9 + package org.freedesktop.monado.auxiliary 10 + 11 + import android.app.Activity 12 + import android.app.Application 13 + import android.os.Bundle 14 + import android.util.Log 15 + import androidx.annotation.Keep 16 + 17 + /** Monitor activity lifecycle of application. */ 18 + @Keep 19 + class ActivityLifecycleListener(private val nativePtr: Long) : 20 + Application.ActivityLifecycleCallbacks { 21 + 22 + /** Register callback with [Application] from given [activity] object. */ 23 + fun registerCallback(activity: Activity) { 24 + activity.application.registerActivityLifecycleCallbacks(this) 25 + } 26 + 27 + /** Unregister callback with [Application] from given [activity] object. */ 28 + fun unregisterCallback(activity: Activity) { 29 + activity.application.unregisterActivityLifecycleCallbacks(this) 30 + } 31 + 32 + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { 33 + Log.i(TAG, "$activity onActivityCreated") 34 + nativeOnActivityCreated(nativePtr, activity) 35 + } 36 + 37 + override fun onActivityStarted(activity: Activity) { 38 + Log.i(TAG, "$activity onActivityStarted") 39 + nativeOnActivityStarted(nativePtr, activity) 40 + } 41 + 42 + override fun onActivityResumed(activity: Activity) { 43 + Log.i(TAG, "$activity onActivityResumed") 44 + nativeOnActivityResumed(nativePtr, activity) 45 + } 46 + 47 + override fun onActivityPaused(activity: Activity) { 48 + Log.i(TAG, "$activity onActivityPaused") 49 + nativeOnActivityPaused(nativePtr, activity) 50 + } 51 + 52 + override fun onActivityStopped(activity: Activity) { 53 + Log.i(TAG, "$activity onActivityStopped") 54 + nativeOnActivityStopped(nativePtr, activity) 55 + } 56 + 57 + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { 58 + Log.i(TAG, "$activity onActivitySaveInstanceState") 59 + nativeOnActivitySaveInstanceState(nativePtr, activity) 60 + } 61 + 62 + override fun onActivityDestroyed(activity: Activity) { 63 + Log.i(TAG, "$activity onActivityDestroyed") 64 + nativeOnActivityDestroyed(nativePtr, activity) 65 + } 66 + 67 + private external fun nativeOnActivityCreated(nativePtr: Long, activity: Activity) 68 + 69 + private external fun nativeOnActivityStarted(nativePtr: Long, activity: Activity) 70 + 71 + private external fun nativeOnActivityResumed(nativePtr: Long, activity: Activity) 72 + 73 + private external fun nativeOnActivityPaused(nativePtr: Long, activity: Activity) 74 + 75 + private external fun nativeOnActivityStopped(nativePtr: Long, activity: Activity) 76 + 77 + private external fun nativeOnActivitySaveInstanceState(nativePtr: Long, activity: Activity) 78 + 79 + private external fun nativeOnActivityDestroyed(nativePtr: Long, activity: Activity) 80 + 81 + companion object { 82 + const val TAG = "ActivityLifecycleListener" 83 + } 84 + }