mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-25 05:27:42 +00:00
Make system keyboard sticker detection more reliable.
This commit is contained in:
committed by
Cody Henthorne
parent
fe97c969ae
commit
2e50699a2d
@@ -4,7 +4,6 @@ import android.content.Context
|
||||
import android.net.Uri
|
||||
import android.text.Spannable
|
||||
import android.text.SpannableString
|
||||
import com.bumptech.glide.Glide
|
||||
import io.reactivex.rxjava3.core.Maybe
|
||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||
import org.signal.core.util.Base64
|
||||
@@ -97,9 +96,9 @@ class DraftRepository(
|
||||
}
|
||||
|
||||
if (shareMedia != null && shareContentType != null && borderless) {
|
||||
val details = KeyboardUtil.getImageDetails(Glide.with(context), shareMedia)
|
||||
val details = KeyboardUtil.getImageDetails(shareMedia)
|
||||
|
||||
if (details == null || !details.hasTransparency) {
|
||||
if (details == null || !details.isSticker) {
|
||||
return ShareOrDraftData.SetMedia(shareMedia, shareMediaType!!, null) to null
|
||||
}
|
||||
|
||||
|
||||
@@ -4271,7 +4271,7 @@ class ConversationFragment :
|
||||
}
|
||||
|
||||
private fun sendKeyboardImage(uri: Uri, contentType: String, keyboardImageDetails: KeyboardUtil.ImageDetails?) {
|
||||
if (keyboardImageDetails == null || !keyboardImageDetails.hasTransparency) {
|
||||
if (keyboardImageDetails == null || !keyboardImageDetails.isSticker) {
|
||||
setMedia(uri, requireNotNull(SlideFactory.MediaType.from(contentType)))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ import android.text.SpannableStringBuilder
|
||||
import androidx.core.content.pm.ShortcutInfoCompat
|
||||
import androidx.core.graphics.drawable.IconCompat
|
||||
import androidx.core.graphics.drawable.toBitmap
|
||||
import com.bumptech.glide.Glide
|
||||
import com.bumptech.glide.RequestManager
|
||||
import com.bumptech.glide.request.target.CustomTarget
|
||||
import com.bumptech.glide.request.transition.Transition
|
||||
@@ -111,7 +110,7 @@ class ConversationRepository(
|
||||
*/
|
||||
fun getKeyboardImageDetails(uri: Uri): Maybe<KeyboardUtil.ImageDetails> {
|
||||
return MaybeCompat.fromCallable {
|
||||
KeyboardUtil.getImageDetails(Glide.with(applicationContext), uri)
|
||||
KeyboardUtil.getImageDetails(uri)
|
||||
}.subscribeOn(Schedulers.io())
|
||||
}
|
||||
|
||||
|
||||
@@ -5,30 +5,22 @@
|
||||
|
||||
package org.thoughtcrime.securesms.keyboard
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Color
|
||||
import android.net.Uri
|
||||
import androidx.annotation.WorkerThread
|
||||
import com.bumptech.glide.RequestManager
|
||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
||||
import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader
|
||||
import androidx.core.util.component1
|
||||
import androidx.core.util.component2
|
||||
import org.thoughtcrime.securesms.dependencies.AppDependencies
|
||||
import org.thoughtcrime.securesms.util.BitmapUtil
|
||||
import java.util.concurrent.ExecutionException
|
||||
import java.util.concurrent.TimeUnit
|
||||
import java.util.concurrent.TimeoutException
|
||||
|
||||
object KeyboardUtil {
|
||||
|
||||
@WorkerThread
|
||||
fun getImageDetails(requestManager: RequestManager, uri: Uri): ImageDetails? {
|
||||
fun getImageDetails(uri: Uri): ImageDetails? {
|
||||
return try {
|
||||
val bitmap: Bitmap = requestManager.asBitmap()
|
||||
.load(DecryptableStreamUriLoader.DecryptableUri(uri))
|
||||
.skipMemoryCache(true)
|
||||
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
||||
.submit()
|
||||
.get(1000, TimeUnit.MILLISECONDS)
|
||||
val topLeft = bitmap.getPixel(0, 0)
|
||||
ImageDetails(bitmap.width, bitmap.height, Color.alpha(topLeft) < 255)
|
||||
val (width, height) = BitmapUtil.getDimensions(AppDependencies.application.contentResolver.openInputStream(uri))
|
||||
return ImageDetails(width = width, height = height, isSticker = uri.isForSticker())
|
||||
} catch (e: InterruptedException) {
|
||||
null
|
||||
} catch (e: ExecutionException) {
|
||||
@@ -38,5 +30,10 @@ object KeyboardUtil {
|
||||
}
|
||||
}
|
||||
|
||||
data class ImageDetails(val width: Int, val height: Int, val hasTransparency: Boolean)
|
||||
private fun Uri.isForSticker(): Boolean {
|
||||
val string = this.toString()
|
||||
return string.contains("sticker") || string.contains("com.touchtype.swiftkey.fileprovider/share_images")
|
||||
}
|
||||
|
||||
data class ImageDetails(val width: Int, val height: Int, val isSticker: Boolean)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user