Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ android {
val localBroadcastPermission = "PRIVATE_BROADCAST"
manifestPlaceholders["broadcastPermission"] = localBroadcastPermission
buildConfigField("String", "PERMISSION_LOCAL_BROADCAST", "\"$localBroadcastPermission\"")
buildConfigField("Boolean", "BACKGROUND_BLUR_ENABLED", "true")
}

flavorDimensions += "default"
Expand All @@ -85,6 +86,7 @@ android {
create("generic") {
applicationId = "com.nextcloud.talk2"
dimension = "default"
buildConfigField("Boolean", "BACKGROUND_BLUR_ENABLED", "false")
}
create("gplay") {
applicationId = "com.nextcloud.talk2"
Expand Down Expand Up @@ -311,8 +313,10 @@ dependencies {
implementation("io.noties.markwon:ext-tasklist:$markwonVersion")
implementation("io.noties.markwon:ext-tables:$markwonVersion")

// Computer Vision - for background effects during video calls
implementation("com.google.mediapipe:tasks-vision:0.10.26")
// Computer Vision - for background effects during video calls (gplay only; generic/F-Droid
// build excludes this because it transitively pulls in com.google.firebase:firebase-encoders*
// via datatransport, which F-Droid's APK scanner rejects)
"gplayImplementation"("com.google.mediapipe:tasks-vision:0.10.26")
implementation("io.github.crow-misia.libyuv:libyuv-android:0.43.2")

// Avatar picker
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Nextcloud Talk - Android Client
*
* SPDX-FileCopyrightText: 2025 Julius Linus <juliuslinus1@gmail.com>
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package com.nextcloud.talk.camera

import android.content.Context

/**
* Stub for the generic (F-Droid) flavor. MediaPipe is not available in this build because it
* transitively pulls in com.google.firebase:firebase-encoders* via datatransport, which F-Droid
* rejects. Background blur is disabled for this flavor via BuildConfig.BACKGROUND_BLUR_ENABLED.
*/
class ImageSegmenterHelper(val context: Context, var imageSegmenterListener: SegmenterListener? = null) {

fun destroyImageSegmenter() {}

fun setupImageSegmenter() {}

fun segmentFrame(byteBuffer: java.nio.ByteBuffer, width: Int, height: Int, videoFrameTimeStamp: Long) {}

data class ResultBundle(val mask: ByteArray, val inferenceTime: Long, val width: Int, val height: Int) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as ResultBundle
if (inferenceTime != other.inferenceTime) return false
if (!mask.contentEquals(other.mask)) return false
return true
}

override fun hashCode(): Int {
var result = inferenceTime.hashCode()
result = 31 * result + mask.contentHashCode()
return result
}
}

companion object {
const val OTHER_ERROR = 0
const val GPU_ERROR = 1
const val MODEL_SELFIE_SEGMENTER_PATH = "selfie_segmenter.tflite"
const val RGB_MAX = 255.0
}

interface SegmenterListener {
fun onError(error: String, errorCode: Int = OTHER_ERROR)
fun onResults(resultBundle: ResultBundle)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ import com.nextcloud.talk.call.ReactionAnimator
import com.nextcloud.talk.call.components.ParticipantGrid
import com.nextcloud.talk.call.components.SelfVideoView
import com.nextcloud.talk.call.components.screenshare.ScreenShareComponent
import com.nextcloud.talk.BuildConfig
import com.nextcloud.talk.camera.BackgroundBlurFrameProcessor
import com.nextcloud.talk.camera.BlurBackgroundViewModel
import com.nextcloud.talk.camera.BlurBackgroundViewModel.BackgroundBlurOn
Expand Down Expand Up @@ -555,6 +556,7 @@ class CallActivity : CallBaseActivity() {
}

private fun initBackgroundBlurViewModel(surfaceTextureHelper: SurfaceTextureHelper) {
if (!BuildConfig.BACKGROUND_BLUR_ENABLED) return
blurBackgroundViewModel.viewState.observe(this) { state ->
val isOn = state == BackgroundBlurOn

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ data class DecryptedPushMessage(
var notificationId: Long?,

@JsonField(name = ["nids"])
var notificationIds: LongArray?,
var notificationIds: List<Long>?,

@JsonField(name = ["delete"])
var delete: Boolean,
Expand Down Expand Up @@ -74,12 +74,7 @@ data class DecryptedPushMessage(
if (subject != other.subject) return false
if (id != other.id) return false
if (notificationId != other.notificationId) return false
if (notificationIds != null) {
if (other.notificationIds == null) return false
if (!notificationIds.contentEquals(other.notificationIds)) return false
} else if (other.notificationIds != null) {
return false
}
if (notificationIds != other.notificationIds) return false
if (delete != other.delete) return false
if (deleteAll != other.deleteAll) return false
if (deleteMultiple != other.deleteMultiple) return false
Expand All @@ -97,7 +92,7 @@ data class DecryptedPushMessage(
result = 31 * result + (subject?.hashCode() ?: 0)
result = 31 * result + (id?.hashCode() ?: 0)
result = 31 * result + (notificationId?.hashCode() ?: 0)
result = 31 * result + (notificationIds?.contentHashCode() ?: 0)
result = 31 * result + (notificationIds?.hashCode() ?: 0)
result = 31 * result + (delete?.hashCode() ?: 0)
result = 31 * result + (deleteAll?.hashCode() ?: 0)
result = 31 * result + (deleteMultiple?.hashCode() ?: 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
import com.nextcloud.talk.R
import com.nextcloud.talk.activities.CallActivity
import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.BuildConfig
import com.nextcloud.talk.camera.BlurBackgroundViewModel
import com.nextcloud.talk.databinding.DialogMoreCallActionsBinding
import com.nextcloud.talk.raisehand.viewmodel.RaiseHandViewModel
Expand Down Expand Up @@ -77,6 +78,10 @@ class MoreCallActionsDialog(private val callActivity: CallActivity) : BottomShee
} else {
binding.raiseHand.visibility = View.GONE
}

if (!BuildConfig.BACKGROUND_BLUR_ENABLED) {
binding.backgroundBlur.visibility = View.GONE
}
}

private fun initClickListeners() {
Expand Down
77 changes: 77 additions & 0 deletions gradle/verification-keyring.keys
Original file line number Diff line number Diff line change
Expand Up @@ -1569,6 +1569,83 @@ IprKXtD8103BdNqrPJev2azwqWwxFpN83tEPbK4SwWPgk1nSELXZZ5ClcDgqatg+
=uOQ4
-----END PGP PUBLIC KEY BLOCK-----

pub B7C3B43D18EAA8B7
uid Karl Heinz Marbaise (SoftwareEntwicklung Beratung Schulung) <kama@soebes.de>

sub 02A4A6FB70018AD9
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
hRjYldaB
=4clq
-----END PGP PUBLIC KEY BLOCK-----

pub B943F5CB616566CD
uid Marcel Schnelle <marcelschnelle@aol.com>

Expand Down
10 changes: 10 additions & 0 deletions gradle/verification-metadata.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21423,6 +21423,11 @@
<sha256 value="18d4b1db26153d4e55079ce1f76bb1fe05cdb862ef9954a88cbcc4ff38b8679b" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.j2objc" name="j2objc-annotations" version="1.1">
<artifact name="j2objc-annotations-1.1.pom">
<pgp value="B801E2F8EF035068EC1139CC29579F18FA8FD93B"/>
</artifact>
</component>
<component group="com.google.j2objc" name="j2objc-annotations" version="1.3">
<artifact name="j2objc-annotations-1.3.jar">
<sha256 value="21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b" origin="Generated by Gradle"/>
Expand Down Expand Up @@ -25159,6 +25164,11 @@
<sha256 value="49ddab43c8361dc2ef0c1ff87cb590fa7231702ab9f62e26d512dc18a1f1cd04" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.codehaus.mojo" name="mojo-parent" version="40">
<artifact name="mojo-parent-40.pom">
<pgp value="D433F9C895710DB8AB087FA6B7C3B43D18EAA8B7"/>
</artifact>
</component>
<component group="org.codehaus.mojo" name="mojo-parent" version="50">
<artifact name="mojo-parent-50.pom">
<pgp value="720746177725A89207A7075BFD5DEA07FCB690A8"/>
Expand Down
Loading