Skip to content
Merged
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
3 changes: 1 addition & 2 deletions app/src/main/java/com/madrid/movio/app.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.madrid.movio


import com.madrid.presentation.screens.searchScreen.SearchViewModel
import com.madrid.data.dataSource.local.SearchLocalDataSource
import com.madrid.data.dataSource.remote.search.SearchRemoteSourceImpl
import com.madrid.data.repositories.SearchLocalSource
Expand All @@ -15,6 +14,7 @@ import com.madrid.domain.usecase.searchUseCase.MediaUseCase
import com.madrid.domain.usecase.searchUseCase.PreferredMediaUseCase
import com.madrid.domain.usecase.searchUseCase.RecentSearchUseCase
import com.madrid.domain.usecase.searchUseCase.TrendingMediaUseCase
import com.madrid.presentation.screens.searchScreen.SearchViewModel
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module

Expand All @@ -37,7 +37,6 @@ val app = module {
)
}


//domain
single { ArtistUseCase(get()) }
single { MediaUseCase(get()) }
Expand Down
9 changes: 8 additions & 1 deletion detectImageContent/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
}

android {
Expand Down Expand Up @@ -30,10 +31,16 @@ android {
kotlinOptions {
jvmTarget = "17"
}

android {
buildFeatures {
compose = true
}
}
}

dependencies {

implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package com.madrid.detectImageContent

import android.graphics.Bitmap

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.blur
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.DefaultAlpha
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp


@Composable
fun FilteredImage(
imageUrl: String,
contentDescription: String?,
modifier: Modifier = Modifier,
alignment: Alignment = Alignment.Center,
contentScale: ContentScale = ContentScale.Fit,
alpha: Float = DefaultAlpha,
colorFilter: ColorFilter? = null,
) {
val context = LocalContext.current
var image by remember { mutableStateOf<Bitmap?>(null) }
var isNSFW by remember { mutableStateOf(false) }
val getImage = remember(context) { GetImageBitmap(context) }
val detection = remember(context) { SensitiveContentDetection(context) }

if (imageUrl.isNotBlank()) {
LaunchedEffect(imageUrl) {
try {
image = getImage.getImageBitmapFromUrl(imageUrl)
isNSFW = detection.sensitiveContentDetection(image!!)
} catch (_: Exception) {

}
}

FilteredImageContent(
image = image,
isNSFW = isNSFW,
contentDescription = contentDescription,
modifier = modifier,
alignment = alignment,
contentScale = contentScale,
alpha = alpha,
colorFilter = colorFilter
)
}
}

@Composable
fun FilteredImageContent(
image: Bitmap?,
isNSFW: Boolean,
contentDescription: String?,
modifier: Modifier,
alignment: Alignment,
contentScale: ContentScale,
alpha: Float,
colorFilter: ColorFilter?
) {
image?.let {
Image(
bitmap = it.asImageBitmap(),
contentDescription = contentDescription,
modifier = modifier
.size(300.dp)
.then(
if (isNSFW) Modifier.blur(16.dp)
else Modifier
),
contentScale = contentScale,
alignment = alignment,
alpha = alpha,
colorFilter = colorFilter
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,12 @@ class SensitiveContentDetection(private val context: Context) {
val result = LABELS.zip(output[0].toList()).toMap()
val pornScore = result["porn"] ?: 0f
val sexyScore = result["sexy"] ?: 0f
return pornScore > THRESHOLD || sexyScore > THRESHOLD
val drawingsScore = result["drawings"] ?: 0f
val hentaiScore = result["hentai"] ?: 0f
val neutralScore = result["neutral"] ?: 0f
return pornScore > SENSITIVE_THRESHOLD || sexyScore > SENSITIVE_THRESHOLD
|| drawingsScore > SENSITIVE_THRESHOLD || hentaiScore > SENSITIVE_THRESHOLD
|| neutralScore < NEUTRAL_THRESHOLD
}

private fun prepareInputBitmap(bitmap: Bitmap): Array<Array<Array<FloatArray>>> {
Expand Down Expand Up @@ -54,7 +59,8 @@ class SensitiveContentDetection(private val context: Context) {
companion object {
private const val MODEL_FILE_NAME = "nsfw_detect.tflite"
private const val MODEL_INPUT_SIZE = 224
private const val THRESHOLD = 0.7f
private const val SENSITIVE_THRESHOLD = 0.35f
private const val NEUTRAL_THRESHOLD = 0.70f
private val LABELS = listOf("drawings", "hentai", "neutral", "porn", "sexy")
}

Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Loading