diff --git a/frontend/app/src/androidTest/java/com/example/speechbuddy/MySymbolSettingsScreenTest.kt b/frontend/app/src/androidTest/java/com/example/speechbuddy/MySymbolSettingsScreenTest.kt index 4781bb5f..bd879893 100644 --- a/frontend/app/src/androidTest/java/com/example/speechbuddy/MySymbolSettingsScreenTest.kt +++ b/frontend/app/src/androidTest/java/com/example/speechbuddy/MySymbolSettingsScreenTest.kt @@ -22,6 +22,7 @@ import com.example.speechbuddy.data.local.models.SymbolMapper import com.example.speechbuddy.data.remote.MySymbolRemoteSource import com.example.speechbuddy.data.remote.ProxyImageDownloader import com.example.speechbuddy.data.remote.RealImageDownloader +import com.example.speechbuddy.data.remote.RemoveImage import com.example.speechbuddy.data.remote.models.MySymbolDtoMapper import com.example.speechbuddy.domain.SessionManager import com.example.speechbuddy.domain.utils.Converters @@ -145,7 +146,8 @@ class MySymbolSettingsScreenTest { symbolMapper = SymbolMapper(), categoryMapper = CategoryMapper(), sessionManager = SessionManager(), - responseHandler = ResponseHandler() + responseHandler = ResponseHandler(), + removeImage = RemoveImage(context) ), ) ) diff --git a/frontend/app/src/androidTest/java/com/example/speechbuddy/SymbolCreationScreenTest.kt b/frontend/app/src/androidTest/java/com/example/speechbuddy/SymbolCreationScreenTest.kt index ceaab58b..74e3e4e4 100644 --- a/frontend/app/src/androidTest/java/com/example/speechbuddy/SymbolCreationScreenTest.kt +++ b/frontend/app/src/androidTest/java/com/example/speechbuddy/SymbolCreationScreenTest.kt @@ -22,6 +22,7 @@ import com.example.speechbuddy.data.local.models.SymbolMapper import com.example.speechbuddy.data.remote.MySymbolRemoteSource import com.example.speechbuddy.data.remote.ProxyImageDownloader import com.example.speechbuddy.data.remote.RealImageDownloader +import com.example.speechbuddy.data.remote.RemoveImage import com.example.speechbuddy.data.remote.models.MySymbolDtoMapper import com.example.speechbuddy.domain.SessionManager import com.example.speechbuddy.domain.utils.Converters @@ -117,7 +118,8 @@ class SymbolCreationScreenTest { symbolMapper = SymbolMapper(), categoryMapper = CategoryMapper(), sessionManager = SessionManager(), - responseHandler = ResponseHandler() + responseHandler = ResponseHandler(), + removeImage = RemoveImage(context) ), weightTableRepository = WeightTableRepository( symbolDao = symbolDao, diff --git a/frontend/app/src/androidTest/java/com/example/speechbuddy/SymbolSelectionScreenTest.kt b/frontend/app/src/androidTest/java/com/example/speechbuddy/SymbolSelectionScreenTest.kt index 717544d1..b01a07b9 100644 --- a/frontend/app/src/androidTest/java/com/example/speechbuddy/SymbolSelectionScreenTest.kt +++ b/frontend/app/src/androidTest/java/com/example/speechbuddy/SymbolSelectionScreenTest.kt @@ -24,6 +24,7 @@ import com.example.speechbuddy.data.local.models.SymbolMapper import com.example.speechbuddy.data.remote.MySymbolRemoteSource import com.example.speechbuddy.data.remote.ProxyImageDownloader import com.example.speechbuddy.data.remote.RealImageDownloader +import com.example.speechbuddy.data.remote.RemoveImage import com.example.speechbuddy.data.remote.models.MySymbolDtoMapper import com.example.speechbuddy.domain.SessionManager import com.example.speechbuddy.domain.utils.Converters @@ -125,7 +126,8 @@ class SymbolSelectionScreenTest { symbolMapper = SymbolMapper(), categoryMapper = CategoryMapper(), sessionManager = SessionManager(), - responseHandler = ResponseHandler() + responseHandler = ResponseHandler(), + removeImage = RemoveImage(context) ), weightTableRepository = WeightTableRepository( symbolDao = symbolDao, diff --git a/frontend/app/src/main/java/com/example/speechbuddy/compose/landing/LandingScreen.kt b/frontend/app/src/main/java/com/example/speechbuddy/compose/landing/LandingScreen.kt index 19e3ce3a..dc1db7b6 100644 --- a/frontend/app/src/main/java/com/example/speechbuddy/compose/landing/LandingScreen.kt +++ b/frontend/app/src/main/java/com/example/speechbuddy/compose/landing/LandingScreen.kt @@ -60,7 +60,7 @@ fun LandingScreen( text = stringResource(id = R.string.start_guest_mode), onClick = { viewModel.enterGuestMode() } ) - ButtonUi(text = stringResource(id = R.string.do_login), onClick = onLoginClick) +// ButtonUi(text = stringResource(id = R.string.do_login), onClick = onLoginClick) } } } diff --git a/frontend/app/src/main/java/com/example/speechbuddy/compose/settings/CopyrightScreen.kt b/frontend/app/src/main/java/com/example/speechbuddy/compose/settings/CopyrightScreen.kt index 49978d2f..e35443b4 100644 --- a/frontend/app/src/main/java/com/example/speechbuddy/compose/settings/CopyrightScreen.kt +++ b/frontend/app/src/main/java/com/example/speechbuddy/compose/settings/CopyrightScreen.kt @@ -43,6 +43,13 @@ fun Copyright( text = stringResource(R.string.copyright), style = MaterialTheme.typography.bodyMedium ) + + Spacer(modifier = modifier.height(20.dp)) + + Text( + text = stringResource(R.string.bird_img_copyright), + style = MaterialTheme.typography.bodyMedium + ) } } } \ No newline at end of file diff --git a/frontend/app/src/main/java/com/example/speechbuddy/compose/settings/MySymbolSettings.kt b/frontend/app/src/main/java/com/example/speechbuddy/compose/settings/MySymbolSettings.kt index e518e7d0..0a47f664 100644 --- a/frontend/app/src/main/java/com/example/speechbuddy/compose/settings/MySymbolSettings.kt +++ b/frontend/app/src/main/java/com/example/speechbuddy/compose/settings/MySymbolSettings.kt @@ -44,6 +44,8 @@ import androidx.compose.ui.zIndex import androidx.hilt.navigation.compose.hiltViewModel import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.RequestOptions import com.example.speechbuddy.R import com.example.speechbuddy.compose.symbolselection.SymbolSearchTextField import com.example.speechbuddy.compose.utils.NoRippleInteractionSource @@ -264,7 +266,14 @@ fun MySymbolUi( model = filepath.plus("symbol_${symbol.id}.png"), contentDescription = symbol.text, modifier = Modifier.height(90.dp), - contentScale = ContentScale.FillHeight + contentScale = ContentScale.FillHeight, + requestBuilderTransform = { requestBuilder -> + requestBuilder.apply( + RequestOptions() + .diskCacheStrategy(DiskCacheStrategy.NONE) + .skipMemoryCache(true) + ) + } ) Box( diff --git a/frontend/app/src/main/java/com/example/speechbuddy/compose/utils/SymbolUi.kt b/frontend/app/src/main/java/com/example/speechbuddy/compose/utils/SymbolUi.kt index 3c07f7c9..666d2de0 100644 --- a/frontend/app/src/main/java/com/example/speechbuddy/compose/utils/SymbolUi.kt +++ b/frontend/app/src/main/java/com/example/speechbuddy/compose/utils/SymbolUi.kt @@ -31,6 +31,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.RequestOptions import com.example.speechbuddy.R import com.example.speechbuddy.domain.models.Symbol import com.example.speechbuddy.utils.Constants.Companion.DEFAULT_SYMBOL_COUNT @@ -98,7 +100,14 @@ fun SymbolUi( model = filepath.plus("symbol_${symbol.id}.png"), contentDescription = symbol.text, modifier = Modifier.height(90.dp), - contentScale = ContentScale.FillHeight + contentScale = ContentScale.FillHeight, + requestBuilderTransform = { requestBuilder -> + requestBuilder.apply( + RequestOptions() + .diskCacheStrategy(DiskCacheStrategy.NONE) + .skipMemoryCache(true) + ) + } ) Box( @@ -119,4 +128,4 @@ fun SymbolUi( } } } -} +} \ No newline at end of file diff --git a/frontend/app/src/main/java/com/example/speechbuddy/data/remote/RemoveImage.kt b/frontend/app/src/main/java/com/example/speechbuddy/data/remote/RemoveImage.kt new file mode 100644 index 00000000..20316556 --- /dev/null +++ b/frontend/app/src/main/java/com/example/speechbuddy/data/remote/RemoveImage.kt @@ -0,0 +1,33 @@ +package com.example.speechbuddy.data.remote + + +import android.content.Context +import com.example.speechbuddy.domain.models.Symbol +import kotlinx.coroutines.runBlocking +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class RemoveImage @Inject constructor( + private val context: Context +) { + fun checkImage(symbolList: List): List { + val internalDir = context.filesDir + val removeList = mutableListOf() + for (symbol in symbolList.drop(499)) { // compare after 500 + internalDir.listFiles()?.forEach { file -> + // Check if the file matches your criteria + if (file.name == "symbol_${symbol.id}.png") { + removeList.add(file.name) + } + } + } + return removeList + } + + fun removeImage(filename: String) { + runBlocking { + context.deleteFile(filename) + } + } +} \ No newline at end of file diff --git a/frontend/app/src/main/java/com/example/speechbuddy/di/RemoveImageModule.kt b/frontend/app/src/main/java/com/example/speechbuddy/di/RemoveImageModule.kt new file mode 100644 index 00000000..fdc3f49f --- /dev/null +++ b/frontend/app/src/main/java/com/example/speechbuddy/di/RemoveImageModule.kt @@ -0,0 +1,27 @@ +package com.example.speechbuddy.di + +import android.content.Context +import com.example.speechbuddy.data.remote.ImageDownloader +import com.example.speechbuddy.data.remote.ProxyImageDownloader +import com.example.speechbuddy.data.remote.RealImageDownloader +import com.example.speechbuddy.data.remote.RemoveImage +import com.example.speechbuddy.service.BackupService +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + + +@Module +@InstallIn(SingletonComponent::class) +class RemoveImageModule { + @Singleton + @Provides + fun provideRemoveImage( + @ApplicationContext context: Context, + ): RemoveImage { + return RemoveImage(context) + } +} \ No newline at end of file diff --git a/frontend/app/src/main/java/com/example/speechbuddy/repository/SymbolRepository.kt b/frontend/app/src/main/java/com/example/speechbuddy/repository/SymbolRepository.kt index 73fde1c0..f5073b4d 100644 --- a/frontend/app/src/main/java/com/example/speechbuddy/repository/SymbolRepository.kt +++ b/frontend/app/src/main/java/com/example/speechbuddy/repository/SymbolRepository.kt @@ -7,6 +7,7 @@ import com.example.speechbuddy.data.local.models.SymbolEntity import com.example.speechbuddy.data.local.models.SymbolMapper import com.example.speechbuddy.data.remote.MySymbolRemoteSource import com.example.speechbuddy.data.remote.ProxyImageDownloader +import com.example.speechbuddy.data.remote.RemoveImage import com.example.speechbuddy.data.remote.models.MySymbolDtoMapper import com.example.speechbuddy.domain.SessionManager import com.example.speechbuddy.domain.models.Category @@ -39,13 +40,29 @@ class SymbolRepository @Inject constructor( private val sessionManager: SessionManager, private val symbolMapper: SymbolMapper, private val categoryMapper: CategoryMapper, - private val proxyImageDownloader: ProxyImageDownloader + private val proxyImageDownloader: ProxyImageDownloader, + private val removeImage: RemoveImage ) { fun checkImages() { runBlocking { proxyImageDownloader.checkImage(getAllSymbols().first()) } } + fun removeImages() { + runBlocking { + val removeList = removeImage.checkImage(getAllSymbols().first()) + for (removeItem in removeList) { + removeImage.removeImage(removeItem) + } + } + } + + fun removeSelectedImage(symbol: Symbol) { + runBlocking { + removeImage.removeImage("symbol_${symbol.id}.png") + } + } + fun getSymbols(query: String) = if (query.isBlank()) getAllSymbols() else symbolDao.getSymbolsByQuery(query).map { symbolEntities -> diff --git a/frontend/app/src/main/java/com/example/speechbuddy/viewmodel/AccountSettingsViewModel.kt b/frontend/app/src/main/java/com/example/speechbuddy/viewmodel/AccountSettingsViewModel.kt index 68386f17..ce5ad0af 100644 --- a/frontend/app/src/main/java/com/example/speechbuddy/viewmodel/AccountSettingsViewModel.kt +++ b/frontend/app/src/main/java/com/example/speechbuddy/viewmodel/AccountSettingsViewModel.kt @@ -26,7 +26,7 @@ class AccountSettingsViewModel @Inject internal constructor( private val settingsRepository: SettingsRepository, private val weightTableRepository: WeightTableRepository, private val symbolRepository: SymbolRepository, - private val userRepository: UserRepository + private val userRepository: UserRepository, ) : ViewModel() { private val _uiState = MutableStateFlow(AccountSettingsUiState()) @@ -72,6 +72,7 @@ class AccountSettingsViewModel @Inject internal constructor( ResponseCode.SUCCESS.value -> { settingsRepository.resetSettings() weightTableRepository.resetAllWeightRows() + symbolRepository.removeImages() symbolRepository.resetSymbolsAndFavorites() userRepository.deleteUserInfo() hideAlert() @@ -93,6 +94,7 @@ class AccountSettingsViewModel @Inject internal constructor( ResponseCode.SUCCESS.value -> { settingsRepository.resetSettings() weightTableRepository.resetAllWeightRows() + symbolRepository.removeImages() symbolRepository.resetSymbolsAndFavorites() userRepository.deleteUserInfo() hideAlert() @@ -110,6 +112,7 @@ class AccountSettingsViewModel @Inject internal constructor( viewModelScope.launch { settingsRepository.resetSettings() weightTableRepository.resetAllWeightRows() + symbolRepository.removeImages() symbolRepository.resetSymbolsAndFavorites() userRepository.deleteUserInfo() } diff --git a/frontend/app/src/main/java/com/example/speechbuddy/viewmodel/MySymbolSettingsViewModel.kt b/frontend/app/src/main/java/com/example/speechbuddy/viewmodel/MySymbolSettingsViewModel.kt index b24b1bc5..30f4629d 100644 --- a/frontend/app/src/main/java/com/example/speechbuddy/viewmodel/MySymbolSettingsViewModel.kt +++ b/frontend/app/src/main/java/com/example/speechbuddy/viewmodel/MySymbolSettingsViewModel.kt @@ -80,6 +80,7 @@ class MySymbolSettingsViewModel @Inject internal constructor( val checkedSymbols = _checkedSymbols.toList() for (symbol in checkedSymbols) { symbolRepository.deleteSymbol(symbol) + symbolRepository.removeSelectedImage(symbol) weightTableRepository.updateWeightTableForDeletedSymbol(symbol) } _checkedSymbols.clear() diff --git a/frontend/app/src/main/res/values/strings.xml b/frontend/app/src/main/res/values/strings.xml index 2037f6fe..d13d8c7d 100644 --- a/frontend/app/src/main/res/values/strings.xml +++ b/frontend/app/src/main/res/values/strings.xml @@ -148,6 +148,7 @@ 저작권 정보 본 서비스의 그림상징은 \'한국형 보완대체의사소통용 기본상징 체계집\'의 일부로 박은혜, 김영태(이화여자대학교), 홍기형(성신여자대학교)에게 저작권이 있습니다.\n자료의 무단 사용 및 2차 가공, 배포, 상업적 용도로 사용하는 것을 금합니다. + 앱에서 사용된 새 아이콘은 Flaticon에서 Mihimihi가 제작했습니다 하단 아이콘을 눌러 원하는 기능을 이용하세요\n① 상징으로 말하기\n② 음성으로 말하기\n③ 새 상징 만들기\n④ 설정