From a4bb1f31ebc995268e3f93508fdbe7229c31f486 Mon Sep 17 00:00:00 2001 From: Juan Nascimento Date: Sat, 6 Jan 2024 14:02:01 -0300 Subject: [PATCH] refactor: code clean --- app/build.gradle.kts | 2 +- .../etb/filemanager/activity/BaseActivity.kt | 1 + .../filemanager/activity/SettingsActivity.kt | 6 +- .../presentation/components/NavigationComp.kt | 7 +- .../categorylist/CategoryListScreen.kt | 3 +- .../apklist/components/ApkComponent.kt | 5 - .../components/CategoryListScreen.kt | 1 - .../medialist/compenents/MediaComponents.kt | 42 -------- .../deletedfileslist/DeletedFileListScreen.kt | 6 +- .../components/BottomSheetInfo.kt | 71 ------------ .../compose/feature/provider/BaseScreen.kt | 12 --- .../filemanager/files/compat/ParcelCompat.kt | 13 +-- .../filemanager/files/extensions/ApkExt.kt | 8 +- .../files/extensions/UIExtensions.kt | 10 +- .../files/provider/archive/common/Archive.kt | 86 --------------- .../provider/archive/common/PathExtensions.kt | 8 -- .../properties/BasicPropertiesFragment.kt | 3 +- .../common/properties/FileProperties.kt | 1 + .../etb/filemanager/files/util/FileUtil.kt | 68 +----------- .../files/util/FragmentExtensions.kt | 98 +---------------- .../etb/filemanager/files/util/ImageUtils.kt | 30 ------ .../files/util/ParcelExtensions.kt | 2 - .../filemanager/files/util/ParcelableArgs.kt | 61 ----------- .../files/util/RecyclerViewUtils.kt | 9 +- .../etb/filemanager/fragment/HomeFragment.kt | 1 - .../filemanager/fragment/SettingsFragment.kt | 7 +- .../settings/util/SelectPreferenceUtils.kt | 81 -------------- .../manager/adapter/FileModelAdapter.kt | 74 ++----------- .../files/filecoroutine/FileOperation.kt | 76 +++++-------- .../files/filelist/FileListViewModel.kt | 20 +--- .../manager/files/filelist/KWatchChannel.kt | 24 +++-- .../files/services/FileOperationService.kt | 1 - .../files/ui/ModalBottomSheetCompress.kt | 2 +- .../manager/files/ui/components/APKInfoRow.kt | 10 -- .../filemanager/manager/media/BottomBar.kt | 44 +------- .../manager/media/MediaViewActivity.kt | 6 -- .../manager/media/MediaViewAppBar.kt | 1 - .../image/viewer/ImageViewerItemFragment.kt | 39 ++----- .../filemanager/manager/media/model/Media.kt | 26 ----- .../manager/util/MaterialDialogUtils.kt | 42 +------- .../preference/AppearancePreferences.kt | 6 +- .../preference/BehaviorPreferences.kt | 15 +-- .../preference/InterfacePreferences.kt | 24 ++--- .../com/etb/filemanager/ui/style/IconUtil.kt | 78 +++++--------- .../filemanager/ui/view/ReadOnlyEditText.kt | 102 ------------------ .../ui/view/ReadOnlyTextInputLayout.kt | 87 --------------- ...crollingViewOnApplyWindowInsetsListener.kt | 1 + 47 files changed, 143 insertions(+), 1177 deletions(-) delete mode 100644 app/src/main/java/com/etb/filemanager/files/provider/archive/common/Archive.kt delete mode 100644 app/src/main/java/com/etb/filemanager/ui/view/ReadOnlyEditText.kt delete mode 100644 app/src/main/java/com/etb/filemanager/ui/view/ReadOnlyTextInputLayout.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2342e331..641e4869 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -82,7 +82,7 @@ dependencies { val material3 = "1.2.0-alpha05" val navigationVersion = "2.6.0" - val composeBom = platform("androidx.compose:compose-bom:2023.08.00") + val composeBom = platform("androidx.compose:compose-bom:2023.10.01") val roomVersion = "2.5.2" diff --git a/app/src/main/java/com/etb/filemanager/activity/BaseActivity.kt b/app/src/main/java/com/etb/filemanager/activity/BaseActivity.kt index 028e987c..c678ab29 100644 --- a/app/src/main/java/com/etb/filemanager/activity/BaseActivity.kt +++ b/app/src/main/java/com/etb/filemanager/activity/BaseActivity.kt @@ -31,6 +31,7 @@ abstract class BaseActivity : AppCompatActivity() { styleManager.setTheme(optionStyle, this) } + @Suppress("DEPRECATION") fun applyConfigurationChangesToActivities(savedInstanceState: Bundle) { val intent = Intent(this, SettingsActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK diff --git a/app/src/main/java/com/etb/filemanager/activity/SettingsActivity.kt b/app/src/main/java/com/etb/filemanager/activity/SettingsActivity.kt index 69bfaaf4..afc2a77d 100644 --- a/app/src/main/java/com/etb/filemanager/activity/SettingsActivity.kt +++ b/app/src/main/java/com/etb/filemanager/activity/SettingsActivity.kt @@ -93,11 +93,9 @@ class SettingsActivity : BaseActivity(), } } - fun getIntent(context: Context, vararg paths: String?): Intent { + fun getIntent(context: Context, vararg paths: String): Intent { val intent = Intent(context, SettingsActivity::class.java) - if (paths != null) { - intent.data = SettingsActivity().getSettingUri(*paths as Array) - } + intent.data = SettingsActivity().getSettingUri(*paths) return intent } diff --git a/app/src/main/java/com/etb/filemanager/compose/core/presentation/components/NavigationComp.kt b/app/src/main/java/com/etb/filemanager/compose/core/presentation/components/NavigationComp.kt index ad3dea05..b202b940 100644 --- a/app/src/main/java/com/etb/filemanager/compose/core/presentation/components/NavigationComp.kt +++ b/app/src/main/java/com/etb/filemanager/compose/core/presentation/components/NavigationComp.kt @@ -11,17 +11,16 @@ import android.os.Build import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.layout.PaddingValues import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable -import androidx.navigation.compose.currentBackStackEntryAsState import com.etb.filemanager.compose.core.presentation.common.ChanneledViewModel import com.etb.filemanager.compose.core.presentation.util.Screen import com.etb.filemanager.compose.feature.presentation.categorylist.components.CategoryListScreen +import com.etb.filemanager.files.extensions.parcelable import com.etb.filemanager.manager.category.adapter.CategoryFileModel import com.etb.filemanager.manager.media.MediaViewScreen import com.etb.filemanager.manager.media.model.MediaListInfo @@ -38,8 +37,6 @@ fun NavigationComp( ) { - val navBackStackEntry by navController.currentBackStackEntryAsState() - val navPipe = hiltViewModel() navPipe .initWithNav(navController) @@ -73,7 +70,7 @@ fun NavigationComp( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { backStackEntry.arguments?.getParcelable("mediaInfo", MediaListInfo::class.java) } else { - backStackEntry.arguments?.getParcelable("mediaInfo") + backStackEntry.arguments?.parcelable("mediaInfo") } MediaViewScreen( diff --git a/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/CategoryListScreen.kt b/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/CategoryListScreen.kt index ca841e1c..1cae7e7d 100644 --- a/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/CategoryListScreen.kt +++ b/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/CategoryListScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.navigation.compose.rememberNavController import com.etb.filemanager.compose.core.presentation.components.NavigationComp import com.etb.filemanager.compose.feature.provider.BaseScreen +import com.etb.filemanager.files.extensions.parcelable import com.etb.filemanager.files.util.toggleOrientation import com.etb.filemanager.manager.category.adapter.CategoryFileModel import com.etb.filemanager.manager.category.adapter.getName @@ -35,7 +36,7 @@ class CategoryListScreen : BaseScreen() { categoryFileModel = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { intent.getParcelableExtra("categoryFileModel", CategoryFileModel::class.java) } else { - intent.getParcelableExtra("categoryFileModel") + intent.parcelable("categoryFileModel") } } diff --git a/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/apklist/components/ApkComponent.kt b/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/apklist/components/ApkComponent.kt index 068c112d..690663a1 100644 --- a/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/apklist/components/ApkComponent.kt +++ b/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/apklist/components/ApkComponent.kt @@ -40,9 +40,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.FilterQuality -import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign @@ -66,7 +64,6 @@ import java.nio.file.Paths @Composable fun ApkItem(apkInfo: AppInfo, appFilter: AppFilter) { val resolvedColor = MaterialTheme.colorScheme.onSecondary - val colorOnSecondary = Color(resolvedColor.toArgb()) var expanded by remember { mutableStateOf(false) } var isAppInfoBottomSheetExpanded by remember { mutableStateOf(false) } @@ -191,8 +188,6 @@ fun ApkItemOptionsColum( onButtonClickShowAppInfo: (() -> Unit)? = null, isAppInfoBottomSheetExpanded: Boolean ) { - val coroutineScope = rememberCoroutineScope() - val resolvedColor = MaterialTheme.colorScheme.onSecondary val colorOnSecondary = MaterialTheme.colorScheme.surfaceColorAtElevation(2.0.dp) val context = LocalContext.current val textInfo = if (isAppInfoBottomSheetExpanded) "Open in Settings" else "Info" diff --git a/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/components/CategoryListScreen.kt b/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/components/CategoryListScreen.kt index d132286b..fa161e75 100644 --- a/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/components/CategoryListScreen.kt +++ b/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/components/CategoryListScreen.kt @@ -76,7 +76,6 @@ fun GeneratingMediaList( val coroutineScope = rememberCoroutineScope() val context = LocalContext.current - val mediaListState by viewModel.mediaListState.observeAsState(emptyList()) val loading by viewModel.loading.observeAsState(initial = true) val mediaUiState by viewModel.uiState.collectAsStateWithLifecycle() diff --git a/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/medialist/compenents/MediaComponents.kt b/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/medialist/compenents/MediaComponents.kt index 49718592..7e563c36 100644 --- a/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/medialist/compenents/MediaComponents.kt +++ b/app/src/main/java/com/etb/filemanager/compose/feature/presentation/categorylist/medialist/compenents/MediaComponents.kt @@ -7,7 +7,6 @@ package com.etb.filemanager.compose.feature.presentation.categorylist.medialist.compenents -import android.graphics.Bitmap import android.graphics.drawable.Drawable import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.ExperimentalFoundationApi @@ -34,19 +33,14 @@ import androidx.compose.material.icons.rounded.PlayCircle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.FilterQuality import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp -import coil.compose.rememberAsyncImagePainter -import coil.request.ImageRequest import com.bumptech.glide.RequestBuilder import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage @@ -78,46 +72,13 @@ fun MediaItem( context ).formatMinSec() else null - val imageRequest = ImageRequest.Builder(LocalContext.current) - .data(media.uri) - .memoryCacheKey("${media.uri}_${media.mimeType.value}") - .diskCacheKey("${media.uri}_${media.mimeType.value}") - .crossfade(true) - .bitmapConfig( Bitmap.Config.RGB_565) - .build() - - val painter = rememberAsyncImagePainter( - model = imageRequest, - contentScale = ContentScale.Crop, - filterQuality = FilterQuality.None - ) - Box( modifier = modifier .aspectRatio(1f) .size(100.dp) ) { - /* GlideImage( - modifier = Modifier - .fillMaxSize() - .background(color = MaterialTheme.colorScheme.surfaceContainerHigh), - contentDescription = "null", - contentScale = ContentScale.Crop, - model = media.uri - ) { - it.thumbnail(preloadRequestBuilder) - .signature(MediaKey(media.id, media.mimeType)) - .format(DecodeFormat.PREFER_RGB_565).override(270) - }*/ - /* AsyncImage( - modifier = Modifier - .fillMaxSize() - .background(color = MaterialTheme.colorScheme.surfaceContainerHigh), - model = imageRequest, - contentDescription = "image", - contentScale = ContentScale.Crop,)*/ GlideImage( modifier = Modifier .fillMaxSize() @@ -183,9 +144,7 @@ fun LazyGridItemScope.MediaComponent( media: Media, preloadRequestBuilder: RequestBuilder, onItemClick: (Media) -> Unit, - onItemLongClick: (Media) -> Unit, ) { - val isSelected = remember { mutableStateOf(false) } MediaItem( media = media, @@ -240,7 +199,6 @@ fun MediaGridView( MediaComponent( media = media, onItemClick = { onMediaClick(mediaList.toMediaListInfo(it)) }, - onItemLongClick = {}, preloadRequestBuilder = preloadRequestBuilder ) } diff --git a/app/src/main/java/com/etb/filemanager/compose/feature/presentation/deletedfiles/deletedfileslist/DeletedFileListScreen.kt b/app/src/main/java/com/etb/filemanager/compose/feature/presentation/deletedfiles/deletedfileslist/DeletedFileListScreen.kt index 1bfc532e..8a048640 100644 --- a/app/src/main/java/com/etb/filemanager/compose/feature/presentation/deletedfiles/deletedfileslist/DeletedFileListScreen.kt +++ b/app/src/main/java/com/etb/filemanager/compose/feature/presentation/deletedfiles/deletedfileslist/DeletedFileListScreen.kt @@ -7,7 +7,6 @@ package com.etb.filemanager.compose.feature.presentation.deletedfiles.deletedfileslist -import android.os.Build import android.os.Bundle import androidx.activity.compose.setContent import androidx.compose.animation.AnimatedVisibility @@ -68,8 +67,8 @@ import com.etb.filemanager.R import com.etb.filemanager.compose.feature.presentation.deletedfiles.DeletedFileDetailsViewModel import com.etb.filemanager.compose.feature.presentation.deletedfiles.DeletedFileEntryViewModel import com.etb.filemanager.compose.feature.presentation.deletedfiles.DeletedIFilesViewModel -import com.etb.filemanager.compose.feature.presentation.deletedfiles.toDeletedFileDetails import com.etb.filemanager.compose.feature.presentation.deletedfiles.deletedfileslist.components.BottomSheetInfo +import com.etb.filemanager.compose.feature.presentation.deletedfiles.toDeletedFileDetails import com.etb.filemanager.compose.feature.provider.AppViewModelProvider import com.etb.filemanager.compose.feature.provider.BaseScreen import com.etb.filemanager.data.deletedfiles.DeletedFile @@ -92,6 +91,7 @@ class DeletedFileListScreen : BaseScreen() { super.onCreate(savedInstanceState) val bundle = intent.extras +/* if (bundle != null) { fileModel = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { intent.getParcelableExtra("fileModel", FileModel::class.java) @@ -99,6 +99,7 @@ class DeletedFileListScreen : BaseScreen() { intent.getParcelableExtra("fileModel") } } +*/ if (bundle != null) { pathList = bundle.getStringArrayList("pathList")?.toList() } @@ -176,7 +177,6 @@ class DeletedFileListScreen : BaseScreen() { val colorOnSecondary = Color(resolvedColor.toArgb()) var expanded by remember { mutableStateOf(false) } var deleted by remember { mutableStateOf(false) } - var showBottomSheetInfo by remember { mutableStateOf(false) } val extraHeight by animateDpAsState( targetValue = if (expanded) 100.dp else 75.dp, animationSpec = spring( diff --git a/app/src/main/java/com/etb/filemanager/compose/feature/presentation/deletedfiles/deletedfileslist/components/BottomSheetInfo.kt b/app/src/main/java/com/etb/filemanager/compose/feature/presentation/deletedfiles/deletedfileslist/components/BottomSheetInfo.kt index 85f96b39..a4bfa8fa 100644 --- a/app/src/main/java/com/etb/filemanager/compose/feature/presentation/deletedfiles/deletedfileslist/components/BottomSheetInfo.kt +++ b/app/src/main/java/com/etb/filemanager/compose/feature/presentation/deletedfiles/deletedfileslist/components/BottomSheetInfo.kt @@ -13,7 +13,6 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -22,26 +21,20 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Card import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ListItem -import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb -import androidx.compose.ui.platform.ClipboardManager -import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.etb.filemanager.R @@ -80,10 +73,6 @@ private fun BottomSheetContainer( content: @Composable () -> Unit ) { - val resolvedColor = MaterialTheme.colorScheme.onSecondary - val colorOnSecondary = Color(resolvedColor.toArgb()) - - Column( modifier = Modifier @@ -120,7 +109,6 @@ private fun BottomSheetContainer( @Composable fun BottomSheetButtonsRow(){ - val coroutineScope = rememberCoroutineScope() val resolvedColor = MaterialTheme.colorScheme.onSecondary val colorOnSecondary = Color(resolvedColor.toArgb()) @@ -181,64 +169,5 @@ fun BottomSheetButton( } -@Preview(showBackground = true, showSystemUi = true) -@Composable -fun PreviewBottomSheet(){ - BottomSheetInfo() -} - -@Composable -@Preview(showBackground = false) -fun BottomSheetButtonPreview(){ - val resolvedColor = MaterialTheme.colorScheme.onSecondary - val colorOnSecondary = Color(resolvedColor.toArgb()) - - BottomSheetButton( - text = "Ok", - modifier = Modifier - .background(color = colorOnSecondary, shape = AppShapes.cutLeftMedium)){ - - } -} - -@Composable -@Preview -fun BottomSheetButtonsRowPreview(){ - BottomSheetButtonsRow() -} - -@Composable -fun APKInfoRow( - modifier: Modifier = Modifier, - label: String, - content: String, -) { - val clipboardManager: ClipboardManager = LocalClipboardManager.current - ListItem( - modifier = modifier - .fillMaxSize() - .clip(Shapes.medium), - colors = ListItemDefaults.colors( - containerColor = Color.Transparent - ), - headlineContent = { - Text( - text = label, - fontWeight = FontWeight.Medium - ) - }, - supportingContent = { - Text(text = content) - } - ) -} -@Composable -@Preview -fun PreviewBottomSheetContainer(){ - BottomSheetContainer { - APKInfoRow(label = "Labe", content = "conetn",) - - } -} \ No newline at end of file diff --git a/app/src/main/java/com/etb/filemanager/compose/feature/provider/BaseScreen.kt b/app/src/main/java/com/etb/filemanager/compose/feature/provider/BaseScreen.kt index 7d757afd..c6cb433b 100644 --- a/app/src/main/java/com/etb/filemanager/compose/feature/provider/BaseScreen.kt +++ b/app/src/main/java/com/etb/filemanager/compose/feature/provider/BaseScreen.kt @@ -8,13 +8,9 @@ package com.etb.filemanager.compose.feature.provider import android.content.Context -import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity -import com.etb.filemanager.activity.SettingsActivity -import com.etb.filemanager.files.util.Args import com.etb.filemanager.files.util.LocaleContextWrapper -import com.etb.filemanager.files.util.putArgs import com.etb.filemanager.settings.preference.Preferences import com.etb.filemanager.ui.style.StyleManager @@ -32,14 +28,6 @@ abstract class BaseScreen : ComponentActivity() { styleManager.setTheme(optionStyle, this) } - fun applyConfigurationChangesToActivities(savedInstanceState: Bundle) { - val intent = Intent(this, SettingsActivity::class.java) - intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK - intent.putArgs(Args(savedInstanceState)) - startActivity(intent) - overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out) - finishAffinity() - } override fun attachBaseContext(newBase: Context) { val context = LocaleContextWrapper.wrap(newBase) super.attachBaseContext(context) diff --git a/app/src/main/java/com/etb/filemanager/files/compat/ParcelCompat.kt b/app/src/main/java/com/etb/filemanager/files/compat/ParcelCompat.kt index 74782da7..49294ba4 100644 --- a/app/src/main/java/com/etb/filemanager/files/compat/ParcelCompat.kt +++ b/app/src/main/java/com/etb/filemanager/files/compat/ParcelCompat.kt @@ -15,20 +15,14 @@ package com.etb.filemanager.files.compat import android.os.Build import android.os.Parcel import android.os.Parcelable -import androidx.core.os.ParcelCompat -fun Parcel.readBooleanCompat(): Boolean = ParcelCompat.readBoolean(this) - -fun Parcel.writeBooleanCompat(value: Boolean) { - ParcelCompat.writeBoolean(this, value) -} fun > Parcel.readParcelableListCompat( list: L, classLoader: ClassLoader? ): L { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - @Suppress("UNCHECKED_CAST") + @Suppress("UNCHECKED_CAST", "DEPRECATION") return readParcelableList(list, classLoader) as L } else { val size = readInt() @@ -38,7 +32,7 @@ fun > Parcel.readParcelableListCompat( } val listSize = list.size for (index in 0 until size) { - @Suppress("UNCHECKED_CAST") + @Suppress("UNCHECKED_CAST", "DEPRECATION") val element = readParcelable(classLoader) as E if (index < listSize) { list[index] = element @@ -67,6 +61,3 @@ fun Parcel.writeParcelableListCompat(value: List?, flags: I } } } - -@Suppress("UNCHECKED_CAST") -fun Parcel.readSerializableCompat(): T? = readSerializable() as T? \ No newline at end of file diff --git a/app/src/main/java/com/etb/filemanager/files/extensions/ApkExt.kt b/app/src/main/java/com/etb/filemanager/files/extensions/ApkExt.kt index c0ea3a45..18edcbc5 100644 --- a/app/src/main/java/com/etb/filemanager/files/extensions/ApkExt.kt +++ b/app/src/main/java/com/etb/filemanager/files/extensions/ApkExt.kt @@ -31,9 +31,8 @@ fun Context.getPackageApk(path: Path): String { val apkFilePath = path.pathString val packageInfo = packageManager.getPackageArchiveInfo(apkFilePath, PackageManager.GET_META_DATA) - val packageName = packageInfo?.packageName.toString() - return packageName + return packageInfo?.packageName.toString() } @@ -57,7 +56,6 @@ suspend fun getInstalledApkInfo(context: Context, appFilter: AppFilter): List = withContext val appName = packageInfo.applicationInfo.loadLabel(pm).toString() val appIcon = packageInfo.applicationInfo.loadIcon(pm) val packageName = packageInfo.packageName - val versionCode = PackageInfoCompat.getLongVersionCode(packageInfo) apkInfoList.add( AppInfo( @@ -150,8 +147,6 @@ fun openApp(context: Context, packageName: String) { if (intent != null) { context.startActivity(intent) - } else { - } } @@ -171,7 +166,6 @@ fun openAppSettings(context: Context, packageName: String) { fun installApk(context: Context, apkFilePath: Path) { - // val uri = apkFilePath.fileProviderUri val uri = FileProvider.getUriForFile( context, context.packageName + ".fileprovider", diff --git a/app/src/main/java/com/etb/filemanager/files/extensions/UIExtensions.kt b/app/src/main/java/com/etb/filemanager/files/extensions/UIExtensions.kt index b1cd240a..cf671393 100644 --- a/app/src/main/java/com/etb/filemanager/files/extensions/UIExtensions.kt +++ b/app/src/main/java/com/etb/filemanager/files/extensions/UIExtensions.kt @@ -21,14 +21,10 @@ import com.google.android.material.shape.ShapeAppearanceModel fun Int.toPixelFromDP(): Int { val density = Resources.getSystem().displayMetrics.density - val pixelValue = (this * density).toInt() - return pixelValue + return (this * density).toInt() } -fun View.applyBackgroundFromPreferences( - cornerSize: Float? = null, cornerFamily: Int = Preferences.Interface.cornerFamily -) { - val mCornerSize = cornerSize ?: if (Preferences.Interface.isEnabledRoundedCorners) 30f else 0f +fun View.applyBackgroundFromPreferences() { val context = this.context val colorPrimary = context.getColorByAttr(com.google.android.material.R.attr.colorPrimary) val showBackground = true @@ -97,8 +93,6 @@ fun ShapeAppearanceModel.Builder.applyCornerFamilyFromPreferences( fun getShapeFromPreferences( cornerFamily: Int = Preferences.Interface.cornerFamily, cornerSize: Float = 30f ): CornerBasedShape { - var roundedCornerShape: CornerBasedShape = RoundedCornerShape(cornerSize) - return when (cornerFamily) { CornerStyle.ROUNDED.cornerFamily -> { diff --git a/app/src/main/java/com/etb/filemanager/files/provider/archive/common/Archive.kt b/app/src/main/java/com/etb/filemanager/files/provider/archive/common/Archive.kt deleted file mode 100644 index 287974c0..00000000 --- a/app/src/main/java/com/etb/filemanager/files/provider/archive/common/Archive.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2023 Juan Nascimento - * Part of FileManagerSphere - Archive.kt - * SPDX-License-Identifier: GPL-3.0-or-later - * More details at: https://www.gnu.org/licenses/ - */ - -package com.etb.filemanager.files.provider.archive.common - -import android.util.Log -import java.io.* -import java.util.zip.ZipEntry -import java.util.zip.ZipOutputStream - - -fun writeFileInBytes(contentInBytes: ByteArray, outputPath: String) { - try { - val fout = FileOutputStream(outputPath) - fout.write(contentInBytes) - if (fout != null) { - fout.close() - } - } catch (e: FileNotFoundException) { - Log.e("ERRO AO ESCREVER", "Erro: $e") - } catch (e: IOException) { - Log.e("ERRO AO ESCREVER 1", "Erro: $e") - - } -} - -fun readFile(file: File?): ByteArray? { - var fileContent: ByteArray? = null - var bis: BufferedInputStream? = null - try { - bis = BufferedInputStream(FileInputStream(file)) - val fileSize = bis.available() - fileContent = ByteArray(fileSize) - bis.read(fileContent) - if (bis != null) { - bis.close() - } - } catch (e: FileNotFoundException) { - e.printStackTrace() - } catch (e: IOException) { - e.printStackTrace() - } - return fileContent -} - -fun zipMultipleFile(files: Array): ByteArray? { - val filesInZip: ByteArray? = null - val byteOutStream = ByteArrayOutputStream() - val zipOutStream = ZipOutputStream(byteOutStream) - - for (file in files) { - val fileContentInBytes = readFile(file) - if (fileContentInBytes != null && fileContentInBytes.isNotEmpty()) { - val eachFileName = file.name - val zipEntry = ZipEntry(eachFileName) - try { - zipOutStream.putNextEntry(zipEntry) - zipOutStream.write( - fileContentInBytes, 0, fileContentInBytes.size - ) - zipOutStream.closeEntry() - } catch (e: IOException) { - Log.e("ERRO AO COMPACTAR", "Erro: $e") - - } - } - } - try { - zipOutStream.finish() - } catch (e: IOException) { - Log.e("ERRO AO COMPACTAR", "Erro: $e") - - } - try { - zipOutStream.close() - } catch (e: IOException) { - Log.e("ERRO AO COMPACTAR", "Erro: $e") - - } - - return filesInZip -} \ No newline at end of file diff --git a/app/src/main/java/com/etb/filemanager/files/provider/archive/common/PathExtensions.kt b/app/src/main/java/com/etb/filemanager/files/provider/archive/common/PathExtensions.kt index f33745e5..0f7bd6ad 100644 --- a/app/src/main/java/com/etb/filemanager/files/provider/archive/common/PathExtensions.kt +++ b/app/src/main/java/com/etb/filemanager/files/provider/archive/common/PathExtensions.kt @@ -23,14 +23,6 @@ val Path.provider: FileSystemProvider get() = fileSystem.provider() -fun AutoCloseable.closeSafe() { - try { - close() - } catch (e: Exception) { - e.printStackTrace() - } -} - @Throws(IOException::class) fun Path.search(query: String, intervalMillis: Long, listener: (List) -> Unit) { val searchResults = mutableListOf() diff --git a/app/src/main/java/com/etb/filemanager/files/provider/archive/common/properties/BasicPropertiesFragment.kt b/app/src/main/java/com/etb/filemanager/files/provider/archive/common/properties/BasicPropertiesFragment.kt index 639059ef..fa959175 100644 --- a/app/src/main/java/com/etb/filemanager/files/provider/archive/common/properties/BasicPropertiesFragment.kt +++ b/app/src/main/java/com/etb/filemanager/files/provider/archive/common/properties/BasicPropertiesFragment.kt @@ -21,6 +21,7 @@ import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.RequestOptions import com.etb.filemanager.R +import com.etb.filemanager.files.extensions.parcelable import com.etb.filemanager.files.provider.archive.common.mime.MediaType @@ -47,7 +48,7 @@ class BasicPropertiesFragment() : Fragment() { arguments?.let { param1 = it.getString(ARG_PARAM1) param2 = it.getString(ARG_PARAM2) - fileProperties = it.getParcelableArrayList(ARG_FILE_PROPERTIES) + fileProperties = it.parcelable(ARG_FILE_PROPERTIES) } diff --git a/app/src/main/java/com/etb/filemanager/files/provider/archive/common/properties/FileProperties.kt b/app/src/main/java/com/etb/filemanager/files/provider/archive/common/properties/FileProperties.kt index 09ac6558..a84c8c24 100644 --- a/app/src/main/java/com/etb/filemanager/files/provider/archive/common/properties/FileProperties.kt +++ b/app/src/main/java/com/etb/filemanager/files/provider/archive/common/properties/FileProperties.kt @@ -19,6 +19,7 @@ data class FileProperties(var title: String, var isMedia: Boolean = false, var mediaType: MediaType = MediaType.VIDEO, var mediaPath: String = "") : Parcelable { + @Suppress("DEPRECATION") @RequiresApi(Build.VERSION_CODES.Q) constructor(parcel: Parcel) : this( parcel.readString() ?: "", diff --git a/app/src/main/java/com/etb/filemanager/files/util/FileUtil.kt b/app/src/main/java/com/etb/filemanager/files/util/FileUtil.kt index 9e3442e1..12647ed3 100644 --- a/app/src/main/java/com/etb/filemanager/files/util/FileUtil.kt +++ b/app/src/main/java/com/etb/filemanager/files/util/FileUtil.kt @@ -22,10 +22,8 @@ import com.etb.filemanager.BuildConfig import com.google.gson.Gson import com.google.gson.reflect.TypeToken import java.io.* -import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths -import java.nio.file.StandardCopyOption class FileUtil { @@ -44,58 +42,6 @@ class FileUtil { return path.fileName.toString() } - - fun getFileExtension(path: Path): String { - val fileName = path.fileName.toString() - val dotIndex = fileName.lastIndexOf(".") - return if (dotIndex > 0 && dotIndex < fileName.length - 1) { - fileName.substring(dotIndex + 1).toLowerCase() - } else { - "" - } - } - - fun getFileSize(path: Path): Long { - return Files.size(path) - } - - fun createFolder(path: String, pathName: String): Boolean { - val folderPath = Paths.get("$path/$pathName") - - return try { - Files.createDirectory(folderPath) - true - } catch (e: IOException) { - Log.e("Erro ao criar a pasta", "Erro: $e") - false - - } - } - - fun isValidName(name: String): Boolean { - return isValidNameFolder(name) - - } - - private fun isValidNameFolder(folderName: String): Boolean { - val regex = Regex("^[^/\\\\?%*:|\"<>]*$") // Padrão regex para validar o nome da pasta - return regex.matches(folderName) - - } - - - fun renameFile(path: String, newFileName: String) { - val sourcePath = Paths.get(path) - val targetPath = sourcePath.resolveSibling(newFileName) - - try { - Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING) - } catch (e: Exception) { - Log.e("Erro ao renomear", "Erro: ${e.message}") - Log.e("File", "sourcePath: $sourcePath\ntargetPath: $targetPath\nnewFileName: $newFileName") - } - } - fun copyTextToClipboard(context: Context, text: String, toast: Boolean) { val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clipData = ClipData.newPlainText("label", text) @@ -176,17 +122,6 @@ class FileUtil { return null } - fun getFileMimeType(mPath: String): String? { - val path: Path = Paths.get(mPath) - val mimeType: String? - try { - mimeType = Files.probeContentType(path) - } catch (e: Exception) { - Log.e("Get File", "Erro: $e") - return null - } - return mimeType - } fun getFilePathFromUri(context: Context, uri: Uri): String? { var filePath: String? = null @@ -253,6 +188,5 @@ fun jsonStringToList(jsonString: String?): List { } fun stringListToJsonString(stringList: List): String { - val jsonString = Gson().toJson(stringList) - return jsonString + return Gson().toJson(stringList) } diff --git a/app/src/main/java/com/etb/filemanager/files/util/FragmentExtensions.kt b/app/src/main/java/com/etb/filemanager/files/util/FragmentExtensions.kt index cafb0c27..da50b505 100644 --- a/app/src/main/java/com/etb/filemanager/files/util/FragmentExtensions.kt +++ b/app/src/main/java/com/etb/filemanager/files/util/FragmentExtensions.kt @@ -7,116 +7,20 @@ package com.etb.filemanager.files.util -import com.etb.filemanager.files.provider.archive.common.mime.compat.checkSelfPermissionCompat - -import android.content.ActivityNotFoundException -import android.content.Intent -import android.os.Bundle -import androidx.annotation.AnimRes import androidx.annotation.ArrayRes -import androidx.annotation.AttrRes -import androidx.annotation.BoolRes -import androidx.annotation.ColorInt -import androidx.annotation.DimenRes -import androidx.annotation.Dimension -import androidx.annotation.IntegerRes -import androidx.annotation.InterpolatorRes import androidx.annotation.PluralsRes import androidx.fragment.app.Fragment -fun Fragment.checkSelfPermission(permission: String) = - requireContext().checkSelfPermissionCompat(permission) - -fun Fragment.finish() = requireActivity().finish() - -fun Fragment.getAnimation(@AnimRes id: Int) = requireContext().getAnimation(id) - -fun Fragment.getBoolean(@BoolRes id: Int) = requireContext().getBoolean(id) - -fun Fragment.getDimension(@DimenRes id: Int) = requireContext().getDimension(id) - -fun Fragment.getDimensionPixelOffset(@DimenRes id: Int) = - requireContext().getDimensionPixelOffset(id) - -fun Fragment.getDimensionPixelSize(@DimenRes id: Int) = requireContext().getDimensionPixelSize(id) - -fun Fragment.getInteger(@IntegerRes id: Int) = requireContext().getInteger(id) - -fun Fragment.getInterpolator(@InterpolatorRes id: Int) = requireContext().getInterpolator(id) - fun Fragment.getQuantityString(@PluralsRes id: Int, quantity: Int): String = requireContext().getQuantityString(id, quantity) fun Fragment.getQuantityString( - @PluralsRes id: Int, - quantity: Int, - vararg formatArgs: Any? + @PluralsRes id: Int, quantity: Int, vararg formatArgs: Any? ): String = requireContext().getQuantityString(id, quantity, *formatArgs) -fun Fragment.getQuantityText(@PluralsRes id: Int, quantity: Int): CharSequence = - requireContext().getQuantityText(id, quantity) fun Fragment.getStringArray(@ArrayRes id: Int) = requireContext().getStringArray(id) -fun Fragment.getTextArray(@ArrayRes id: Int): Array = - requireContext().getTextArray(id) - -@ColorInt -fun Fragment.getColorByAttr(@AttrRes attr: Int) = requireContext().getColorByAttr(attr) - -fun Fragment.getColorStateListByAttr(@AttrRes attr: Int) = - requireContext().getColorStateListByAttr(attr) - -@Dimension -fun Fragment.dpToDimension(@Dimension(unit = Dimension.DP) dp: Float) = - requireContext().dpToDimension(dp) - -@Dimension -fun Fragment.dpToDimension(@Dimension(unit = Dimension.DP) dp: Int) = - requireContext().dpToDimension(dp) - -@Dimension -fun Fragment.dpToDimensionPixelOffset(@Dimension(unit = Dimension.DP) dp: Float) = - requireContext().dpToDimensionPixelOffset(dp) - -@Dimension -fun Fragment.dpToDimensionPixelOffset(@Dimension(unit = Dimension.DP) dp: Int) = - requireContext().dpToDimensionPixelOffset(dp) - -@Dimension -fun Fragment.dpToDimensionPixelSize(@Dimension(unit = Dimension.DP) dp: Float) = - requireContext().dpToDimensionPixelSize(dp) - -@Dimension -fun Fragment.dpToDimensionPixelSize(@Dimension(unit = Dimension.DP) dp: Int) = - requireContext().dpToDimensionPixelSize(dp) - -fun Fragment.setResult(resultCode: Int, resultData: Intent? = null) = - requireActivity().setResult(resultCode, resultData) - -val Fragment.shortAnimTime - get() = requireContext().shortAnimTime - -val Fragment.mediumAnimTime - get() = requireContext().mediumAnimTime - -val Fragment.longAnimTime - get() = requireContext().longAnimTime - - - -fun Fragment.startActivitySafe(intent: Intent, options: Bundle? = null) { - try { - startActivity(intent, options) - } catch (e: ActivityNotFoundException) { - } -} -fun Fragment.startActivityForResultSafe(intent: Intent, requestCode: Int, options: Bundle? = null) { - try { - startActivityForResult(intent, requestCode, options) - } catch (e: ActivityNotFoundException) { - } -} \ No newline at end of file diff --git a/app/src/main/java/com/etb/filemanager/files/util/ImageUtils.kt b/app/src/main/java/com/etb/filemanager/files/util/ImageUtils.kt index 69c995fd..b20a8b85 100644 --- a/app/src/main/java/com/etb/filemanager/files/util/ImageUtils.kt +++ b/app/src/main/java/com/etb/filemanager/files/util/ImageUtils.kt @@ -22,7 +22,6 @@ import com.etb.filemanager.manager.adapter.loadFileItem import com.etb.filemanager.manager.media.model.Media import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import java.io.File import java.nio.file.Path import java.nio.file.Paths @@ -72,30 +71,6 @@ fun getMediaURIsFromDirectory(path: Path): List { return mediaURIs } -fun Context.getMediaIdFromPath(mediaPath: String): Long? { - val context = this - val projection = arrayOf(MediaStore.Images.Media._ID) - val selection = "${MediaStore.MediaColumns.DATA} = ?" - val selectionArgs = arrayOf(mediaPath) - val mime = FileUtil().getMimeType(null, mediaPath) - val queryUri = if (mediaPath.endsWith(".mp4")) { - MediaStore.Video.Media.EXTERNAL_CONTENT_URI - } else { - MediaStore.Images.Media.EXTERNAL_CONTENT_URI - } - - context.contentResolver.query( - queryUri, projection, selection, selectionArgs, null - )?.use { cursor -> - if (cursor.moveToFirst()) { - val idColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID) - return cursor.getLong(idColumnIndex) - } - } - - return null -} - suspend fun getMediaIdFromPath(mediaPath: String, context: Context): Long? = withContext(Dispatchers.IO) { val projection = arrayOf(MediaStore.Images.Media._ID) @@ -123,9 +98,6 @@ suspend fun getMediaIdFromPath(mediaPath: String, context: Context): Long? = return@withContext null } -fun getMediaIdFromFile(file: File) { - val path = file.toPath() -} suspend fun fetchRecentImagesUris( context: Context, @@ -163,8 +135,6 @@ suspend fun getAllMediaFromMediaStore( val mediaList = ArrayList() val fileModelList = mutableListOf() val projection = arrayOf(MediaStore.MediaColumns.DATA) - val selection = MediaStore.MediaColumns.MIME_TYPE + "=?" - val selectionArgs = arrayOf(mimeType.value) val sortOrder = "${MediaStore.Images.Media.DATE_ADDED} DESC" val cursor = context.contentResolver.query( diff --git a/app/src/main/java/com/etb/filemanager/files/util/ParcelExtensions.kt b/app/src/main/java/com/etb/filemanager/files/util/ParcelExtensions.kt index f6c5773f..826ad96a 100644 --- a/app/src/main/java/com/etb/filemanager/files/util/ParcelExtensions.kt +++ b/app/src/main/java/com/etb/filemanager/files/util/ParcelExtensions.kt @@ -20,8 +20,6 @@ import kotlin.contracts.InvocationKind import kotlin.contracts.contract import com.etb.filemanager.files.compat.readParcelableListCompat -inline fun Parcel.readParcelable(): T? = - readParcelable(T::class.java.classLoader) fun Parcel.readParcelableListCompat(classLoader: ClassLoader?): List = readParcelableListCompat(mutableListOf(), classLoader) diff --git a/app/src/main/java/com/etb/filemanager/files/util/ParcelableArgs.kt b/app/src/main/java/com/etb/filemanager/files/util/ParcelableArgs.kt index 7cc7f28d..c4f81e11 100644 --- a/app/src/main/java/com/etb/filemanager/files/util/ParcelableArgs.kt +++ b/app/src/main/java/com/etb/filemanager/files/util/ParcelableArgs.kt @@ -13,88 +13,27 @@ package com.etb.filemanager.files.util */ -import android.app.Activity import android.content.Intent import android.os.Bundle import android.os.Parcelable -import androidx.annotation.MainThread -import androidx.fragment.app.Fragment import kotlinx.parcelize.Parcelize import kotlinx.parcelize.WriteWith import kotlin.reflect.KClass - interface ParcelableArgs : Parcelable -fun Bundle.putArgs(args: Args, argsClass: KClass): Bundle { - putParcelable(argsClass.java.name, args) - return this -} - -inline fun Bundle.putArgs(args: Args) = putArgs(args, Args::class) - -fun Args.toBundle(argsClass: KClass): Bundle = - Bundle().apply { putArgs(this@toBundle, argsClass) } - -inline fun Args.toBundle(): Bundle = toBundle(Args::class) - -fun F.putArgs(args: Args, argsClass: KClass): F { - val arguments = arguments - if (arguments != null) { - arguments.putArgs(args, argsClass) - } else { - this.arguments = args.toBundle(argsClass) - } - return this -} - -inline fun F.putArgs(args: Args): F = - putArgs(args, Args::class) - fun Intent.putArgs(args: Args, argsClass: KClass): Intent = putExtra(argsClass.java.name, args) inline fun Intent.putArgs(args: Args) = putArgs(args, Args::class) -fun Bundle.getArgs(argsClass: KClass): Args = - getArgsOrNull(argsClass)!! - -inline fun Bundle.getArgs() = getArgs(Args::class) fun Bundle.getArgsOrNull(argsClass: KClass): Args? = getParcelable(argsClass.java.name) inline fun Bundle.getArgsOrNull() = getArgsOrNull(Args::class) -@MainThread -inline fun Activity.args() = BundleArgsLazy(Args::class) { - intent.extras ?: throw IllegalStateException("Activity $this has null intent extras") -} - -@MainThread -inline fun Fragment.args() = BundleArgsLazy(Args::class) { - arguments ?: throw IllegalStateException("Fragment $this has null arguments") -} - -class BundleArgsLazy( - private val argsClass: KClass, - private val argumentsProducer: () -> Bundle -) : Lazy { - private var cached: Args? = null - - override val value: Args - get() { - var args = cached - if (args == null) { - args = argumentsProducer().getArgs(argsClass) - cached = args - } - return args - } - - override fun isInitialized() = cached != null -} @Parcelize class Args(val savedInstanceState: @WriteWith Bundle?) : ParcelableArgs \ No newline at end of file diff --git a/app/src/main/java/com/etb/filemanager/files/util/RecyclerViewUtils.kt b/app/src/main/java/com/etb/filemanager/files/util/RecyclerViewUtils.kt index e8fa67f1..f16135ac 100644 --- a/app/src/main/java/com/etb/filemanager/files/util/RecyclerViewUtils.kt +++ b/app/src/main/java/com/etb/filemanager/files/util/RecyclerViewUtils.kt @@ -7,9 +7,12 @@ package com.etb.filemanager.files.util -import android.animation.* +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.AnimatorSet +import android.animation.ObjectAnimator +import android.animation.PropertyValuesHolder import android.view.View -import android.view.animation.AccelerateDecelerateInterpolator import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.transition.ChangeBounds @@ -31,7 +34,7 @@ import androidx.transition.TransitionManager for (i in 0 until childCount) { val child = recyclerView.getChildAt(i) val lp = child.layoutParams as RecyclerView.LayoutParams - val oldPosition = lp.viewAdapterPosition + val oldPosition = lp.absoluteAdapterPosition val newPosition = (recyclerView.layoutManager as? GridLayoutManager)?.getPosition(child) ?: continue if (oldPosition != RecyclerView.NO_POSITION && newPosition != RecyclerView.NO_POSITION) { diff --git a/app/src/main/java/com/etb/filemanager/fragment/HomeFragment.kt b/app/src/main/java/com/etb/filemanager/fragment/HomeFragment.kt index a6284744..4085eed0 100644 --- a/app/src/main/java/com/etb/filemanager/fragment/HomeFragment.kt +++ b/app/src/main/java/com/etb/filemanager/fragment/HomeFragment.kt @@ -379,7 +379,6 @@ class HomeFragment : Fragment(), FileListener { @SuppressLint("NotifyDataSetChanged") private fun finishActionMode() { clearSelectedFiles() - if (::adapter.isInitialized) adapter.clearItemSelection() isActionMode = false actionMode?.finish() } diff --git a/app/src/main/java/com/etb/filemanager/fragment/SettingsFragment.kt b/app/src/main/java/com/etb/filemanager/fragment/SettingsFragment.kt index d6716148..994474e0 100644 --- a/app/src/main/java/com/etb/filemanager/fragment/SettingsFragment.kt +++ b/app/src/main/java/com/etb/filemanager/fragment/SettingsFragment.kt @@ -12,7 +12,6 @@ import android.os.Bundle import androidx.collection.ArrayMap import androidx.preference.Preference import com.etb.filemanager.R -import com.etb.filemanager.activity.BaseActivity import com.etb.filemanager.activity.SettingsActivity import com.etb.filemanager.files.util.LangUtils import com.etb.filemanager.settings.preference.PreferenceFragment @@ -56,7 +55,7 @@ class SettingsFragment : PreferenceFragment() { } val locale: Preference = Objects.requireNonNull(findPreference("custom_locale")) locale.summary = languageNames[localeIndex] - locale.setOnPreferenceClickListener { preference -> + locale.setOnPreferenceClickListener { _ -> MaterialAlertDialogBuilder(requireContext()).setTitle(getString(R.string.pref_app_language_title)) .setSingleChoiceItems(languageNames, localeIndex) { dialog, which -> if (which != localeIndex) { @@ -67,11 +66,11 @@ class SettingsFragment : PreferenceFragment() { } dialog.dismiss() } - .setNegativeButton(getString(R.string.dialog_cancel)) { dialog, which -> + .setNegativeButton(getString(R.string.dialog_cancel)) { _, _ -> }.show() true } - locale.setOnPreferenceChangeListener { preference, newValue -> + locale.setOnPreferenceChangeListener { _, _ -> locale.summary = languageNames[localeIndex] true diff --git a/app/src/main/java/com/etb/filemanager/interfaces/settings/util/SelectPreferenceUtils.kt b/app/src/main/java/com/etb/filemanager/interfaces/settings/util/SelectPreferenceUtils.kt index c6748a0d..ce0bf79f 100644 --- a/app/src/main/java/com/etb/filemanager/interfaces/settings/util/SelectPreferenceUtils.kt +++ b/app/src/main/java/com/etb/filemanager/interfaces/settings/util/SelectPreferenceUtils.kt @@ -7,10 +7,7 @@ package com.etb.filemanager.interfaces.settings.util -import android.content.Context -import android.content.SharedPreferences import com.etb.filemanager.interfaces.settings.PopupSettingsListener -import com.etb.filemanager.manager.adapter.FileModel class SelectPreferenceUtils { private lateinit var listener: PopupSettingsListener @@ -20,84 +17,6 @@ class SelectPreferenceUtils { listener.onItemSelectedActionSort(itemSelected, itemSelectedFolderFirst) } - - - fun setListener(mListener: PopupSettingsListener, context: Context) { - listener = mListener - - } - - fun sendFileInfo(currentPath: String){ - listener.onFileInfoReceived(currentPath) - } - - fun getItemSelectedActionSort(context: Context): Int { - val sharedPopupSettingsActionSort: SharedPreferences = - context.getSharedPreferences("sharedPopupSettingsActionSort", Context.MODE_PRIVATE) - - return sharedPopupSettingsActionSort.getInt("settings_action_sort_item_selected", 0) - } - - fun getActionSortFolderFirst(context: Context): Boolean { - val sharedPopupSettingsActionSort: SharedPreferences = - context.getSharedPreferences("sharedPopupSettingsActionSort", Context.MODE_PRIVATE) - return sharedPopupSettingsActionSort.getBoolean("settings_action_sort_directories_first", false) - } - - - - fun sortFilesBy(position: Int, fileModels: MutableList) { - when (position) { - 0 -> sortFilesAlphabetically(fileModels) - 1 -> sortFilesByFileSize(fileModels) - 2 -> sortFilesByFileType(fileModels) - } - } - fun sortFilesAuto(fileModels: MutableList, context: Context) { - val position = getItemSelectedActionSort(context) - - if (getActionSortFolderFirst(context)){ - sortFilesByFolderFirst(position, fileModels) - }else{ - when (position) { - 0 -> sortFilesAlphabetically(fileModels) - 1 -> sortFilesByFileSize(fileModels) - 2 -> sortFilesByFileType(fileModels) - } - } - - } - - private fun sortFilesByFileSize(fileModels: MutableList) { - fileModels.sortWith(compareByDescending { it.fileSize }) - - - - } - - private fun sortFilesByFileType(fileModels: MutableList) { - fileModels.sortBy { it.fileExtension } - - - } - - fun sortFilesByFolderFirst(position: Int, fileModels: MutableList) { - fileModels.sortWith(compareBy({ it.isDirectory }, { getFileSortingCriteria(it, position) })) - } - - private fun getFileSortingCriteria(fileModel: FileModel, position: Int): Comparable<*>? = when (position) { - 0 -> fileModel.fileName - 1 -> fileModel.fileExtension - 2 -> fileModel.fileSize - else -> null - } - - - private fun sortFilesAlphabetically(fileModels: MutableList) { - fileModels.sortBy { it.fileName } - - } - companion object { private var instance: SelectPreferenceUtils? = null diff --git a/app/src/main/java/com/etb/filemanager/manager/adapter/FileModelAdapter.kt b/app/src/main/java/com/etb/filemanager/manager/adapter/FileModelAdapter.kt index edcf9c73..2c628453 100644 --- a/app/src/main/java/com/etb/filemanager/manager/adapter/FileModelAdapter.kt +++ b/app/src/main/java/com/etb/filemanager/manager/adapter/FileModelAdapter.kt @@ -10,16 +10,11 @@ package com.etb.filemanager.manager.adapter import android.annotation.SuppressLint import android.content.Context -import android.content.res.Resources import android.graphics.Color import android.graphics.PorterDuff -import android.graphics.drawable.Drawable -import android.os.Build -import android.util.Log import android.view.View import android.view.ViewGroup import android.widget.ImageView -import androidx.annotation.RequiresApi import androidx.appcompat.content.res.AppCompatResources import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView @@ -29,10 +24,7 @@ import com.bumptech.glide.request.RequestOptions import com.etb.filemanager.R import com.etb.filemanager.databinding.FileItemBinding import com.etb.filemanager.files.extensions.createShapeModelBasedOnCornerFamilyPreference -import com.etb.filemanager.files.extensions.toPixelFromDP -import com.etb.filemanager.files.provider.archive.common.mime.MimeType import com.etb.filemanager.files.provider.archive.common.mime.MimeTypeUtil -import com.etb.filemanager.files.provider.archive.common.mime.isASpecificTypeOfMime import com.etb.filemanager.files.util.FileUtil import com.etb.filemanager.files.util.getColorByAttr import com.etb.filemanager.files.util.getDimension @@ -48,14 +40,8 @@ import com.etb.filemanager.manager.util.FileUtils import com.etb.filemanager.settings.preference.InterfacePreferences import com.etb.filemanager.settings.preference.Preferences import com.etb.filemanager.ui.style.ColorUtil -import com.etb.filemanager.ui.style.IconUtil -import com.google.android.material.shape.CornerFamily import com.google.android.material.shape.MaterialShapeDrawable -import com.google.android.material.shape.ShapeAppearanceModel import me.zhanghai.android.fastscroll.PopupTextProvider -import java.nio.file.Files -import java.nio.file.Path -import java.nio.file.Paths import java.util.* @@ -63,7 +49,6 @@ class FileModelAdapter( private val mContext: Context, private val listener: FileListener ) : AnimatedListAdapter(CALLBACK), PopupTextProvider { - private val fileUtils: FileUtils = FileUtils.getInstance() private val basePath = "/storage/emulated/0" private var currentPath = basePath @@ -86,7 +71,7 @@ class FileModelAdapter( } } - var pickOptions: PickOptions? = null + private var pickOptions: PickOptions? = null set(value) { field = value notifyItemRangeChanged(0, itemCount, PAYLOAD_STATE_CHANGED) @@ -154,13 +139,6 @@ class FileModelAdapter( listener.selectFiles(files, true) } - @SuppressLint("NotifyDataSetChanged") - fun clearItemSelection() { - for (index in 0 until itemCount) { - val file = getItem(index) - - } - } @Deprecated("", ReplaceWith("replaceList(list)")) override fun replace(list: List, clear: Boolean) { @@ -175,7 +153,7 @@ class FileModelAdapter( rebuildFilePositionMap() } - fun rebuildFilePositionMap() { + private fun rebuildFilePositionMap() { filePositionMap.clear() for (index in 0 until itemCount) { val file = getItem(index) @@ -228,7 +206,7 @@ class FileModelAdapter( setVisibility(isDirectory, mimeType, binding) if (!isDirectory) { if (mimeType != null && mimeType.isMimeTypeMedia()) { - loadImage(filePath, binding, mimeType) + loadImage(filePath, binding) } else { getIconByMimeType(mimeType, binding) @@ -269,52 +247,24 @@ class FileModelAdapter( } - @RequiresApi(Build.VERSION_CODES.O) - fun getFileMimeType(mPath: String): String? { - val path: Path = Paths.get(mPath) - val mimeType: String? - try { - mimeType = Files.probeContentType(path) - } catch (e: Exception) { - Log.e("Get File", "Erro: $e") - return null - } - return mimeType - } - private fun setVisibility(isDir: Boolean, mimeType: String?, binding: FileItemBinding) { val isMedia = mimeType?.isMimeTypeMedia() ?: false val viewFileInformationOption = Preferences.Interface.viewFileInformationOption val colorPrimary = mContext.getColorByAttr(com.google.android.material.R.attr.colorPrimary) val colorOnPrimary = mContext.getColorByAttr(com.google.android.material.R.attr.colorOnPrimary) - val colorPrimaryInverse = - mContext.getColorByAttr(com.google.android.material.R.attr.colorPrimaryInverse) val iconFile = binding.iconFile - - - val widthNormal = 56 - val heightNormal = 55 - val layoutParams = iconFile.layoutParams - - val layoutParamsNormal = layoutParams.apply { - width = widthNormal.toPixelFromDP() - height = heightNormal.toPixelFromDP() - } - val showStroke = false val showBackground = true - - val cornerSize = if (Preferences.Interface.isEnabledRoundedCorners) 30f else 0f val strokeWidth = 10 - val shapeAppearanceModel = createShapeModelBasedOnCornerFamilyPreference() + val shapeAppearanceModel = createShapeModelBasedOnCornerFamilyPreference() val borderDrawable = MaterialShapeDrawable(shapeAppearanceModel) if (showBackground && !isMedia) borderDrawable.setTint(colorPrimary) else borderDrawable.setTint( Color.TRANSPARENT ) - if (showStroke && isMedia) borderDrawable.setStroke(strokeWidth.toFloat(), colorOnPrimary) + if (showStroke && isMedia) borderDrawable.setStroke(strokeWidth.toFloat(), colorOnPrimary) iconFile.background = borderDrawable iconFile.scaleType = @@ -354,9 +304,7 @@ class FileModelAdapter( } - private fun loadImage(path: String, binding: FileItemBinding, mimeType: String) { - val mimeTypeObject = MimeType(mimeType) - val isApk = mimeTypeObject.isASpecificTypeOfMime(MimeType.APK) + private fun loadImage(path: String, binding: FileItemBinding) { val imageView = binding.iconFile binding.iconFile.clearColorFilter() @@ -382,16 +330,8 @@ class FileModelAdapter( val colorControlNormal = mContext.getColorByAttr(com.google.android.material.R.attr.colorControlNormal) val showBackground = true - val tint = if (showBackground) colorPrimaryInverse else colorControlNormal - - return tint - } - - private fun setPreview(preview: Drawable, placeholder: Drawable, binding: FileItemBinding) { - Glide.with(mContext).load(preview).diskCacheStrategy(DiskCacheStrategy.ALL) - .apply(RequestOptions().placeholder(placeholder)).into(binding.iconFile) - + return if (showBackground) colorPrimaryInverse else colorControlNormal } private fun String.isMimeTypeMedia(): Boolean { diff --git a/app/src/main/java/com/etb/filemanager/manager/files/filecoroutine/FileOperation.kt b/app/src/main/java/com/etb/filemanager/manager/files/filecoroutine/FileOperation.kt index 7e792358..5dea792b 100644 --- a/app/src/main/java/com/etb/filemanager/manager/files/filecoroutine/FileOperation.kt +++ b/app/src/main/java/com/etb/filemanager/manager/files/filecoroutine/FileOperation.kt @@ -7,12 +7,13 @@ package com.etb.filemanager.manager.files.filecoroutine -import android.content.Context import android.util.Log -import com.etb.filemanager.R -import com.etb.filemanager.files.util.ContextUtils -import com.etb.filemanager.manager.files.filecoroutine.CompressionType.* -import com.etb.filemanager.manager.util.MaterialDialogUtils +import com.etb.filemanager.manager.files.filecoroutine.CompressionType.SEVENZ +import com.etb.filemanager.manager.files.filecoroutine.CompressionType.TAR +import com.etb.filemanager.manager.files.filecoroutine.CompressionType.TARGZ +import com.etb.filemanager.manager.files.filecoroutine.CompressionType.TARXZ +import com.etb.filemanager.manager.files.filecoroutine.CompressionType.TARZSTD +import com.etb.filemanager.manager.files.filecoroutine.CompressionType.ZIP import kala.compress.archivers.zip.ZipArchiveEntry import kala.compress.archivers.zip.ZipArchiveOutputStream import kala.compress.compressors.gzip.GzipCompressorOutputStream @@ -26,15 +27,26 @@ import org.apache.commons.compress.archivers.sevenz.SevenZOutputFile import org.apache.commons.compress.archivers.tar.TarArchiveEntry import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream import org.apache.commons.compress.compressors.xz.XZCompressorOutputStream -import org.apache.commons.compress.compressors.zstandard.ZstdCompressorOutputStream import org.apache.commons.io.FileUtils -import java.io.* -import java.nio.file.* -import kotlin.io.path.* +import java.io.File +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.IOException +import java.io.InterruptedIOException +import java.nio.file.Files +import java.nio.file.LinkOption +import java.nio.file.Path +import java.nio.file.Paths +import java.nio.file.StandardCopyOption +import kotlin.io.path.ExperimentalPathApi +import kotlin.io.path.createDirectory +import kotlin.io.path.createFile +import kotlin.io.path.deleteRecursively +import kotlin.io.path.exists +import kotlin.io.path.moveTo suspend fun performFileOperation( - context: Context, operation: FileOperation, sourcePath: List?, newNames: List?, @@ -83,11 +95,7 @@ private fun deleteFile( val progress = (completedFiles * 100 / totalFiles).toInt() sendProgress(progressListener, progress) } catch (e: IOException) { - try { - showOperationDialog() - } catch (e: Exception) { - e.printStackTrace() - } + e.printStackTrace() } } } @@ -142,7 +150,7 @@ private fun moveAtomically(source: Path, target: Path) { source.moveTo(target, LinkOption.NOFOLLOW_LINKS, StandardCopyOption.ATOMIC_MOVE) } catch (e: InterruptedIOException) { - showOperationDialog() + e.printStackTrace() } } @@ -218,38 +226,6 @@ private fun copy(paths: List, destinationPath: String, progressListener: } } -private fun showOperationDialog() { - val mContext = ContextUtils.getContext() - val title = mContext.getString(R.string.error_occurred) - val message = mContext.getString(R.string.error_occurred_during_operation) - val textPositiveButton = mContext.getString(R.string.ok) - - MaterialDialogUtils().createDialogInfo( - title, message, textPositiveButton, "", mContext, false - ) { dialogResult -> - val isConfirmed = dialogResult.confirmed - if (isConfirmed) { - - } - } -} - -private fun showConfirmationDialog(fileName: String): Boolean { - var isConfirmed = false - val context = ContextUtils.getContext() - val title = context.getString(R.string.warning) - val message = "O arquivo '$fileName' já existe. Deseja substituí-lo?" - val textPositiveButton = context.getString(R.string.ok) - val textNegativeButton = context.getString(R.string.skip) - - MaterialDialogUtils().createDialogInfo( - title, message, textPositiveButton, textNegativeButton, context, true - ) { dialogResult -> - isConfirmed = dialogResult.confirmed - } - return isConfirmed -} - private fun sendProgress(progressListener: (Int) -> Unit, progress: Int) { progressListener(progress) @@ -407,7 +383,7 @@ class CompressFiles { ) } } else { - val entry = sevenZOutputFile.createArchiveEntry(file, entryName + "/") + val entry = sevenZOutputFile.createArchiveEntry(file, "$entryName/") sevenZOutputFile.putArchiveEntry(entry) sevenZOutputFile.closeArchiveEntry() } @@ -564,7 +540,7 @@ class ExtractArchives { val extension = getExtension(archiveFile.name) - when (extension.toLowerCase()) { + when (extension.lowercase()) { "zip" -> extractZipArchive(archiveFile, outputDirFile) "7z" -> extract7zArchive(archiveFile, outputDirFile) "tar", "gz", "xz" -> {} diff --git a/app/src/main/java/com/etb/filemanager/manager/files/filelist/FileListViewModel.kt b/app/src/main/java/com/etb/filemanager/manager/files/filelist/FileListViewModel.kt index ba1a30cf..904a163f 100644 --- a/app/src/main/java/com/etb/filemanager/manager/files/filelist/FileListViewModel.kt +++ b/app/src/main/java/com/etb/filemanager/manager/files/filelist/FileListViewModel.kt @@ -8,7 +8,11 @@ package com.etb.filemanager.manager.files.filelist import android.os.Parcelable -import androidx.lifecycle.* +import androidx.lifecycle.LiveData +import androidx.lifecycle.MediatorLiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.map import com.etb.filemanager.files.util.CloseableLiveData import com.etb.filemanager.files.util.Stateful import com.etb.filemanager.manager.adapter.FileModel @@ -100,7 +104,6 @@ class FileListViewModel : ViewModel() { get() = currentPathLiveData.value private val _searchStateLiveData = MutableLiveData(SearchState(false, "")) - val searchStateLive: LiveData = _searchStateLiveData val searchState: SearchState get() = _searchStateLiveData.value!! @@ -124,25 +127,12 @@ class FileListViewModel : ViewModel() { get() = _fileListLiveData.value!! fun reload() { - val path = currentPath _fileListLiveData.reload() } val searchViewExpandedLiveData = MutableLiveData(false) - var isSearchViewExpanded: Boolean - get() = searchViewExpandedLiveData.value!! - set(value) { - if (searchViewExpandedLiveData.value == value) return - searchViewExpandedLiveData.value = value - } private val _searchViewQueryLiveData = MutableLiveData("") - var searchViewQuery: String - get() = _searchViewQueryLiveData.value!! - set(value) { - if (_searchViewQueryLiveData.value == value) return - _searchViewQueryLiveData.value = value - } private class FileListSwitchMapLiveData( private val pathLiveData: LiveData, diff --git a/app/src/main/java/com/etb/filemanager/manager/files/filelist/KWatchChannel.kt b/app/src/main/java/com/etb/filemanager/manager/files/filelist/KWatchChannel.kt index a785ed7f..8830b7d8 100644 --- a/app/src/main/java/com/etb/filemanager/manager/files/filelist/KWatchChannel.kt +++ b/app/src/main/java/com/etb/filemanager/manager/files/filelist/KWatchChannel.kt @@ -7,17 +7,25 @@ package com.etb.filemanager.manager.files.filelist -import kotlinx.coroutines.* -import kotlinx.coroutines.channels.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.launch import java.io.File -import java.nio.file.* -import java.nio.file.WatchKey +import java.nio.file.FileSystems import java.nio.file.FileVisitResult -import java.nio.file.attribute.BasicFileAttributes -import java.nio.file.SimpleFileVisitor import java.nio.file.Files -import java.nio.file.StandardWatchEventKinds.* -class KWatchChannel ( +import java.nio.file.Path +import java.nio.file.SimpleFileVisitor +import java.nio.file.StandardWatchEventKinds.ENTRY_CREATE +import java.nio.file.StandardWatchEventKinds.ENTRY_DELETE +import java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY +import java.nio.file.WatchKey +import java.nio.file.WatchService +import java.nio.file.attribute.BasicFileAttributes +class KWatchChannel @OptIn(DelicateCoroutinesApi::class) constructor( val file: File, val scope: CoroutineScope = GlobalScope, val mode: Mode, diff --git a/app/src/main/java/com/etb/filemanager/manager/files/services/FileOperationService.kt b/app/src/main/java/com/etb/filemanager/manager/files/services/FileOperationService.kt index 75f35d66..0efccd7e 100644 --- a/app/src/main/java/com/etb/filemanager/manager/files/services/FileOperationService.kt +++ b/app/src/main/java/com/etb/filemanager/manager/files/services/FileOperationService.kt @@ -52,7 +52,6 @@ class FileOperationService : Service() { serviceScope.launch { performFileOperation( - applicationContext, operation, sourcePath, newNames, diff --git a/app/src/main/java/com/etb/filemanager/manager/files/ui/ModalBottomSheetCompress.kt b/app/src/main/java/com/etb/filemanager/manager/files/ui/ModalBottomSheetCompress.kt index 6808d42f..23967577 100644 --- a/app/src/main/java/com/etb/filemanager/manager/files/ui/ModalBottomSheetCompress.kt +++ b/app/src/main/java/com/etb/filemanager/manager/files/ui/ModalBottomSheetCompress.kt @@ -62,7 +62,7 @@ class ModalBottomSheetCompress : BottomSheetDialogFragment() { autoCompleteTextView.setText(mSelectedItem, false) compressionType = CompressionType.ZIP extension = mSelectedItem - autoCompleteTextView.setOnItemClickListener { parent, view, position, id -> + autoCompleteTextView.setOnItemClickListener { parent, _, position, _ -> val selectedItem = parent.getItemAtPosition(position) as String extension = selectedItem compressionType = when (position) { diff --git a/app/src/main/java/com/etb/filemanager/manager/files/ui/components/APKInfoRow.kt b/app/src/main/java/com/etb/filemanager/manager/files/ui/components/APKInfoRow.kt index cfa7e88f..d2e9b83f 100644 --- a/app/src/main/java/com/etb/filemanager/manager/files/ui/components/APKInfoRow.kt +++ b/app/src/main/java/com/etb/filemanager/manager/files/ui/components/APKInfoRow.kt @@ -8,7 +8,6 @@ package com.etb.filemanager.manager.files.ui.components import androidx.compose.foundation.background -import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -17,7 +16,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll @@ -34,19 +32,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.ClipboardManager -import androidx.compose.ui.platform.LocalClipboardManager -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.etb.filemanager.files.extensions.getPackageApk import com.etb.filemanager.manager.adapter.FileModel import com.etb.filemanager.ui.theme.FileManagerTheme import com.etb.filemanager.ui.theme.Shapes -import kotlinx.coroutines.launch import java.io.File @@ -58,7 +50,6 @@ fun APKInfoRow( content: String, file: FileModel ) { - val clipboardManager: ClipboardManager = LocalClipboardManager.current ListItem( modifier = modifier @@ -134,7 +125,6 @@ private fun APKNameContainer( file: FileModel, content: @Composable () -> Unit ){ - val ApkPackage = "pacote do app" Column( modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/java/com/etb/filemanager/manager/media/BottomBar.kt b/app/src/main/java/com/etb/filemanager/manager/media/BottomBar.kt index 16900686..5d6fe5dd 100644 --- a/app/src/main/java/com/etb/filemanager/manager/media/BottomBar.kt +++ b/app/src/main/java/com/etb/filemanager/manager/media/BottomBar.kt @@ -38,7 +38,6 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Favorite import androidx.compose.material.icons.outlined.DeleteOutline import androidx.compose.material.icons.outlined.Edit import androidx.compose.material.icons.outlined.OpenInNew @@ -75,7 +74,6 @@ import androidx.exifinterface.media.ExifInterface import com.etb.filemanager.R import com.etb.filemanager.files.util.FileUtil import com.etb.filemanager.files.util.actionEdit -import com.etb.filemanager.files.util.launchEditIntent import com.etb.filemanager.files.util.shareMedia import com.etb.filemanager.manager.media.model.Media import com.etb.filemanager.ui.theme.Black40P @@ -83,8 +81,6 @@ import com.etb.filemanager.ui.util.Constants import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.io.IOException -import java.math.RoundingMode -import java.text.DecimalFormat @SuppressLint("RememberReturnType") @OptIn(ExperimentalMaterial3Api::class) @@ -163,7 +159,6 @@ fun BoxScope.MediaViewBottomBar( ) { Column(modifier = Modifier.verticalScroll(rememberScrollState())) { MediaViewDateContainer( - currentMedia = currentMedia, exifMetadata = exifMetadata ) { /**/ @@ -184,7 +179,6 @@ fun BoxScope.MediaViewBottomBar( @Composable private fun MediaViewDateContainer( - currentMedia: Media, exifMetadata: ExifMetadata, content: @Composable () -> Unit ) { @@ -232,11 +226,7 @@ private fun MediaViewActions( ) { val scope = rememberCoroutineScope() val context = LocalContext.current - val favoriteIcon by remember(currentMedia) { - mutableStateOf( - Icons.Filled.Favorite - ) - } + // Share Component BottomBarColumn( currentMedia = currentMedia, @@ -270,7 +260,7 @@ private fun MediaViewActions( imageVector = Icons.Outlined.DeleteOutline, title = stringResource(id = R.string.delete) ) { - result?.let { result -> + result?.let { _ -> scope.launch { onDeleteMedia?.invoke(currentIndex) } @@ -379,40 +369,14 @@ class AppBottomSheetState( } class ExifMetadata(exifInterface: ExifInterface) { - val manufacturerName: String? = - exifInterface.getAttribute(ExifInterface.TAG_MAKE) - val modelName: String? = - exifInterface.getAttribute(ExifInterface.TAG_MODEL) - val apertureValue: Double = - exifInterface.getAttributeDouble(ExifInterface.TAG_APERTURE_VALUE, 0.0) - - val focalLength: Double = - exifInterface.getAttributeDouble(ExifInterface.TAG_FOCAL_LENGTH, 0.0) - val isoValue: Int = - exifInterface.getAttributeInt(ExifInterface.TAG_ISO_SPEED, 0) - val imageWidth: Int = + private val imageWidth: Int = exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, -1) - val imageHeight: Int = + private val imageHeight: Int = exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, -1) - val imageMp: String - get() { - val roundingMP = DecimalFormat("#.#").apply { roundingMode = RoundingMode.DOWN } - return roundingMP.format(imageWidth * imageHeight / 1024000.0) - } val imageDescription: String? = exifInterface.getAttribute(ExifInterface.TAG_IMAGE_DESCRIPTION) - val lensDescription: String? - get() { - return if (!manufacturerName.isNullOrEmpty() && !modelName.isNullOrEmpty() && apertureValue != 0.0) { - "$manufacturerName $modelName - f/$apertureValue - $imageMp MP" - } else null - } - - - val gpsLatLong: DoubleArray? = - exifInterface.latLong } @Throws(IOException::class) diff --git a/app/src/main/java/com/etb/filemanager/manager/media/MediaViewActivity.kt b/app/src/main/java/com/etb/filemanager/manager/media/MediaViewActivity.kt index de754ec3..eddbc092 100644 --- a/app/src/main/java/com/etb/filemanager/manager/media/MediaViewActivity.kt +++ b/app/src/main/java/com/etb/filemanager/manager/media/MediaViewActivity.kt @@ -11,7 +11,6 @@ import android.app.Activity import android.content.Context import android.os.Build import android.os.Bundle -import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.BackHandler import androidx.activity.compose.rememberLauncherForActivityResult @@ -115,9 +114,6 @@ fun MediaViewScreen( mediaListInfo.mediaList.indexOfFirst { it.id == runtimeMediaId.coerceAtLeast(0) } } - Log.i("MediaView", "runtimeMediaId: $runtimeMediaId") - Log.i("MediaView", "currentMediaId: $currentMediaId") - val pagerState = rememberPagerState( initialPage = initialPage, initialPageOffsetFraction = 0f, @@ -139,7 +135,6 @@ fun MediaViewScreen( val maxImageSize = 4096 val windowInsetsController = rememberWindowInsetsController() - val currentDate = rememberSaveable { mutableStateOf("") } Box( modifier = Modifier @@ -190,7 +185,6 @@ fun MediaViewScreen( showUI = showUI.value, showInfo = false, showDate = true, - currentDate = currentDate.value, paddingValues = paddingValues, bottomSheetState = bottomSheetState, onGoBack = navigateUp diff --git a/app/src/main/java/com/etb/filemanager/manager/media/MediaViewAppBar.kt b/app/src/main/java/com/etb/filemanager/manager/media/MediaViewAppBar.kt index 145e6382..defb973f 100644 --- a/app/src/main/java/com/etb/filemanager/manager/media/MediaViewAppBar.kt +++ b/app/src/main/java/com/etb/filemanager/manager/media/MediaViewAppBar.kt @@ -41,7 +41,6 @@ fun MediaViewAppBar( showUI: Boolean, showInfo: Boolean, showDate: Boolean, - currentDate: String, paddingValues: PaddingValues, bottomSheetState: AppBottomSheetState, onGoBack: () -> Unit diff --git a/app/src/main/java/com/etb/filemanager/manager/media/image/viewer/ImageViewerItemFragment.kt b/app/src/main/java/com/etb/filemanager/manager/media/image/viewer/ImageViewerItemFragment.kt index 7c61da3f..43b08f56 100644 --- a/app/src/main/java/com/etb/filemanager/manager/media/image/viewer/ImageViewerItemFragment.kt +++ b/app/src/main/java/com/etb/filemanager/manager/media/image/viewer/ImageViewerItemFragment.kt @@ -11,11 +11,9 @@ import android.annotation.SuppressLint import android.graphics.Bitmap import android.graphics.BitmapFactory import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ImageView import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide @@ -24,8 +22,6 @@ import com.bumptech.glide.request.RequestOptions import com.etb.filemanager.R import com.etb.filemanager.databinding.FragmentImageViewerItemBinding import com.google.android.material.imageview.ShapeableImageView -import com.google.android.material.shape.CornerFamily -import com.google.android.material.shape.ShapeAppearanceModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -74,29 +70,9 @@ class ImageViewerItemFragment : Fragment() { lifecycleScope.launch { try { val bitmap = loadResizedImageAsync(path) + val imageWidth = bitmap.width + val imageHeight = bitmap.height - val imageMaxWidth = 1920 - val imageMaxHeight = 1080 - var imageWidth = bitmap.width - var imageHeight = bitmap.height - -/* - if (imageHeight > imageMaxHeight) { - imageWidth = imageMaxWidth - imageHeight = imageMaxHeight - - val shapeAppearanceModel = ShapeAppearanceModel.builder().setAllCorners( - CornerFamily.ROUNDED, - resources.getDimensionPixelSize(R.dimen.corner_radius_base).toFloat() - ).build() - shapeableImageView.shapeAppearanceModel = shapeAppearanceModel - shapeableImageView.scaleType = ImageView.ScaleType.CENTER_INSIDE - shapeableImageView.layoutParams.apply { - width = imageMaxWidth - height = imageHeight - } - } -*/ Glide.with(requireContext()).load(path).diskCacheStrategy(DiskCacheStrategy.ALL) .apply( RequestOptions().override(imageWidth, imageHeight) @@ -112,12 +88,10 @@ class ImageViewerItemFragment : Fragment() { private suspend fun loadResizedImageAsync(path: String?): Bitmap = withContext(Dispatchers.Default) { - val maxWidth = 800 - val maxHeight = 800 val options = BitmapFactory.Options().apply { inJustDecodeBounds = true BitmapFactory.decodeFile(path, this) - inSampleSize = calculateInSampleSize(this, maxWidth, maxHeight) + inSampleSize = calculateInSampleSize(this) inJustDecodeBounds = false } @@ -125,16 +99,17 @@ class ImageViewerItemFragment : Fragment() { } private fun calculateInSampleSize( - options: BitmapFactory.Options, maxWidth: Int, maxHeight: Int + options: BitmapFactory.Options ): Int { val imageHeight = options.outHeight val imageWidth = options.outWidth var inSampleSize = 1 + val maxSize = 800 - if (imageHeight > maxHeight || imageWidth > maxWidth) { + if (imageHeight > maxSize || imageWidth > maxSize) { val halfHeight = imageHeight / 2 val halfWidth = imageWidth / 2 - while ((halfHeight / inSampleSize) >= maxHeight && (halfWidth / inSampleSize) >= maxWidth) { + while ((halfHeight / inSampleSize) >= maxSize && (halfWidth / inSampleSize) >= maxSize) { inSampleSize *= 2 } } diff --git a/app/src/main/java/com/etb/filemanager/manager/media/model/Media.kt b/app/src/main/java/com/etb/filemanager/manager/media/model/Media.kt index afa0bbb3..9bceb163 100644 --- a/app/src/main/java/com/etb/filemanager/manager/media/model/Media.kt +++ b/app/src/main/java/com/etb/filemanager/manager/media/model/Media.kt @@ -7,18 +7,14 @@ package com.etb.filemanager.manager.media.model -import android.content.Context import android.net.Uri import android.os.Parcelable -import android.util.Log import com.etb.filemanager.files.provider.archive.common.mime.MimeType import com.etb.filemanager.files.util.FileUtil import com.etb.filemanager.files.util.fileProviderUri -import com.etb.filemanager.files.util.getMediaIdFromPath import com.etb.filemanager.manager.adapter.FileModel import kotlinx.parcelize.Parcelize import java.nio.file.Paths -import java.util.Locale @Parcelize data class Media( @@ -31,19 +27,6 @@ data class Media( } companion object { - suspend fun createFromUri(uri: Uri, context: Context): Media { - val mime = FileUtil().getMimeType(uri, null)!! - val mimeType = MimeType(mime) - val mId = getMediaIdFromPath(uri.path!!, context) - val id = mId ?: 0 - - return Media( - uri = uri, - id = id, - mimeType = mimeType - ) - } - fun createFromFileModel(file: FileModel): Media { val uri = Paths.get(file.filePath).fileProviderUri val mime = FileUtil().getMimeType(uri, null)!! @@ -55,8 +38,6 @@ data class Media( } - Log.i("Media", "Id: $id") - return Media( uri = uri, id = id, @@ -65,10 +46,3 @@ data class Media( } } } - -fun Uri.isMediaMimeType(): Boolean { - val path = this.path!! - val mediaMimeTypes = listOf("video/", "image/") - val mimeType = path.lowercase(Locale.getDefault()) - return mediaMimeTypes.any { mimeType.startsWith(it) } -} diff --git a/app/src/main/java/com/etb/filemanager/manager/util/MaterialDialogUtils.kt b/app/src/main/java/com/etb/filemanager/manager/util/MaterialDialogUtils.kt index e284f502..944a76ac 100644 --- a/app/src/main/java/com/etb/filemanager/manager/util/MaterialDialogUtils.kt +++ b/app/src/main/java/com/etb/filemanager/manager/util/MaterialDialogUtils.kt @@ -10,13 +10,10 @@ package com.etb.filemanager.manager.util import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater -import android.widget.RadioGroup import com.etb.filemanager.R -import com.etb.filemanager.files.util.ContextUtils import com.etb.filemanager.files.util.FileUtil import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textfield.TextInputEditText -import com.google.android.material.textfield.TextInputLayout class MaterialDialogUtils { private val fileUtil = FileUtil() @@ -30,13 +27,12 @@ class MaterialDialogUtils { ) { val inflater = LayoutInflater.from(context) val dialogView = inflater.inflate(R.layout.layout_basic_dialog, null) - val eInputLayout = dialogView.findViewById(R.id.eInputLayout) val eInputEditText = dialogView.findViewById(R.id.eInputEditText) eInputEditText.setText(text) MaterialAlertDialogBuilder(context).setTitle(title).setView(dialogView).setCancelable(false) - .setPositiveButton(textPositiveButton) { dialog, which -> + .setPositiveButton(textPositiveButton) { _, _ -> val enteredText = eInputEditText.text.toString() callback(DialogResult(true, enteredText)) @@ -59,7 +55,7 @@ class MaterialDialogUtils { val mDialog = MaterialAlertDialogBuilder(context).setTitle(title).setMessage(message) - .setPositiveButton(textPositiveButton) { dialog, which -> + .setPositiveButton(textPositiveButton) { _, _ -> callback(DialogInfoResult(true)) @@ -73,39 +69,5 @@ class MaterialDialogUtils { mDialog.show() } - @SuppressLint("InflateParams", "SuspiciousIndentation", "MissingInflatedId") - fun createDialogArchive( - callback: (DialogInfoResult) -> Unit - ) { - val context = ContextUtils.getContext() - - val inflater = LayoutInflater.from(context) - val dialogView = inflater.inflate(R.layout.content_dialog_archive, null) - val title = context.getString(R.string.fab_menu_action_create_file) - val textPositiveButton = context.getString(R.string.ok) - val typeGroup = dialogView.findViewById(R.id.typeGroup) - - - val mDialog = - MaterialAlertDialogBuilder(context) - .setTitle(title) - .setView(dialogView) - .setPositiveButton(textPositiveButton) { dialog, which -> - val extension = when (val typeId = typeGroup.checkedRadioButtonId) { - R.id.zipRadio -> "zip" - R.id.tarXzRadio -> "tar.xz" - R.id.sevenZRadio -> "7z" - else -> throw AssertionError(typeId) - } - callback(DialogInfoResult(true)) - - - } - mDialog.setNegativeButton(R.string.dialog_cancel) { _, _ -> - callback(DialogInfoResult(false)) - } - - mDialog.show() - } } diff --git a/app/src/main/java/com/etb/filemanager/settings/preference/AppearancePreferences.kt b/app/src/main/java/com/etb/filemanager/settings/preference/AppearancePreferences.kt index f50e834f..720f6c6c 100644 --- a/app/src/main/java/com/etb/filemanager/settings/preference/AppearancePreferences.kt +++ b/app/src/main/java/com/etb/filemanager/settings/preference/AppearancePreferences.kt @@ -42,7 +42,7 @@ class AppearancePreferences : PreferenceFragment() { ?: throw IllegalArgumentException("Preference not found: app_theme") appTheme.isEnabled = isEnabledDMaterialDesign3 appTheme.summary = appThemeSummary - appTheme.setOnPreferenceClickListener { preference -> + appTheme.setOnPreferenceClickListener { _ -> MaterialAlertDialogBuilder(requireContext()).setTitle(getString(R.string.themes_title)) .setSingleChoiceItems(themesEntries, mCurrentTheIndex) { dialog, which -> if (which != mCurrentTheIndex) { @@ -54,7 +54,7 @@ class AppearancePreferences : PreferenceFragment() { dialog.cancel() } - .setNegativeButton(getString(R.string.dialog_cancel)) { dialog, which -> + .setNegativeButton(getString(R.string.dialog_cancel)) { _, _ -> }.show() true } @@ -65,7 +65,7 @@ class AppearancePreferences : PreferenceFragment() { val isEnabledMaterialDesign = Preferences.Appearance.isEnabledDMaterialDesign3 sMaterialDesign?.isChecked = isEnabledMaterialDesign - sMaterialDesign?.setOnPreferenceChangeListener { preference, newValue -> + sMaterialDesign?.setOnPreferenceChangeListener { _, newValue -> val newValueMaterial = newValue as Boolean appTheme.isEnabled = newValueMaterial val theme = StyleManager.OptionStyle.MATERIAL_DESIGN_TWO.name diff --git a/app/src/main/java/com/etb/filemanager/settings/preference/BehaviorPreferences.kt b/app/src/main/java/com/etb/filemanager/settings/preference/BehaviorPreferences.kt index 0d1eb05c..20ecc1b8 100644 --- a/app/src/main/java/com/etb/filemanager/settings/preference/BehaviorPreferences.kt +++ b/app/src/main/java/com/etb/filemanager/settings/preference/BehaviorPreferences.kt @@ -11,17 +11,11 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.ViewGroup import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat import com.etb.filemanager.R -import com.etb.filemanager.manager.util.MaterialDialogUtils -import com.etb.filemanager.ui.style.StyleManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textfield.TextInputEditText -import com.google.android.material.textfield.TextInputLayout import java.io.File -import java.nio.file.Path -import java.nio.file.Paths class BehaviorPreferences : PreferenceFragment(){ override fun getTitle(): Int { @@ -33,19 +27,18 @@ class BehaviorPreferences : PreferenceFragment(){ preferenceManager.preferenceDataStore = SettingsDataStore() - val prefDefaulFolder = findPreference("default_folder") + val prefDefaultFolder = findPreference("default_folder") val currentDefaultFolder = Preferences.Behavior.defaultFolder //Default folder - prefDefaulFolder!!.summary = currentDefaultFolder + prefDefaultFolder!!.summary = currentDefaultFolder val inflater = LayoutInflater.from(requireContext()) val dialogView = inflater.inflate(R.layout.layout_basic_dialog, null) - val eInputLayout = dialogView.findViewById(R.id.eInputLayout) val eInputEditText = dialogView.findViewById(R.id.eInputEditText) val title = requireContext().getString(R.string.pref_behavior_set_default_folder_title) - prefDefaulFolder.setOnPreferenceClickListener { preference -> + prefDefaultFolder.setOnPreferenceClickListener { preference -> val parent = dialogView.parent as? ViewGroup parent?.removeView(dialogView) eInputEditText.setText(currentDefaultFolder) @@ -54,7 +47,7 @@ class BehaviorPreferences : PreferenceFragment(){ .setTitle(title) .setView(dialogView) .setCancelable(false) - .setPositiveButton(getString(R.string.set)) { dialog, which -> + .setPositiveButton(getString(R.string.set)) { _, _ -> val enteredText = eInputEditText.text.toString() val path = File(enteredText) if (enteredText != currentDefaultFolder && path.exists()){ diff --git a/app/src/main/java/com/etb/filemanager/settings/preference/InterfacePreferences.kt b/app/src/main/java/com/etb/filemanager/settings/preference/InterfacePreferences.kt index 9c83b46d..64a2f253 100644 --- a/app/src/main/java/com/etb/filemanager/settings/preference/InterfacePreferences.kt +++ b/app/src/main/java/com/etb/filemanager/settings/preference/InterfacePreferences.kt @@ -8,12 +8,10 @@ package com.etb.filemanager.settings.preference import android.os.Bundle -import android.util.Log import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.SwitchPreferenceCompat import com.etb.filemanager.R -import com.etb.filemanager.files.extensions.CornerStyle import com.google.android.material.dialog.MaterialAlertDialogBuilder class InterfacePreferences : PreferenceFragment() { @@ -21,22 +19,16 @@ class InterfacePreferences : PreferenceFragment() { return R.string.pref_interface_title } - @OptIn(ExperimentalStdlibApi::class) override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences_interface, rootKey) preferenceManager.preferenceDataStore = SettingsDataStore() -// //Anim in file list -// val swtAnimInFileList = findPreference("testssss") -// val isEnabledAnimInFileList = Preferences.Interface.isAnimationEnabledForFileList -// swtAnimInFileList?.isChecked = isEnabledAnimInFileList - //Rounded corners val swtRoundedCorners = findPreference("rounded_corners") val isEnabledRoundedCorner = Preferences.Interface.isEnabledRoundedCorners swtRoundedCorners?.isChecked = isEnabledRoundedCorner - swtRoundedCorners?.setOnPreferenceChangeListener { preference, newValue -> + swtRoundedCorners?.setOnPreferenceChangeListener { _, _ -> restart() true } @@ -55,7 +47,7 @@ class InterfacePreferences : PreferenceFragment() { simpleMenuPreference?.summary = fileInformationSummary - simpleMenuPreference?.setOnPreferenceChangeListener { preference, newValue -> + simpleMenuPreference?.setOnPreferenceChangeListener { _, newValue -> val newOptionName = newValue as String val newOption = ViewFileInformationOption.valueOf(newOptionName) currentFileInformationOption = newOption @@ -88,7 +80,7 @@ class InterfacePreferences : PreferenceFragment() { findPreference(getString(R.string.pref_key_selected_file_background_opacity))!! selectedFileBackgroundOpacity.summary = opacitySummary - selectedFileBackgroundOpacity.setOnPreferenceClickListener { preference -> + selectedFileBackgroundOpacity.setOnPreferenceClickListener { _ -> MaterialAlertDialogBuilder(requireContext()).setTitle(getString(R.string.pref_title_selected_file_background_opacity)) .setSingleChoiceItems(opacityEntries, currentOpacityIndex) { dialog, which -> if (which != currentOpacityIndex) { @@ -100,7 +92,7 @@ class InterfacePreferences : PreferenceFragment() { dialog.cancel() } - .setNegativeButton(getString(R.string.dialog_cancel)) { dialog, which -> + .setNegativeButton(getString(R.string.dialog_cancel)) { _, _ -> }.show() true } @@ -120,7 +112,7 @@ class InterfacePreferences : PreferenceFragment() { findPreference(getString(R.string.pref_key_file_list_margins))!! fileListMargins.summary = fileListMarginsSummary - fileListMargins.setOnPreferenceClickListener { preference -> + fileListMargins.setOnPreferenceClickListener { _ -> MaterialAlertDialogBuilder(requireContext()).setTitle(getString(R.string.pref_title_file_list_margins)) .setSingleChoiceItems(fileListMarginsEntries, currentMarginIndex) { dialog, which -> if (which != currentMarginIndex) { @@ -133,7 +125,7 @@ class InterfacePreferences : PreferenceFragment() { dialog.cancel() } - .setNegativeButton(getString(R.string.dialog_cancel)) { dialog, which -> + .setNegativeButton(getString(R.string.dialog_cancel)) { _, _ -> }.show() true } @@ -147,7 +139,7 @@ class InterfacePreferences : PreferenceFragment() { val prefCornerFamily = findPreference(getString(R.string.pref_key_corner_family))!! - prefCornerFamily.setOnPreferenceClickListener { preference -> + prefCornerFamily.setOnPreferenceClickListener { _ -> MaterialAlertDialogBuilder(requireContext()).setTitle(getString(R.string.pref_title_corner_family)) .setSingleChoiceItems(cornerFamilyEntries, currentCornerFamily) { dialog, which -> if (which != currentCornerFamily) { @@ -158,7 +150,7 @@ class InterfacePreferences : PreferenceFragment() { dialog.cancel() } - .setNegativeButton(getString(R.string.dialog_cancel)) { dialog, which -> + .setNegativeButton(getString(R.string.dialog_cancel)) { _, _ -> }.show() true } diff --git a/app/src/main/java/com/etb/filemanager/ui/style/IconUtil.kt b/app/src/main/java/com/etb/filemanager/ui/style/IconUtil.kt index 40fe1afc..54eb91ca 100644 --- a/app/src/main/java/com/etb/filemanager/ui/style/IconUtil.kt +++ b/app/src/main/java/com/etb/filemanager/ui/style/IconUtil.kt @@ -13,11 +13,11 @@ import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.drawable.Drawable import android.media.MediaMetadataRetriever -import android.util.Log import android.widget.ImageView import com.etb.filemanager.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import kotlin.math.ceil class IconUtil { private val colorUtil = ColorUtil() @@ -30,6 +30,7 @@ class IconUtil { return iconFolder } + @SuppressLint("UseCompatLoadingForDrawables") fun getPreviewImage(context: Context): Drawable { val colorPrimaryInverse = colorUtil.getColorPrimaryInverse(context) @@ -38,6 +39,7 @@ class IconUtil { return iconFolder } + @SuppressLint("UseCompatLoadingForDrawables") fun getPreviewVideo(context: Context): Drawable { val colorPrimaryInverse = colorUtil.getColorPrimaryInverse(context) @@ -56,27 +58,11 @@ class IconUtil { return iconArchive } - @SuppressLint("UseCompatLoadingForDrawables") - fun getBorderPreview(context: Context): Drawable { - return context.getDrawable(R.drawable.background_border)!! - } - @SuppressLint("UseCompatLoadingForDrawables") - fun getBorderNormal(context: Context): Drawable { - return context.getDrawable(R.drawable.background_icon_item)!! - } - - @SuppressLint("UseCompatLoadingForDrawables") - fun getBackgroundItemSelected(context: Context): Drawable { - return context.getDrawable(R.drawable.background_file_item_selected)!! - } - - @SuppressLint("UseCompatLoadingForDrawables") - fun getBackgroundItemNormal(context: Context): Drawable { - return context.getDrawable(R.drawable.background_file_item)!! - } - - - suspend fun getBitmapPreviewFromPath(filePath: String, targetWidth: Int, targetHeight: Int): Bitmap? { + private suspend fun getBitmapPreviewFromPath( + filePath: String, + targetWidth: Int, + targetHeight: Int + ): Bitmap? { return withContext(Dispatchers.IO) { try { val options = BitmapFactory.Options().apply { @@ -84,7 +70,12 @@ class IconUtil { } BitmapFactory.decodeFile(filePath, options) - val scaleFactor = calculateScaleFactor(options.outWidth, options.outHeight, targetWidth, targetHeight) + val scaleFactor = calculateScaleFactor( + options.outWidth, + options.outHeight, + targetWidth, + targetHeight + ) val previewOptions = BitmapFactory.Options().apply { inSampleSize = scaleFactor @@ -92,26 +83,15 @@ class IconUtil { return@withContext BitmapFactory.decodeFile(filePath, previewOptions) } catch (e: Exception) { - Log.e("Erro ao obter img", "Erro ${e.message}") + e.printStackTrace() } return@withContext null } } - suspend fun getPreview(optionFile: OptionFile, context: Context, filePath: String, imageView: ImageView) { - when (optionFile) { - OptionFile.IMAGE -> loadImagePreview(context, filePath, 50, 50, imageView) - OptionFile.VIDEO -> loadVideoPreview(context, imageView, filePath) - } - } - - suspend fun loadImagePreview( - context: Context, - filePath: String, - targetWidth: Int, - targetHeight: Int, - imageView: ImageView + private suspend fun loadImagePreview( + filePath: String, targetWidth: Int, targetHeight: Int, imageView: ImageView ) { val bitmap = getBitmapPreviewFromPath(filePath, targetWidth, targetHeight) bitmap?.let { @@ -121,32 +101,33 @@ class IconUtil { } } - fun calculateScaleFactor(imageWidth: Int, imageHeight: Int, targetWidth: Int, targetHeight: Int): Int { + private fun calculateScaleFactor( + imageWidth: Int, + imageHeight: Int, + targetWidth: Int, + targetHeight: Int + ): Int { var scaleFactor = 1 if (imageWidth > targetWidth || imageHeight > targetHeight) { val widthScale = imageWidth.toFloat() / targetWidth.toFloat() val heightScale = imageHeight.toFloat() / targetHeight.toFloat() - scaleFactor = Math.ceil(Math.max(widthScale, heightScale).toDouble()).toInt() + scaleFactor = ceil(widthScale.coerceAtLeast(heightScale).toDouble()).toInt() } return scaleFactor } - suspend fun getVideoPreviewFromPath(context: Context, videoPath: String): Bitmap? { + private suspend fun getVideoPreviewFromPath(videoPath: String): Bitmap? { return withContext(Dispatchers.IO) { val retriever = MediaMetadataRetriever() try { - // Defina o caminho do vídeo para o MediaMetadataRetriever retriever.setDataSource(videoPath) - - // Obtenha o frame do vídeo como um Bitmap return@withContext retriever.getFrameAtTime(0) } catch (e: Exception) { e.printStackTrace() } finally { - // Libere os recursos do MediaMetadataRetriever retriever.release() } @@ -154,8 +135,8 @@ class IconUtil { } } - suspend fun loadVideoPreview(context: Context, imageView: ImageView, videoPath: String) { - val bitmap = getVideoPreviewFromPath(context, videoPath) + private suspend fun loadVideoPreview(imageView: ImageView, videoPath: String) { + val bitmap = getVideoPreviewFromPath(videoPath) bitmap?.let { withContext(Dispatchers.Main) { @@ -165,9 +146,8 @@ class IconUtil { } - enum class OptionFile() { - IMAGE, - VIDEO + enum class OptionFile { + IMAGE, VIDEO } diff --git a/app/src/main/java/com/etb/filemanager/ui/view/ReadOnlyEditText.kt b/app/src/main/java/com/etb/filemanager/ui/view/ReadOnlyEditText.kt deleted file mode 100644 index a8a4401d..00000000 --- a/app/src/main/java/com/etb/filemanager/ui/view/ReadOnlyEditText.kt +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2023 Juan Nascimento - * Part of FileManagerSphere - ReadOnlyEditText.kt - * SPDX-License-Identifier: GPL-3.0-or-later - * More details at: https://www.gnu.org/licenses/ - */ - -package com.etb.filemanager.ui.view - -import android.annotation.SuppressLint -import android.content.Context -import android.graphics.Color -import android.graphics.drawable.Drawable -import android.graphics.drawable.RippleDrawable -import android.os.Build -import android.text.Editable -import android.text.method.MovementMethod -import android.util.AttributeSet -import android.view.View -import androidx.annotation.AttrRes -import androidx.appcompat.widget.AppCompatEditText -import androidx.core.text.set -import com.google.android.material.shape.MaterialShapeDrawable - -class ReadOnlyEditText : AppCompatEditText { - constructor(context: Context) : super(context) - - constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) - - constructor(context: Context, attrs: AttributeSet?, @AttrRes defStyleAttr: Int) : super( - context, attrs, defStyleAttr - ) - - init { - setTextIsSelectable(isTextSelectable) - } - - override fun getFreezesText(): Boolean = false - - override fun getDefaultEditable(): Boolean = false - - override fun getDefaultMovementMethod(): MovementMethod? = null - - override fun setText(text: CharSequence?, type: BufferType?) { - super.setText(text, type) - - - - } - - override fun getText(): Editable? { - return super.getText() - } - override fun getEditableText(): Editable { - return super.getEditableText() - } - - override fun setTextIsSelectable(selectable: Boolean) { - super.setTextIsSelectable(selectable) - - - - if (selectable) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - focusable = View.FOCUSABLE_AUTO - } - } else { - isClickable = false - isFocusable = false - } - background = background - } - - - override fun setBackgroundDrawable(background: Drawable?) { - var background = background - if (isTextSelectable) { - if (background is RippleDrawable) { - val content = background.findDrawableByLayerId(0) - if (content is MaterialShapeDrawable) { - background = content - } - } - } else { - if (background is MaterialShapeDrawable) { - background = addRippleEffect(background) - } - } - @Suppress("DEPRECATION") - super.setBackgroundDrawable(background) - } - - - @SuppressLint("ResourceType") - private fun addRippleEffect(boxBackground: MaterialShapeDrawable): Drawable { - val rippleColor = - context.getColorStateList(androidx.appcompat.R.attr.colorControlHighlight) - val mask = MaterialShapeDrawable(boxBackground.shapeAppearanceModel) - .apply { setTint(Color.WHITE) } - return RippleDrawable(rippleColor, boxBackground, mask) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/etb/filemanager/ui/view/ReadOnlyTextInputLayout.kt b/app/src/main/java/com/etb/filemanager/ui/view/ReadOnlyTextInputLayout.kt deleted file mode 100644 index f6c62fd7..00000000 --- a/app/src/main/java/com/etb/filemanager/ui/view/ReadOnlyTextInputLayout.kt +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2023 Juan Nascimento - * Part of FileManagerSphere - ReadOnlyTextInputLayout.kt - * SPDX-License-Identifier: GPL-3.0-or-later - * More details at: https://www.gnu.org/licenses/ - */ - -package com.etb.filemanager.ui.view - -import android.annotation.SuppressLint -import android.content.Context -import android.graphics.Color -import android.graphics.drawable.Drawable -import android.graphics.drawable.RippleDrawable -import android.os.Build -import android.text.method.MovementMethod -import android.util.AttributeSet -import android.view.View - -import androidx.annotation.AttrRes -import androidx.appcompat.widget.AppCompatEditText -import com.google.android.material.shape.MaterialShapeDrawable - -class ReadOnlyTextInputLayout : AppCompatEditText { - constructor(context: Context) : super(context) - constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) - constructor(context: Context, attrs: AttributeSet?, @AttrRes defStyleAttr: Int) : super( - context, attrs, defStyleAttr - ) - - init { - setTextIsSelectable(isTextSelectable) - } - - - override fun getFreezesText(): Boolean { - return super.getFreezesText() - } - - override fun getDefaultEditable(): Boolean { - return super.getDefaultEditable() - } - - override fun getDefaultMovementMethod(): MovementMethod { - return super.getDefaultMovementMethod() - } - - override fun setTextIsSelectable(selectable: Boolean) { - super.setTextIsSelectable(selectable) - - if (selectable){ - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ - focusable = View.FOCUSABLE_AUTO - } - }else{ - isClickable = false - isFocusable = false - } - background = background - } - - @Deprecated("Deprecated in Java") - override fun setBackgroundDrawable(background: Drawable?) { - var background = background - if (isTextSelectable){ - if (background is RippleDrawable){ - val content = background.findDrawableByLayerId(0) - if (content is MaterialShapeDrawable){ - background = content - } - } - }else{ - if (background is MaterialShapeDrawable){ - background = addRippleEffect(background) - } - } - super.setBackgroundDrawable(background) - } - - @SuppressLint("ResourceType") - private fun addRippleEffect(boxBackground: MaterialShapeDrawable): Drawable{ - val rippleColor = context.getColorStateList(androidx.appcompat.R.attr.colorControlHighlight) - val mask = MaterialShapeDrawable(boxBackground.shapeAppearanceModel) - .apply { setText(Color.WHITE) } - return RippleDrawable(rippleColor, boxBackground, mask) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/etb/filemanager/ui/view/ScrollingViewOnApplyWindowInsetsListener.kt b/app/src/main/java/com/etb/filemanager/ui/view/ScrollingViewOnApplyWindowInsetsListener.kt index 5c318b78..3040e603 100644 --- a/app/src/main/java/com/etb/filemanager/ui/view/ScrollingViewOnApplyWindowInsetsListener.kt +++ b/app/src/main/java/com/etb/filemanager/ui/view/ScrollingViewOnApplyWindowInsetsListener.kt @@ -22,6 +22,7 @@ class ScrollingViewOnApplyWindowInsetsListener( fastScroller.setPadding(0, 0, 0, 0) } + @Suppress("DEPRECATION") override fun onApplyWindowInsets(view: View, insets: WindowInsets): WindowInsets { view.setPadding( initialPadding.left, initialPadding.top, initialPadding.right,