Benoit Marty
1 year ago
17 changed files with 292 additions and 33 deletions
@ -0,0 +1,40 @@
@@ -0,0 +1,40 @@
|
||||
/* |
||||
* Copyright (c) 2022 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
// TODO: Remove once https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed |
||||
@Suppress("DSL_SCOPE_VIOLATION") |
||||
plugins { |
||||
id("io.element.android-library") |
||||
alias(libs.plugins.anvil) |
||||
} |
||||
|
||||
android { |
||||
namespace = "io.element.android.libraries.deeplink" |
||||
} |
||||
|
||||
anvil { |
||||
generateDaggerFactories.set(true) |
||||
} |
||||
|
||||
dependencies { |
||||
implementation(projects.libraries.di) |
||||
implementation(libs.dagger) |
||||
implementation(libs.androidx.corektx) |
||||
implementation(projects.libraries.matrix.api) |
||||
|
||||
testImplementation(libs.test.junit) |
||||
testImplementation(libs.test.truth) |
||||
} |
@ -0,0 +1,39 @@
@@ -0,0 +1,39 @@
|
||||
/* |
||||
* Copyright (c) 2023 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.libraries.deeplink |
||||
|
||||
import io.element.android.libraries.matrix.api.core.RoomId |
||||
import io.element.android.libraries.matrix.api.core.SessionId |
||||
import io.element.android.libraries.matrix.api.core.ThreadId |
||||
import javax.inject.Inject |
||||
|
||||
class DeepLinkCreator @Inject constructor() { |
||||
fun create(sessionId: SessionId, roomId: RoomId?, threadId: ThreadId?): String { |
||||
return buildString { |
||||
append("elementx://open/") |
||||
append(sessionId.value) |
||||
if (roomId != null) { |
||||
append("/") |
||||
append(roomId.value) |
||||
if (threadId != null) { |
||||
append("/") |
||||
append(threadId.value) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,27 @@
@@ -0,0 +1,27 @@
|
||||
/* |
||||
* Copyright (c) 2023 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.libraries.deeplink |
||||
|
||||
import io.element.android.libraries.matrix.api.core.RoomId |
||||
import io.element.android.libraries.matrix.api.core.SessionId |
||||
import io.element.android.libraries.matrix.api.core.ThreadId |
||||
|
||||
data class DeeplinkData( |
||||
val sessionId: SessionId, |
||||
val roomId: RoomId? = null, |
||||
val threadId: ThreadId? = null, |
||||
) |
@ -0,0 +1,47 @@
@@ -0,0 +1,47 @@
|
||||
/* |
||||
* Copyright (c) 2023 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.libraries.deeplink |
||||
|
||||
import android.content.Intent |
||||
import android.net.Uri |
||||
import io.element.android.libraries.matrix.api.core.asRoomId |
||||
import io.element.android.libraries.matrix.api.core.asSessionId |
||||
import io.element.android.libraries.matrix.api.core.asThreadId |
||||
import javax.inject.Inject |
||||
|
||||
class DeeplinkParser @Inject constructor() { |
||||
fun getFromIntent(intent: Intent): DeeplinkData? { |
||||
return intent |
||||
.takeIf { it.action == Intent.ACTION_VIEW } |
||||
?.data |
||||
?.toDeeplinkData() |
||||
} |
||||
|
||||
private fun Uri.toDeeplinkData(): DeeplinkData? { |
||||
if (scheme != "elementx") return null |
||||
if (host != "open") return null |
||||
val pathBits = path.orEmpty().split("/").drop(1) |
||||
val sessionId = pathBits.elementAtOrNull(0)?.asSessionId() ?: return null |
||||
val roomId = pathBits.elementAtOrNull(1)?.asRoomId() |
||||
val threadId = pathBits.elementAtOrNull(2)?.asThreadId() |
||||
return DeeplinkData( |
||||
sessionId = sessionId, |
||||
roomId = roomId, |
||||
threadId = threadId, |
||||
) |
||||
} |
||||
} |
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
#! /bin/bash |
||||
# |
||||
# Copyright (c) 2023 New Vector Ltd |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
# |
||||
|
||||
# Format is: |
||||
# elementx://open/{sessionId} to open a session |
||||
# elementx://open/{sessionId}/{roomId} to open a room |
||||
# elementx://open/{sessionId}/{roomId}/{eventId} to open an event |
||||
|
||||
# Open a session |
||||
# adb shell am start -a android.intent.action.VIEW -d elementx://open/@benoit10518:matrix.org |
||||
# Open a room |
||||
adb shell am start -a android.intent.action.VIEW -d elementx://open/@benoit10518:matrix.org/!dehdDVSkabQLZFYrgo:matrix.org |
||||
# Open a thread |
||||
# adb shell am start -a android.intent.action.VIEW -d elementx://open/@benoit10518:matrix.org/!dehdDVSkabQLZFYrgo:matrix.org/\\\$threadId |
Loading…
Reference in new issue