diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b458ad6..aba6ca2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,8 +11,8 @@ android { applicationId = "io.github.devhyper.openvideoeditor" minSdk = 26 targetSdk = 34 - versionCode = 5 - versionName = "1.1.1" + versionCode = 6 + versionName = "1.1.2" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -58,35 +58,36 @@ android { androidResources { generateLocaleConfig = true } + buildToolsVersion = "35.0.0 rc2" } dependencies { - implementation("androidx.core:core-ktx:1.12.0") + implementation("androidx.core:core-ktx:1.13.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") implementation("androidx.lifecycle:lifecycle-runtime-compose:2.7.0") - implementation("androidx.activity:activity-compose:1.8.2") - implementation(platform("androidx.compose:compose-bom:2024.02.02")) + implementation("androidx.activity:activity-compose:1.9.0") + implementation(platform("androidx.compose:compose-bom:2024.04.01")) implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.material3:material3") implementation("androidx.compose.material:material-icons-core") implementation("androidx.compose.material:material-icons-extended") - implementation("androidx.media3:media3-exoplayer:1.3.0") - implementation("androidx.media3:media3-transformer:1.3.0") - implementation("androidx.media3:media3-effect:1.3.0") - implementation("androidx.media3:media3-common:1.3.0") + implementation("androidx.media3:media3-exoplayer:1.3.1") + implementation("androidx.media3:media3-transformer:1.3.1") + implementation("androidx.media3:media3-effect:1.3.1") + implementation("androidx.media3:media3-common:1.3.1") implementation("androidx.navigation:navigation-compose:2.7.7") - implementation("androidx.datastore:datastore-preferences:1.0.0") + implementation("androidx.datastore:datastore-preferences:1.1.0") implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7") implementation("com.godaddy.android.colorpicker:compose-color-picker:0.7.0") implementation("com.godaddy.android.colorpicker:compose-color-picker-android:0.7.0") - implementation("com.arthenica:ffmpeg-kit-min-gpl:6.0-2") + implementation("com.arthenica:ffmpeg-kit-min:6.0-2") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2024.02.02")) + androidTestImplementation(platform("androidx.compose:compose-bom:2024.04.01")) androidTestImplementation("androidx.compose.ui:ui-test-junit4") debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest") -} \ No newline at end of file +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5012c23..a5a2241 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,11 @@ android:name="android.permission.ACCESS_NETWORK_STATE" tools:node="remove" /> + + + + + + + + + + + + diff --git a/app/src/main/java/io/github/devhyper/openvideoeditor/misc/Utils.kt b/app/src/main/java/io/github/devhyper/openvideoeditor/misc/Utils.kt index 735c5c0..8717579 100644 --- a/app/src/main/java/io/github/devhyper/openvideoeditor/misc/Utils.kt +++ b/app/src/main/java/io/github/devhyper/openvideoeditor/misc/Utils.kt @@ -39,16 +39,18 @@ import java.util.concurrent.TimeUnit fun getFileNameFromUri(context: Context, uri: Uri): String { - val fileName: String? + var fileName: String? = null val cursor = context.contentResolver.query(uri, null, null, null, null) val nameIndex = cursor?.getColumnIndex(OpenableColumns.DISPLAY_NAME) - cursor?.moveToFirst() - fileName = nameIndex?.let { cursor.getString(it) } + val cursorHasValue = cursor?.moveToFirst() + if (cursorHasValue == true) { + fileName = nameIndex?.let { cursor.getString(it) } + } cursor?.close() - if (fileName.isNullOrEmpty()) { - return "null" + if (!fileName.isNullOrEmpty()) { + return fileName } - return fileName + return "null" } fun getVideoFileDuration(context: Context, uri: Uri): Long? { diff --git a/app/src/main/java/io/github/devhyper/openvideoeditor/settings/SettingsDataStore.kt b/app/src/main/java/io/github/devhyper/openvideoeditor/settings/SettingsDataStore.kt index afba10b..322a3c5 100644 --- a/app/src/main/java/io/github/devhyper/openvideoeditor/settings/SettingsDataStore.kt +++ b/app/src/main/java/io/github/devhyper/openvideoeditor/settings/SettingsDataStore.kt @@ -19,6 +19,7 @@ class SettingsDataStore(private val context: Context) { val THEME = stringPreferencesKey("theme") val LEGACY_FILE_PICKER = booleanPreferencesKey("legacy_file_picker") val UI_CASCADING_EFFECT = booleanPreferencesKey("ui_cascading_effect") + val AMOLED_DARK_THEME = booleanPreferencesKey("amoled_dark_theme") } fun getThemeBlocking(): String { @@ -41,6 +42,26 @@ class SettingsDataStore(private val context: Context) { } } + fun getAmoledBlocking(): Boolean { + return runBlocking { + val preferences = context.dataStore.data.first() + preferences[AMOLED_DARK_THEME] ?: false + } + } + + fun getAmoledAsync(): Flow { + return context.dataStore.data + .map { preferences -> + preferences[AMOLED_DARK_THEME] ?: false + } + } + + suspend fun setAmoled(value: Boolean) { + context.dataStore.edit { preferences -> + preferences[AMOLED_DARK_THEME] = value + } + } + fun getLegacyFilePickerBlocking(): Boolean { return runBlocking { val preferences = context.dataStore.data.first() diff --git a/app/src/main/java/io/github/devhyper/openvideoeditor/settings/SettingsScreen.kt b/app/src/main/java/io/github/devhyper/openvideoeditor/settings/SettingsScreen.kt index 482b854..517b97e 100644 --- a/app/src/main/java/io/github/devhyper/openvideoeditor/settings/SettingsScreen.kt +++ b/app/src/main/java/io/github/devhyper/openvideoeditor/settings/SettingsScreen.kt @@ -118,6 +118,19 @@ fun SettingsScreen() { } }) } + item { + val useAmoled = dataStore.getAmoledBlocking() + SwitchSetting( + name = stringResource(R.string.amoled_dark_theme), + startChecked = useAmoled, + onCheckChanged = { + if (it != useAmoled) { + scope.launch { + dataStore.setAmoled(it) + } + } + }) + } } } ) diff --git a/app/src/main/java/io/github/devhyper/openvideoeditor/ui/theme/Theme.kt b/app/src/main/java/io/github/devhyper/openvideoeditor/ui/theme/Theme.kt index da3bf49..c85cdaf 100644 --- a/app/src/main/java/io/github/devhyper/openvideoeditor/ui/theme/Theme.kt +++ b/app/src/main/java/io/github/devhyper/openvideoeditor/ui/theme/Theme.kt @@ -49,11 +49,13 @@ fun OpenVideoEditorTheme( dynamicColor: Boolean = true, content: @Composable () -> Unit ) { + val dataStore = SettingsDataStore(LocalContext.current) + val theme by dataStore.getThemeAsync().collectAsState(dataStore.getThemeBlocking()) + val amoled by dataStore.getAmoledAsync().collectAsState(dataStore.getAmoledBlocking()) + val darkTheme = if (forceDarkTheme) { true } else { - val dataStore = SettingsDataStore(LocalContext.current) - val theme by dataStore.getThemeAsync().collectAsState(dataStore.getThemeBlocking()) when (theme) { "Light" -> false "Dark" -> true @@ -61,7 +63,7 @@ fun OpenVideoEditorTheme( } } - val colorScheme = when { + var colorScheme = when { dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { val context = LocalContext.current if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) @@ -70,6 +72,10 @@ fun OpenVideoEditorTheme( darkTheme -> DarkColorScheme else -> LightColorScheme } + if (darkTheme && amoled) { + colorScheme = colorScheme.copy(background = Color.Black, surface = Color.Black) + } + val view = LocalView.current if (!view.isInEditMode) { SideEffect { diff --git a/app/src/main/java/io/github/devhyper/openvideoeditor/videoeditor/TransformManager.kt b/app/src/main/java/io/github/devhyper/openvideoeditor/videoeditor/TransformManager.kt index 23a2515..f715828 100644 --- a/app/src/main/java/io/github/devhyper/openvideoeditor/videoeditor/TransformManager.kt +++ b/app/src/main/java/io/github/devhyper/openvideoeditor/videoeditor/TransformManager.kt @@ -1,10 +1,13 @@ package io.github.devhyper.openvideoeditor.videoeditor +import android.Manifest import android.annotation.SuppressLint import android.content.Context import android.content.Intent -import android.content.pm.PackageManager.PERMISSION_DENIED -import android.os.Binder +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Build +import androidx.activity.result.ActivityResultLauncher import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.vector.ImageVector import androidx.core.net.toUri @@ -231,7 +234,11 @@ class TransformManager { lateinit var projectData: ProjectData fun init( - exoPlayer: ExoPlayer, uri: String, context: Context, viewModel: VideoEditorViewModel + exoPlayer: ExoPlayer, + uri: String, + context: Context, + viewModel: VideoEditorViewModel, + requestVideoPermission: ActivityResultLauncher ) { if (hasInitialized) { if (exoPlayer != player) { @@ -251,20 +258,16 @@ class TransformManager { } else { ProjectData(uri) } - val perm = context.checkUriPermission( - uri.toUri(), null, null, - Binder.getCallingPid(), Binder.getCallingUid(), - Intent.FLAG_GRANT_READ_URI_PERMISSION - ) - if (perm != PERMISSION_DENIED) { - viewModel.setProjectSavingSupported(true) - context.contentResolver.takePersistableUriPermission( + var projectSavingSupported = false + if (requestPersistablePermissions( + context, uri.toUri(), - Intent.FLAG_GRANT_READ_URI_PERMISSION + requestVideoPermission ) - } else { - viewModel.setProjectSavingSupported(false) + ) { + projectSavingSupported = true } + viewModel.setProjectSavingSupported(projectSavingSupported) hasInitialized = true } originalMedia = MediaItem.fromUri(projectData.uri) @@ -278,6 +281,31 @@ class TransformManager { } } + private fun requestPersistablePermissions( + context: Context, + uri: Uri, + requestVideoPermission: ActivityResultLauncher + ): Boolean { + try { + context.contentResolver.takePersistableUriPermission( + uri, + Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + } catch (_: SecurityException) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (context.checkSelfPermission(Manifest.permission.READ_MEDIA_VIDEO) != PackageManager.PERMISSION_GRANTED) { + requestVideoPermission.launch(Manifest.permission.READ_MEDIA_VIDEO) + } + } else { + if (context.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + requestVideoPermission.launch(Manifest.permission.READ_EXTERNAL_STORAGE) + } + } + return false + } + return true + } + private fun getEffectArray(): MutableList { val effectArray = mutableListOf() for (userEffect in projectData.videoEffects) { diff --git a/app/src/main/java/io/github/devhyper/openvideoeditor/videoeditor/VideoEditorActivity.kt b/app/src/main/java/io/github/devhyper/openvideoeditor/videoeditor/VideoEditorActivity.kt index 80eb313..326d9d4 100644 --- a/app/src/main/java/io/github/devhyper/openvideoeditor/videoeditor/VideoEditorActivity.kt +++ b/app/src/main/java/io/github/devhyper/openvideoeditor/videoeditor/VideoEditorActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.net.Uri import android.os.Build import android.os.Bundle +import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.result.ActivityResultLauncher @@ -11,14 +12,16 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.lifecycle.viewmodel.compose.viewModel +import io.github.devhyper.openvideoeditor.R import io.github.devhyper.openvideoeditor.misc.PROJECT_MIME_TYPE import io.github.devhyper.openvideoeditor.misc.setImmersiveMode import io.github.devhyper.openvideoeditor.misc.setupSystemUi class VideoEditorActivity : ComponentActivity() { - private lateinit var createDocument: ActivityResultLauncher - private lateinit var createProject: ActivityResultLauncher + private lateinit var createDocument: ActivityResultLauncher + private lateinit var createProject: ActivityResultLauncher + private lateinit var requestVideoPermission: ActivityResultLauncher private lateinit var viewModel: VideoEditorViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -49,9 +52,21 @@ class VideoEditorActivity : ComponentActivity() { viewModel.setProjectOutputPath(uri.toString()) } } + requestVideoPermission = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { + if (it) { + recreate() + } else { + val text = getString(R.string.permission_denied_grant_video_permissions) + val duration = Toast.LENGTH_SHORT + + val toast = Toast.makeText(this, text, duration) + toast.show() + } + } var uri: String? = null - if (intent.action == Intent.ACTION_EDIT) { + if (intent.action == Intent.ACTION_EDIT || intent.action == Intent.ACTION_VIEW) { intent.dataString?.let { uri = it } @@ -73,7 +88,7 @@ class VideoEditorActivity : ComponentActivity() { viewModel = viewModel { viewModel } val controlsVisible by viewModel.controlsVisible.collectAsState() setImmersiveMode(!controlsVisible) - VideoEditorScreen(it, createDocument, createProject) + VideoEditorScreen(it, createDocument, createProject, requestVideoPermission) } } ?: finish() } diff --git a/app/src/main/java/io/github/devhyper/openvideoeditor/videoeditor/VideoEditorScreen.kt b/app/src/main/java/io/github/devhyper/openvideoeditor/videoeditor/VideoEditorScreen.kt index bfdaf80..799266d 100644 --- a/app/src/main/java/io/github/devhyper/openvideoeditor/videoeditor/VideoEditorScreen.kt +++ b/app/src/main/java/io/github/devhyper/openvideoeditor/videoeditor/VideoEditorScreen.kt @@ -134,10 +134,10 @@ import kotlinx.coroutines.launch @Composable fun VideoEditorScreen( uri: String, - createDocument: ActivityResultLauncher, - createProject: ActivityResultLauncher + createDocument: ActivityResultLauncher, + createProject: ActivityResultLauncher, + requestVideoPermission: ActivityResultLauncher ) { - val viewModel = viewModel { VideoEditorViewModel() } val context = LocalContext.current @@ -163,7 +163,7 @@ fun VideoEditorScreen( val transformManager = remember { viewModel.transformManager.apply { - init(player, uri, context, viewModel) + init(player, uri, context, viewModel, requestVideoPermission) player.seekTo(currentTime) } } @@ -223,11 +223,14 @@ fun VideoEditorScreen( ) { super.onEvents(player, events) - fpm = (player.videoFormat?.frameRate ?: 0F) / 1000F - if (player.duration > 0L && fpm > 0F) { + if (player.duration > 0L) { totalDuration = player.duration - totalDurationFrames = (totalDuration * fpm).toLong() + fpm = (player.videoFormat?.frameRate ?: 0F) / 1000F + if (fpm > 0F) { + totalDurationFrames = (totalDuration * fpm).toLong() + } } + isPlaying = player.isPlaying playbackState = player.playbackState @@ -362,8 +365,8 @@ private fun PlayerControls( isPlaying: () -> Boolean, title: () -> String, transformManager: TransformManager, - createDocument: ActivityResultLauncher, - createProject: ActivityResultLauncher, + createDocument: ActivityResultLauncher, + createProject: ActivityResultLauncher, onReplayClick: () -> Unit, onForwardClick: () -> Unit, onPauseToggle: () -> Unit, @@ -454,8 +457,8 @@ private fun TopControls( modifier: Modifier = Modifier, title: () -> String, transformManager: TransformManager, - createDocument: ActivityResultLauncher, - createProject: ActivityResultLauncher + createDocument: ActivityResultLauncher, + createProject: ActivityResultLauncher ) { val activity = LocalContext.current as Activity val viewModel = viewModel { VideoEditorViewModel() } @@ -1098,7 +1101,7 @@ private fun FilterDialog( @Composable private fun ExportDialog( transformManager: TransformManager, - createDocument: ActivityResultLauncher, + createDocument: ActivityResultLauncher, title: String, activity: Activity, onDismissRequest: () -> Unit diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index a6b3dae..ac3c95c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,2 +1,67 @@ - \ No newline at end of file + + Atras + Exportar + Ajustes + Disminuir marco + Incrementar el marco + Aplicar filtro + Rechazar el filtro + Abrir el panel de filtros + icono de capa + Eliminar el filtro + Filtros de vídeo + Recortar + Cancelar + Añadir + Modo HDR + Tipo de audio + Tipo de vídeo + Exportado + Exportando + Descartar + Error + Seleccionar un archivo para editar + Proyecto + Capas de vídeo + Reproducir/Pausar + Repetir durante 5 segundos + Guardar el proyecto + Vídeo + Escala de grises + Avanzar 10 segundos + Más opciones verticales + Fotogramas por segundo + Velocidad + Tema + Utilice el selector de archivos heredado + Color de fondo + Color frontal + Texto + Establecer + Tamaño + Selector de color + Aceptar + Utilizar el efecto cascada de la interfaz de usuario + Fotogramas + Nuevo fotograma + La entrada debe ser inferior o igual a + Colores invertidos + Resolución + Ancho + Disposición + Escala + Girar + Por defecto + Fuente + Recortar sin pérdidas + Información de la configuración + Error FFmpeg + Abrir el panel de capas + Exportar medios + Alto + Grados + La velocidad de fotogramas debe ser inferior a la velocidad de fotogramas del vídeo original + Al habilitar el corte sin pérdidas solo se exportarán las secciones acortadas. + Cortar + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d45564c..86082bd 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -62,4 +62,6 @@ Texte Appliquer Taille + Lorem Ipsum + Police d\'écriture \ No newline at end of file diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml new file mode 100644 index 0000000..309ac24 --- /dev/null +++ b/app/src/main/res/values-ia/strings.xml @@ -0,0 +1,46 @@ + + + Avantiar 10 secundas + Reproducer/Pausar + Velocitate + Usar le selector ancian de files + Definir + Salveguardar le projecto + Predefinite + Cancellar + Adder + Medio a exportar + Modo HDR + Typo de audio + Exportate + Typo de video + In exportation + Dimitter + Error + Selige un file a modificar + Projecto + Plus de optiones vertical + Thema + Color de fundo + Color de prime plano + Texto + Dimension + Selector de color + Acceptar + Video + Scala de gris + Inverter le colores + Resolution + Disposition + Scala + Taliar + Error de FFmpeg + Exportar + Parametros + Acceptar le filtro + Remover le filtro + Filtros de video + Accurtar + Retornar + Aperir le tiratorio de filtros + \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 0000000..c6134b8 --- /dev/null +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,67 @@ + + + Voltar + Exportar + Configurações + Frame anterior + Aceitar filtro + Recusar filtro + Frame seguinte + Abrir o painel de camadas + Remover filtro + Abrir painel de filtro + Ícone de camada + Cancelar + Adicionar + Exportar mídia + Modo HDR + Exportando + Selecione um arquivo para editar + Camadas de vídeo + Avançar 10 segundos + Reproduzir/Pausar + Mais opções verticais + Taxa de quadros + Velocidade + Tema + Escolher outro seletor de arquivo + Aplicar + Tamanho + Aceitar + Usar efeito em cascata da interface do usuário + Frames + Novo frame + Vídeo + Escala de cinza + Inverter cores + Resolução + Graus + Corte livre + A taxa de quadros deve ser menor que a do vídeo original + Corte sem perdas + Informações de configuração + Erro FFmpeg + Fonte + Filtros de vídeo + Cortar + Tipo de áudio + Tipo de vídeo + Exportado + Fechar + Erro + Projeto + retroceder 5 segundos + Cor de fundo + Texto + Cor do primeiro plano + Seletor de cores + Salvar Projeto + Ativar o corte sem perdas exportará apenas as seções encurtadas. + Padrão + A entrada deve ser menor ou igual a + Largura + Altura + Layout + Escala + Girar + \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml new file mode 100644 index 0000000..ee05338 --- /dev/null +++ b/app/src/main/res/values-pt/strings.xml @@ -0,0 +1,32 @@ + + + Exportar + Frame anterior + Aceitar filtro + Recusar filtro + Modo HDR + Tipo de áudio + Exportando + Fechar + Erro + Selecione um arquivo para editar + Projeto + Camadas de vídeo + Avançar 10 segundos + Retroceder 5 segundos + Taxa de quadros + Voltar + Configurações + Remover filtro + Filtros de vídeo + Cortar + Cancelar + Adicionar + Exportar mídia + Tipo de vídeo + Exportado + Reproduzir/Pausar + Mais opções verticais + Velocidade + Tema + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b30243c..73e24ce 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -11,4 +11,9 @@ Видео Добавить Разрешение + Размер + Назад + Выберите файл для редактирования + Цвет фона + Шрифт \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml new file mode 100644 index 0000000..c2c8230 --- /dev/null +++ b/app/src/main/res/values-tr/strings.xml @@ -0,0 +1,69 @@ + + Video Düzenleyiciyi Aç + Geri + Dışa Aktar + Ayarlar + Azaltma çerçevesi + Artırma çerçevesi + Filtreyi kabul et + Filtreyi reddet + Katman çekmecesini aç + Filtre çekmecesini aç + Katman simgesi + Filtreyi kaldır + Video Filtreleri + Düzelt + İptal + Ekle + Dışa Aktarılacak Medya + HDR Modu + Ses Türü + Video Türü + Dışa aktarıldı + Dışa aktarılıyor + Kapat + Hata + Düzenlemek için bir dosya seçin + Proje + Video Katmanları + 10 saniye ileri sar + Oynat/Duraklat + 5 saniye tekrar oynat + Daha fazla dikey seçenek + Kare hızı + Hız + Tema + Eski dosya seçiciyi kullan + Arka Plan Rengi + Ön Plan Rengi + Metin + Set + Boyut + Renk Seçici + Kabul Et + Projeyi kaydet + Kullanıcı arabirimi basamaklama efekti kullan + Çerçeveler + Yeni çerçeve + Girdi şundan küçük veya şuna eşit olmalıdır + Video + Gri tonlamalı + Renkleri Tersine Çevir + Çözünürlük + Genişlik + Yükseklik + Düzen + Ölçek + X + Y + Döndür + Derece + Kırp + Kare hızı, orijinal videonun kare hızından daha düşük olmalıdır + Kayıpsız kesim + Ayar bilgisi + Kayıpsız kesimi etkinleştirmek yalnızca kırpmaları dışa aktarır. + FFmpeg Hatası + Varsayılan + Yazı tipi + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 4c5b6fa..2592157 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -8,8 +8,8 @@ 開啟圖層面板 開啟篩選器面板 HDR 模式 - 音訊類型 - 視訊類型 + 音訊編碼類型 + 視訊編碼類型 移除篩選器 匯出媒體 剪輯 @@ -42,9 +42,9 @@ 裁切 影格速率必須小於原始視訊的影格速率 設定資訊 - 無損裁減 + 無損裁剪 FFmpeg 錯誤 - 啟用無損裁減只能匯出剪輯。 + 啟用無損裁剪只能匯出剪輯。 返回 匯出 設定 @@ -58,7 +58,9 @@ 背景色彩 前景色彩 色彩選擇器 - 視訊 + 影片 視訊篩選器 輸入必須小於或等於 + 預設 + 字型 \ No newline at end of file diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 55e743b..ef57b79 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1,3 +1,4 @@ + 返回 导出 @@ -57,4 +58,10 @@ 布局 角度 帧率必须比原视频的帧率低 + 开启无损剪切将只导出剪辑。 + FFmpeg 错误 + 默认 + 字体 + 无损剪切 + 设置信息 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 86948dc..1d351e8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,4 +66,6 @@ FFmpeg Error Default Font + AMOLED dark theme + Permission denied, grant video permissions \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index d39e180..f09cb3b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.3.0" apply false + id("com.android.application") version "8.2.2" apply false id("org.jetbrains.kotlin.android") version "1.8.10" apply false } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 46671ac..c244788 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionSha256Sum=03ec176d388f2aa99defcadc3ac6adf8dd2bce5145a129659537c0874dea5ad1 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/metadata/en-US/changelogs/6.txt b/metadata/en-US/changelogs/6.txt new file mode 100644 index 0000000..19f27e6 --- /dev/null +++ b/metadata/en-US/changelogs/6.txt @@ -0,0 +1,13 @@ +New translations: + - Turkish @mikropsoft + - Portuguese @Diegofmar + - Spanish @gallegonovato +New features: + - Allow view intent #73 + - Add AMOLED dark theme #66 +Bug fixes: + - Fix crash on edit #70 + - Fix crash on security exception +Misc: + - Reduce app size + - Update dependencies diff --git a/metadata/es-ES/changelogs/1.txt b/metadata/es-ES/changelogs/1.txt new file mode 100644 index 0000000..2a6ac22 --- /dev/null +++ b/metadata/es-ES/changelogs/1.txt @@ -0,0 +1 @@ +Versión inicial diff --git a/metadata/es-ES/changelogs/2.txt b/metadata/es-ES/changelogs/2.txt new file mode 100644 index 0000000..f55ab6e --- /dev/null +++ b/metadata/es-ES/changelogs/2.txt @@ -0,0 +1 @@ +Correcciones para pantallas pequeñas diff --git a/metadata/es-ES/changelogs/3.txt b/metadata/es-ES/changelogs/3.txt new file mode 100644 index 0000000..ca1e7f0 --- /dev/null +++ b/metadata/es-ES/changelogs/3.txt @@ -0,0 +1,7 @@ +Mantenga presionado el cuadro siguiente/anterior para repetir +Se corrigió el cambio de rotación de la pantalla que causaba que se perdieran las ediciones. +Se corrigió la imposibilidad de seleccionar un video. +Eliminar la extensión del archivo al seleccionar la ubicación de exportación +Agregue la aplicación como acceso directo al menú Compartir +Reparar elementos de la interfaz de usuario que no responden o no se adaptan +Reparar botones de diálogo ocultos en ciertos tamaños de pantalla diff --git a/metadata/es-ES/changelogs/4.txt b/metadata/es-ES/changelogs/4.txt new file mode 100644 index 0000000..458f98f --- /dev/null +++ b/metadata/es-ES/changelogs/4.txt @@ -0,0 +1,8 @@ +Traducción parcial al chino +Actualizar dependencias +Cambiar la velocidad del video y la velocidad de fotogramas +Texto en vídeo +Guardar proyecto +Cultivo +Colores invertidos +Buscar un marco específico diff --git a/metadata/es-ES/changelogs/5.txt b/metadata/es-ES/changelogs/5.txt new file mode 100644 index 0000000..c78cdf2 --- /dev/null +++ b/metadata/es-ES/changelogs/5.txt @@ -0,0 +1,12 @@ +Nuevas traducciones: + - Chino (simplificado) + - Chino (tradicional) + - francés +Nuevas funciones: + - Corte sin pérdidas + - Personalización de la fuente del efecto de texto +Corrección de errores: + - Corrección de fallo al intentar tomar permisos persistentes + - Evitar el redimensionamiento de vídeo en modo inmersivo +Varios + - Actualización de dependencias diff --git a/metadata/es-ES/full_description.txt b/metadata/es-ES/full_description.txt new file mode 100644 index 0000000..c32adb4 --- /dev/null +++ b/metadata/es-ES/full_description.txt @@ -0,0 +1 @@ +

Open Video Editor te permite editar tus videos. Es compatible con HDR y permite aplicar filtros. Con esta aplicación también puedes recortar, escalar y rotar tus videos o incluso escalarlos en escala de grises. También es posible usar esta aplicación para extraer audio de un video, convertir un video HDR a SDR o convertirlo a un formato diferente.

diff --git a/metadata/es-ES/short_description.txt b/metadata/es-ES/short_description.txt new file mode 100644 index 0000000..67b2afe --- /dev/null +++ b/metadata/es-ES/short_description.txt @@ -0,0 +1 @@ +Editor de vídeo Android de código abierto, desarrollo Media3 y Jetpack Compose. diff --git a/metadata/es-ES/title.txt b/metadata/es-ES/title.txt new file mode 100644 index 0000000..0bc6b86 --- /dev/null +++ b/metadata/es-ES/title.txt @@ -0,0 +1 @@ +Open Video Editor diff --git a/metadata/fr-FR/changelogs/3.txt b/metadata/fr-FR/changelogs/3.txt new file mode 100644 index 0000000..8804fbe --- /dev/null +++ b/metadata/fr-FR/changelogs/3.txt @@ -0,0 +1,7 @@ +Appui prolongé sur Frame suivante/précédente pour répéter l'action +Rectif. changement de rotation d'écran qui fait perdre les modifications +Rectif. impossible de sélectionner une vidéo +Retiré extension de fichier au moment di choisir le dossier d'export +Ajout de l'appli en raccourci dans le menu Partage +Rectif. éléments UI qui n'étaient pas "responsive" +Rectif. visibilité de boutons de menu sur certaines tailles d'écran diff --git a/metadata/fr-FR/changelogs/4.txt b/metadata/fr-FR/changelogs/4.txt new file mode 100644 index 0000000..4f6157f --- /dev/null +++ b/metadata/fr-FR/changelogs/4.txt @@ -0,0 +1,8 @@ +Traduction chinoise partielle +Màj des dépendances +Changer la vitesse et le framerate d'une vidéo +Intégrer du texte à la vidéo +Sauvegarder un projet +Découper +Inverser les couleurs +Recherche d'une frame spécifique diff --git a/metadata/fr-FR/changelogs/5.txt b/metadata/fr-FR/changelogs/5.txt new file mode 100644 index 0000000..9f6176c --- /dev/null +++ b/metadata/fr-FR/changelogs/5.txt @@ -0,0 +1,12 @@ +Nouvelles traductions: + - Chinois (Simplifié) + - Chinois (Traditionnel) + - Français +Nouvelles fonctionnalités: + - Découpage "lossless" + - Personnalisation des effets de polices de texte +Correction de bugs: + - Rectif. crash lors de l'octroiement de permissions persistantes + - Rectif. recadrage intempestif de la video en mode immersif +autres: + - Màj des dépendances diff --git a/metadata/fr-FR/title.txt b/metadata/fr-FR/title.txt new file mode 100644 index 0000000..0bc6b86 --- /dev/null +++ b/metadata/fr-FR/title.txt @@ -0,0 +1 @@ +Open Video Editor diff --git a/metadata/pt-BR/changelogs/1.txt b/metadata/pt-BR/changelogs/1.txt new file mode 100644 index 0000000..51269e9 --- /dev/null +++ b/metadata/pt-BR/changelogs/1.txt @@ -0,0 +1 @@ +Lançamento inicial diff --git a/metadata/pt-BR/changelogs/2.txt b/metadata/pt-BR/changelogs/2.txt new file mode 100644 index 0000000..06de9f1 --- /dev/null +++ b/metadata/pt-BR/changelogs/2.txt @@ -0,0 +1 @@ +Pequenas correções de tela diff --git a/metadata/pt-BR/changelogs/3.txt b/metadata/pt-BR/changelogs/3.txt new file mode 100644 index 0000000..430f31b --- /dev/null +++ b/metadata/pt-BR/changelogs/3.txt @@ -0,0 +1,7 @@ +Toque e segure o quadro seguinte/anterior para repetir +Correção de mudança de rotação da tela que fazia com que as edições fossem perdidas +Correção de impossibilidade de selecionar um vídeo +Remove a extensão do arquivo ao selecionar o local de exportação +Adiciona o aplicativo como um atalho no menu Compartilhar +Corrige elementos da IU que não são responsivos/adaptáveis +Corrige botões de diálogo ocultos em determinados tamanhos de tela diff --git a/metadata/pt-BR/changelogs/4.txt b/metadata/pt-BR/changelogs/4.txt new file mode 100644 index 0000000..15470d1 --- /dev/null +++ b/metadata/pt-BR/changelogs/4.txt @@ -0,0 +1,8 @@ +Tradução parcial em chinês +Atualizão de dependências +Alterar a velocidade e a taxa de quadros do vídeo +Adicionar texto ao vídeo +Salvar projeto +Cortar +Cores invertidas +Procurar um quadro específico diff --git a/metadata/pt-BR/changelogs/5.txt b/metadata/pt-BR/changelogs/5.txt new file mode 100644 index 0000000..368fe8f --- /dev/null +++ b/metadata/pt-BR/changelogs/5.txt @@ -0,0 +1,12 @@ +Novas traduções: + - Chinês (Simplificado) + - Chinês (Tradicional) + - Francês +Novas características: + - Corte sem perdas + - Personalização da fonte do efeito de texto +Correções de bugs: + - Correção de falha ao tentar obter permissões persistentes + - Impedir o redimensionamento de vídeo no modo imersivo +Diversos: + - Atualização de dependências diff --git a/metadata/pt-BR/full_description.txt b/metadata/pt-BR/full_description.txt new file mode 100644 index 0000000..945ac7d --- /dev/null +++ b/metadata/pt-BR/full_description.txt @@ -0,0 +1 @@ +

Open Video Editor permite que você edite seus vídeos. Suporta HDR e permite aplicar filtros. Com este aplicativo você também pode cortar, dimensionar e girar seus vídeos ou até mesmo colocá-los em tons de cinza. Também é possível usar este aplicativo para extrair áudio de um vídeo, converter um vídeo HDR para SDR ou convertê-lo em um formato diferente.

diff --git a/metadata/pt-BR/short_description.txt b/metadata/pt-BR/short_description.txt new file mode 100644 index 0000000..263d534 --- /dev/null +++ b/metadata/pt-BR/short_description.txt @@ -0,0 +1 @@ +Editor de vídeo para Android, código aberto, feito com Media3 e Jetpack Compose. diff --git a/metadata/pt-BR/title.txt b/metadata/pt-BR/title.txt new file mode 100644 index 0000000..0bc6b86 --- /dev/null +++ b/metadata/pt-BR/title.txt @@ -0,0 +1 @@ +Open Video Editor diff --git a/metadata/pt/changelogs/1.txt b/metadata/pt/changelogs/1.txt new file mode 100644 index 0000000..51269e9 --- /dev/null +++ b/metadata/pt/changelogs/1.txt @@ -0,0 +1 @@ +Lançamento inicial diff --git a/metadata/pt/full_description.txt b/metadata/pt/full_description.txt new file mode 100644 index 0000000..945ac7d --- /dev/null +++ b/metadata/pt/full_description.txt @@ -0,0 +1 @@ +

Open Video Editor permite que você edite seus vídeos. Suporta HDR e permite aplicar filtros. Com este aplicativo você também pode cortar, dimensionar e girar seus vídeos ou até mesmo colocá-los em tons de cinza. Também é possível usar este aplicativo para extrair áudio de um vídeo, converter um vídeo HDR para SDR ou convertê-lo em um formato diferente.

diff --git a/metadata/pt/short_description.txt b/metadata/pt/short_description.txt new file mode 100644 index 0000000..263d534 --- /dev/null +++ b/metadata/pt/short_description.txt @@ -0,0 +1 @@ +Editor de vídeo para Android, código aberto, feito com Media3 e Jetpack Compose. diff --git a/metadata/pt/title.txt b/metadata/pt/title.txt new file mode 100644 index 0000000..0bc6b86 --- /dev/null +++ b/metadata/pt/title.txt @@ -0,0 +1 @@ +Open Video Editor diff --git a/metadata/zh-TW/full_description.txt b/metadata/zh-TW/full_description.txt new file mode 100644 index 0000000..01be289 --- /dev/null +++ b/metadata/zh-TW/full_description.txt @@ -0,0 +1 @@ +

Open Video Editor 讓您編輯您的影片。它支援 HDR 並且允許應用篩選器。使用此應用程式您還可以裁減、縮放與旋轉甚至灰階化您的影片。 您也可以使用此應用程式從影片中匯出音訊,轉換 HDR 影片至 SDR,或者轉換成另一種格式。

diff --git a/metadata/zh-TW/short_description.txt b/metadata/zh-TW/short_description.txt new file mode 100644 index 0000000..9315ed8 --- /dev/null +++ b/metadata/zh-TW/short_description.txt @@ -0,0 +1 @@ +開放原始碼 Android 影片編輯器,使用 Media3 與 Jetpack Compose 建置。 diff --git a/metadata/zh-TW/title.txt b/metadata/zh-TW/title.txt new file mode 100644 index 0000000..0bc6b86 --- /dev/null +++ b/metadata/zh-TW/title.txt @@ -0,0 +1 @@ +Open Video Editor