diff --git a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java index 40a533fa3..649305129 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java @@ -41,6 +41,7 @@ import androidx.lifecycle.ViewModelStore; import androidx.lifecycle.ViewModelStoreOwner; +import org.json.JSONObject; import org.mozilla.geckoview.GeckoRuntime; import org.mozilla.geckoview.GeckoSession; import org.mozilla.geckoview.GeckoVRManager; @@ -80,6 +81,7 @@ import org.mozilla.vrbrowser.utils.DeviceType; import org.mozilla.vrbrowser.utils.LocaleUtils; import org.mozilla.vrbrowser.utils.ServoUtils; +import org.mozilla.vrbrowser.utils.StringUtils; import org.mozilla.vrbrowser.utils.SystemUtils; import java.io.File; @@ -1087,6 +1089,25 @@ private void handlePoorPerformance() { }); } + @Keep + @SuppressWarnings("unused") + private void onAppLink(String aJSON) { + runOnUiThread(() -> { + try { + JSONObject object = new JSONObject(aJSON); + String uri = object.optString("url"); + Session session = SessionStore.get().getActiveSession(); + if (!StringUtils.isEmpty(uri) && session != null) { + session.loadUri(uri); + } + + } catch (Exception ex) { + Log.e(LOGTAG, "Error parsing app link JSON: " + ex.toString()); + } + + }); + } + private SurfaceTexture createSurfaceTexture() { int[] ids = new int[1]; GLES20.glGenTextures(1, ids, 0); diff --git a/app/src/main/cpp/VRBrowser.cpp b/app/src/main/cpp/VRBrowser.cpp index 296c8f320..660c531d9 100644 --- a/app/src/main/cpp/VRBrowser.cpp +++ b/app/src/main/cpp/VRBrowser.cpp @@ -52,6 +52,8 @@ const char* kHaltActivity = "haltActivity"; const char* kHaltActivitySignature = "(I)V"; const char* kHandlePoorPerformance = "handlePoorPerformance"; const char* kHandlePoorPerformanceSignature = "()V"; +const char* kOnAppLink = "onAppLink"; +const char* kOnAppLinkSignature = "(Ljava/lang/String;)V"; JNIEnv* sEnv = nullptr; jclass sBrowserClass = nullptr; @@ -77,6 +79,7 @@ jmethodID sAreLayersEnabled = nullptr; jmethodID sSetDeviceType = nullptr; jmethodID sHaltActivity = nullptr; jmethodID sHandlePoorPerformance = nullptr; +jmethodID sOnAppLink = nullptr; } namespace crow { @@ -117,6 +120,7 @@ VRBrowser::InitializeJava(JNIEnv* aEnv, jobject aActivity) { sSetDeviceType = FindJNIMethodID(sEnv, sBrowserClass, kSetDeviceType, kSetDeviceTypeSignature); sHaltActivity = FindJNIMethodID(sEnv, sBrowserClass, kHaltActivity, kHaltActivitySignature); sHandlePoorPerformance = FindJNIMethodID(sEnv, sBrowserClass, kHandlePoorPerformance, kHandlePoorPerformanceSignature); + sOnAppLink = FindJNIMethodID(sEnv, sBrowserClass, kOnAppLink, kOnAppLinkSignature); } void @@ -151,6 +155,7 @@ VRBrowser::ShutdownJava() { sAreLayersEnabled = nullptr; sSetDeviceType = nullptr; sHaltActivity = nullptr; + sOnAppLink = nullptr; sEnv = nullptr; } @@ -339,4 +344,13 @@ VRBrowser::HandlePoorPerformance() { CheckJNIException(sEnv, __FUNCTION__); } +void +VRBrowser::OnAppLink(const std::string& aJSON) { + if (!ValidateMethodID(sEnv, sActivity, sOnAppLink, __FUNCTION__)) { return; } + jstring json = sEnv->NewStringUTF(aJSON.c_str()); + sEnv->CallVoidMethod(sActivity, sOnAppLink, json); + sEnv->DeleteLocalRef(json); + CheckJNIException(sEnv, __FUNCTION__); +} + } // namespace crow diff --git a/app/src/main/cpp/VRBrowser.h b/app/src/main/cpp/VRBrowser.h index d45fc1021..2d2dc5f34 100644 --- a/app/src/main/cpp/VRBrowser.h +++ b/app/src/main/cpp/VRBrowser.h @@ -39,6 +39,7 @@ bool AreLayersEnabled(); void SetDeviceType(const jint aType); void HaltActivity(const jint aReason); void HandlePoorPerformance(); +void OnAppLink(const std::string& aJSON); } // namespace VRBrowser; } // namespace crow diff --git a/app/src/oculusvr/cpp/DeviceDelegateOculusVR.cpp b/app/src/oculusvr/cpp/DeviceDelegateOculusVR.cpp index 30a615a97..2b82dd7d8 100644 --- a/app/src/oculusvr/cpp/DeviceDelegateOculusVR.cpp +++ b/app/src/oculusvr/cpp/DeviceDelegateOculusVR.cpp @@ -777,10 +777,6 @@ DeviceDelegateOculusVR::SetCPULevel(const device::CPULevel aLevel) { void DeviceDelegateOculusVR::ProcessEvents() { - if (m.applicationEntitled) { - return; - } - ovrMessageHandle message; while ((message = ovr_PopMessage()) != nullptr) { switch (ovr_Message_GetType(message)) { @@ -812,6 +808,14 @@ DeviceDelegateOculusVR::ProcessEvents() { m.applicationEntitled = true; } break; + case ovrMessage_Notification_ApplicationLifecycle_LaunchIntentChanged: { + auto details = ovr_ApplicationLifecycle_GetLaunchDetails(); + const char *msg = ovr_LaunchDetails_GetDeeplinkMessage(details); + if (msg) { + VRBrowser::OnAppLink(msg); + } + break; + } default: break; }