Let MainActivity manage Element Call https links.
This commit is contained in:
@@ -76,8 +76,6 @@
|
||||
</intent-filter>
|
||||
<!--
|
||||
Element web links
|
||||
Note: On Android 12 and higher clicking a web link (that is not an Android App Link) always shows content in a web browser
|
||||
https://developer.android.com/training/app-links#web-links
|
||||
-->
|
||||
<intent-filter android:autoVerify="true">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
@@ -86,8 +84,7 @@
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
|
||||
<data android:scheme="https" />
|
||||
<data android:host="app.element.io" />
|
||||
<data android:host="develop.element.io" />
|
||||
<data android:host="*.element.io" />
|
||||
</intent-filter>
|
||||
<!--
|
||||
matrix.to links
|
||||
|
||||
@@ -39,6 +39,7 @@ import io.element.android.compound.theme.ElementTheme
|
||||
import io.element.android.compound.theme.Theme
|
||||
import io.element.android.compound.theme.isDark
|
||||
import io.element.android.compound.theme.mapToTheme
|
||||
import io.element.android.features.call.ui.ElementCallActivity
|
||||
import io.element.android.features.lockscreen.api.handleSecureFlag
|
||||
import io.element.android.features.lockscreen.api.isLocked
|
||||
import io.element.android.libraries.architecture.bindings
|
||||
@@ -58,6 +59,13 @@ class MainActivity : NodeActivity() {
|
||||
Timber.tag(loggerTag.value).w("onCreate, with savedInstanceState: ${savedInstanceState != null}")
|
||||
installSplashScreen()
|
||||
super.onCreate(savedInstanceState)
|
||||
if (ElementCallActivity.maybeStart(this, intent)) {
|
||||
Timber.tag(loggerTag.value).w("Starting Element Call Activity")
|
||||
if (savedInstanceState == null) {
|
||||
finish()
|
||||
return
|
||||
}
|
||||
}
|
||||
appBindings = bindings()
|
||||
appBindings.lockScreenService().handleSecureFlag(this)
|
||||
enableEdgeToEdge()
|
||||
@@ -135,11 +143,18 @@ class MainActivity : NodeActivity() {
|
||||
* Called when:
|
||||
* - the launcher icon is clicked (if the app is already running);
|
||||
* - a notification is clicked.
|
||||
* - a deep link have been clicked
|
||||
* - the app is going to background (<- this is strange)
|
||||
*/
|
||||
override fun onNewIntent(intent: Intent) {
|
||||
super.onNewIntent(intent)
|
||||
Timber.tag(loggerTag.value).w("onNewIntent")
|
||||
|
||||
if (ElementCallActivity.maybeStart(this, intent)) {
|
||||
Timber.tag(loggerTag.value).w("Starting Element Call Activity")
|
||||
return
|
||||
}
|
||||
|
||||
// If the mainNode is not init yet, keep the intent for later.
|
||||
// It can happen when the activity is killed by the system. The methods are called in this order :
|
||||
// onCreate(savedInstanceState=true) -> onNewIntent -> onResume -> onMainNodeInit
|
||||
|
||||
@@ -34,15 +34,10 @@
|
||||
android:configChanges="screenSize|screenLayout|orientation|keyboardHidden|keyboard|navigation|uiMode"
|
||||
android:launchMode="singleTask">
|
||||
|
||||
<intent-filter android:autoVerify="true">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<!--
|
||||
Note: intent-filter for https://call.element.io link is now managed by the MainActivity.
|
||||
-->
|
||||
|
||||
<data android:scheme="https" />
|
||||
|
||||
<data android:host="call.element.io" />
|
||||
</intent-filter>
|
||||
<!-- Custom scheme to handle urls from other domains in the format: element://call?url=https%3A%2F%2Felement.io -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package io.element.android.features.call.ui
|
||||
|
||||
import android.Manifest
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
|
||||
@@ -35,6 +36,7 @@ import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.core.app.ActivityOptionsCompat
|
||||
import androidx.core.content.IntentCompat
|
||||
import com.bumble.appyx.core.integrationpoint.NodeComponentActivity
|
||||
import io.element.android.compound.theme.ElementTheme
|
||||
@@ -47,6 +49,7 @@ import io.element.android.features.call.di.CallBindings
|
||||
import io.element.android.features.call.utils.CallIntentDataParser
|
||||
import io.element.android.features.preferences.api.store.AppPreferencesStore
|
||||
import io.element.android.libraries.architecture.bindings
|
||||
import io.element.android.libraries.core.bool.orFalse
|
||||
import javax.inject.Inject
|
||||
|
||||
class ElementCallActivity : NodeComponentActivity(), CallScreenNavigator {
|
||||
@@ -63,6 +66,26 @@ class ElementCallActivity : NodeComponentActivity(), CallScreenNavigator {
|
||||
}
|
||||
context.startActivity(intent)
|
||||
}
|
||||
|
||||
/**
|
||||
* Eventually start the ElementCallActivity, and return true if it's the case.
|
||||
*/
|
||||
fun maybeStart(
|
||||
activity: Activity,
|
||||
intent: Intent?,
|
||||
): Boolean {
|
||||
return intent?.data
|
||||
?.takeIf { uri -> uri.scheme == "https" && uri.host == "call.element.io" }
|
||||
?.let { uri ->
|
||||
val callIntent = Intent(activity, ElementCallActivity::class.java).apply {
|
||||
data = uri
|
||||
}
|
||||
// Disable animation since MainActivity has already been animated.
|
||||
val options = ActivityOptionsCompat.makeCustomAnimation(activity, 0, 0)
|
||||
activity.startActivity(callIntent, options.toBundle())
|
||||
true
|
||||
}.orFalse()
|
||||
}
|
||||
}
|
||||
|
||||
@Inject lateinit var callIntentDataParser: CallIntentDataParser
|
||||
|
||||
Reference in New Issue
Block a user