diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..bef563799 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +github: [tibbi] +patreon: tiborkaputa +custom: ["https://www.paypal.me/SimpleMobileTools", "https://www.simplemobiletools.com/donate"] diff --git a/CHANGELOG.md b/CHANGELOG.md index 1549a634b..e25283681 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,33 @@ Changelog ========== +Version 6.10.7 *(2019-12-12)* +---------------------------- + + * Refreshed the thumbnails list views by removing the dividers + * Reordered some top menu items for consistency + * Added a Resize button to resize images directly from the fullscreen view + * Migrate album covers at export/import settings too + * Remember the last used path and file name at exporting settings + * Fixed a glitch with empty screen at direct subfolder grouping + * Many other stability, ux and translation improvements + +Version 6.10.6 *(2019-11-28)* +---------------------------- + + * Fixed some smaller glitches + * Added some stability and translation improvements + +Version 6.10.5 *(2019-11-10)* +---------------------------- + + * Remember the last used pattern at batch renaming + * Allow adding an incrementing number at pattern batch renaming + * Fixed some USB file related issues + * Fixed some fullscreen glitches at using split screen + * Allow using videos as custom folder covers + * Some stability and translation improvements + Version 6.10.4 *(2019-11-05)* ---------------------------- diff --git a/app/build.gradle b/app/build.gradle index e25c0421a..7fc2026cd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.simplemobiletools.gallery.pro" minSdkVersion 21 targetSdkVersion 28 - versionCode 271 - versionName "6.10.4" + versionCode 275 + versionName "6.10.7" multiDexEnabled true setProperty("archivesBaseName", "gallery") vectorDrawables.useSupportLibrary = true @@ -62,7 +62,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.19.2' + implementation 'com.simplemobiletools:commons:5.20.10' implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' implementation 'androidx.multidex:multidex:2.0.1' implementation 'it.sephiroth.android.exif:library:1.0.1' @@ -80,7 +80,7 @@ dependencies { kapt 'com.github.bumptech.glide:compiler:4.10.0' - kapt 'androidx.room:room-compiler:2.2.1' - implementation 'androidx.room:room-runtime:2.2.1' - annotationProcessor 'androidx.room:room-compiler:2.2.1' + kapt 'androidx.room:room-compiler:2.2.2' + implementation 'androidx.room:room-runtime:2.2.2' + annotationProcessor 'androidx.room:room-compiler:2.2.2' } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt index d96a77c50..8d3532271 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/EditActivity.kt @@ -145,7 +145,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener return } - uri = intent.data + uri = intent.data!! if (uri.scheme != "file" && uri.scheme != "content") { toast(R.string.unknown_file_location) finish() @@ -153,9 +153,9 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } if (intent.extras?.containsKey(REAL_FILE_PATH) == true) { - val realPath = intent.extras.getString(REAL_FILE_PATH) + val realPath = intent.extras!!.getString(REAL_FILE_PATH) uri = when { - isPathOnOTG(realPath) -> uri + isPathOnOTG(realPath!!) -> uri realPath.startsWith("file:/") -> Uri.parse(realPath) else -> Uri.fromFile(File(realPath)) } @@ -305,7 +305,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener try { if (isNougatPlus()) { inputStream = contentResolver.openInputStream(uri) - oldExif = ExifInterface(inputStream) + oldExif = ExifInterface(inputStream!!) } } catch (e: Exception) { } finally { @@ -317,7 +317,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } else if (editor_draw_canvas.isVisible()) { val bitmap = editor_draw_canvas.getBitmap() if (saveUri.scheme == "file") { - SaveAsDialog(this, saveUri.path, true) { + SaveAsDialog(this, saveUri.path!!, true) { saveBitmapToFile(bitmap, it, true) } } else if (saveUri.scheme == "content") { @@ -643,7 +643,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } private fun applyFilter(filterItem: FilterItem) { - val newBitmap = Bitmap.createBitmap(filterInitialBitmap) + val newBitmap = Bitmap.createBitmap(filterInitialBitmap!!) default_image_view.setImageBitmap(filterItem.filter.processFilter(newBitmap)) } @@ -748,7 +748,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener if (isCropIntent) { if (saveUri.scheme == "file") { - saveBitmapToFile(bitmap, saveUri.path, true) + saveBitmapToFile(bitmap, saveUri.path!!, true) } else { var inputStream: InputStream? = null var outputStream: OutputStream? = null @@ -757,7 +757,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener bitmap.compress(CompressFormat.JPEG, 100, stream) inputStream = ByteArrayInputStream(stream.toByteArray()) outputStream = contentResolver.openOutputStream(saveUri) - inputStream.copyTo(outputStream) + inputStream.copyTo(outputStream!!) } finally { inputStream?.close() outputStream?.close() @@ -771,7 +771,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener finish() } } else if (saveUri.scheme == "file") { - SaveAsDialog(this, saveUri.path, true) { + SaveAsDialog(this, saveUri.path!!, true) { saveBitmapToFile(bitmap, it, true) } } else if (saveUri.scheme == "content") { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt index df273bec1..ad9dce178 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MainActivity.kt @@ -13,6 +13,7 @@ import android.view.Menu import android.view.MenuItem import android.view.ViewGroup import android.widget.FrameLayout +import android.widget.RelativeLayout import android.widget.Toast import androidx.appcompat.widget.SearchView import androidx.core.view.MenuItemCompat @@ -605,6 +606,11 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private fun setupGridLayoutManager() { val layoutManager = directories_grid.layoutManager as MyGridLayoutManager + (directories_grid.layoutParams as RelativeLayout.LayoutParams).apply { + topMargin = 0 + bottomMargin = 0 + } + if (config.scrollHorizontally) { layoutManager.orientation = RecyclerView.HORIZONTAL directories_refresh_layout.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT) @@ -670,6 +676,13 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { layoutManager.spanCount = 1 layoutManager.orientation = RecyclerView.VERTICAL directories_refresh_layout.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + + val smallMargin = resources.getDimension(R.dimen.small_margin).toInt() + (directories_grid.layoutParams as RelativeLayout.LayoutParams).apply { + topMargin = smallMargin + bottomMargin = smallMargin + } + mZoomListener = null } @@ -723,10 +736,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private fun isGetContentIntent(intent: Intent) = intent.action == Intent.ACTION_GET_CONTENT && intent.type != null private fun isGetImageContentIntent(intent: Intent) = isGetContentIntent(intent) && - (intent.type.startsWith("image/") || intent.type == MediaStore.Images.Media.CONTENT_TYPE) + (intent.type!!.startsWith("image/") || intent.type == MediaStore.Images.Media.CONTENT_TYPE) private fun isGetVideoContentIntent(intent: Intent) = isGetContentIntent(intent) && - (intent.type.startsWith("video/") || intent.type == MediaStore.Video.Media.CONTENT_TYPE) + (intent.type!!.startsWith("video/") || intent.type == MediaStore.Video.Media.CONTENT_TYPE) private fun isGetAnyContentIntent(intent: Intent) = isGetContentIntent(intent) && intent.type == "*/*" @@ -773,14 +786,14 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } private fun fillExtraOutput(resultData: Intent): Uri? { - val file = File(resultData.data.path) + val file = File(resultData.data!!.path!!) var inputStream: InputStream? = null var outputStream: OutputStream? = null try { - val output = intent.extras.get(MediaStore.EXTRA_OUTPUT) as Uri + val output = intent.extras!!.get(MediaStore.EXTRA_OUTPUT) as Uri inputStream = FileInputStream(file) outputStream = contentResolver.openOutputStream(output) - inputStream.copyTo(outputStream) + inputStream.copyTo(outputStream!!) } catch (e: SecurityException) { showErrorToast(e) } catch (ignored: FileNotFoundException) { @@ -794,8 +807,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } private fun fillPickedPaths(resultData: Intent, resultIntent: Intent) { - val paths = resultData.extras.getStringArrayList(PICKED_PATHS) - val uris = paths.map { getFilePublicUri(File(it), BuildConfig.APPLICATION_ID) } as ArrayList + val paths = resultData.extras!!.getStringArrayList(PICKED_PATHS) + val uris = paths!!.map { getFilePublicUri(File(it), BuildConfig.APPLICATION_ID) } as ArrayList val clipData = ClipData("Attachment", arrayOf("image/*", "video/*"), ClipData.Item(uris.removeAt(0))) uris.forEach { @@ -808,8 +821,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private fun fillIntentPath(resultData: Intent, resultIntent: Intent) { val data = resultData.data - val path = if (data.toString().startsWith("/")) data.toString() else data.path - val uri = getFilePublicUri(File(path), BuildConfig.APPLICATION_ID) + val path = if (data.toString().startsWith("/")) data.toString() else data!!.path + val uri = getFilePublicUri(File(path!!), BuildConfig.APPLICATION_ID) val type = path.getMimeType() resultIntent.setDataAndTypeAndNormalize(uri, type) resultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) @@ -854,6 +867,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } val dirs = getSortedDirectories(newDirs) + if (config.groupDirectSubfolders) { + mDirs = dirs.clone() as ArrayList + } + var isPlaceholderVisible = dirs.isEmpty() runOnUiThread { @@ -1114,7 +1131,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } else if (it.path != config.tempFolderPath) { val children = if (isPathOnOTG(it.path)) getOTGFolderChildrenNames(it.path) else File(it.path).list()?.asList() val hasMediaFile = children?.any { - it?.isMediaFile() == true || (File(it).isDirectory && it?.startsWith("img_", true) == true) + it?.isMediaFile() == true || (File(it!!).isDirectory && it.startsWith("img_", true)) } ?: false if (!hasMediaFile) { @@ -1144,7 +1161,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { dirs.removeAll(invalidDirs) setupAdapter(dirs) invalidDirs.forEach { - toast("invalid ${it.path}", Toast.LENGTH_LONG) try { mDirectoryDao.deleteDirPath(it.path) } catch (ignored: Exception) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt index dc44ff967..6aa7d5fcd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/MediaActivity.kt @@ -13,6 +13,7 @@ import android.view.Menu import android.view.MenuItem import android.view.ViewGroup import android.widget.FrameLayout +import android.widget.RelativeLayout import androidx.appcompat.widget.SearchView import androidx.core.view.MenuItemCompat import androidx.recyclerview.widget.GridLayoutManager @@ -680,6 +681,11 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { private fun setupGridLayoutManager() { val layoutManager = media_grid.layoutManager as MyGridLayoutManager + (media_grid.layoutParams as RelativeLayout.LayoutParams).apply { + topMargin = 0 + bottomMargin = 0 + } + if (config.scrollHorizontally) { layoutManager.orientation = RecyclerView.HORIZONTAL media_refresh_layout.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT) @@ -775,6 +781,13 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { layoutManager.spanCount = 1 layoutManager.orientation = RecyclerView.VERTICAL media_refresh_layout.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + + val smallMargin = resources.getDimension(R.dimen.small_margin).toInt() + (media_grid.layoutParams as RelativeLayout.LayoutParams).apply { + topMargin = smallMargin + bottomMargin = smallMargin + } + mZoomListener = null } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt index 409dbdd35..9ea20f4a9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PhotoVideoActivity.kt @@ -71,6 +71,12 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList } private fun checkIntent(savedInstanceState: Bundle? = null) { + if (intent.data == null && intent.action == Intent.ACTION_VIEW) { + startActivity(Intent(this, MainActivity::class.java)) + finish() + return + } + mUri = intent.data ?: return val uri = mUri.toString() if (uri.startsWith("content:/") && uri.contains("/storage/")) { @@ -114,10 +120,10 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList if (mUri!!.scheme == "file") { if (filename.contains('.')) { bottom_actions.beGone() - handleLockedFolderOpening(mUri!!.path.getParentPath()) { success -> + handleLockedFolderOpening(mUri!!.path!!.getParentPath()) { success -> if (success) { - rescanPaths(arrayListOf(mUri!!.path)) - sendViewPagerIntent(mUri!!.path) + rescanPaths(arrayListOf(mUri!!.path!!)) + sendViewPagerIntent(mUri!!.path!!) } finish() } @@ -130,7 +136,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList bottom_actions.beGone() handleLockedFolderOpening(path.getParentPath()) { success -> if (success) { - rescanPaths(arrayListOf(mUri!!.path)) + rescanPaths(arrayListOf(mUri!!.path!!)) sendViewPagerIntent(path) } finish() @@ -154,7 +160,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList } mIsVideo = type == TYPE_VIDEOS - mMedium = Medium(null, filename, mUri.toString(), mUri!!.path.getParentPath(), 0, 0, file.length(), type, 0, false, 0L) + mMedium = Medium(null, filename, mUri.toString(), mUri!!.path!!.getParentPath(), 0, 0, file.length(), type, 0, false, 0L) supportActionBar?.title = mMedium!!.name bundle.putSerializable(MEDIUM, mMedium) @@ -272,7 +278,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList } private fun showProperties() { - PropertiesDialog(this, mUri!!.path) + PropertiesDialog(this, mUri!!.path!!) } private fun isFileTypeVisible(path: String): Boolean { @@ -301,7 +307,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList private fun initBottomActionButtons() { arrayListOf(bottom_favorite, bottom_delete, bottom_rotate, bottom_properties, bottom_change_orientation, bottom_slideshow, bottom_show_on_map, - bottom_toggle_file_visibility, bottom_rename, bottom_copy, bottom_move).forEach { + bottom_toggle_file_visibility, bottom_rename, bottom_copy, bottom_move, bottom_resize).forEach { it.beGone() } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SetWallpaperActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SetWallpaperActivity.kt index 56d5d01cd..a6941c2b4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SetWallpaperActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SetWallpaperActivity.kt @@ -63,7 +63,7 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete } private fun handleImage(intent: Intent) { - uri = intent.data + uri = intent.data!! if (uri.scheme != "file" && uri.scheme != "content") { toast(R.string.unknown_file_location) finish() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt index c9c296874..6cb5ac89d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/SettingsActivity.kt @@ -4,6 +4,8 @@ import android.content.Intent import android.os.Bundle import android.text.TextUtils import android.view.Menu +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.simplemobiletools.commons.dialogs.* import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* @@ -16,6 +18,7 @@ import com.simplemobiletools.gallery.pro.extensions.emptyTheRecycleBin import com.simplemobiletools.gallery.pro.extensions.galleryDB import com.simplemobiletools.gallery.pro.extensions.showRecycleBinEmptyingDialog import com.simplemobiletools.gallery.pro.helpers.* +import com.simplemobiletools.gallery.pro.models.AlbumCover import kotlinx.android.synthetic.main.activity_settings.* import java.io.File import java.util.* @@ -690,9 +693,10 @@ class SettingsActivity : SimpleActivity() { put(LAST_EDITOR_BRUSH_SIZE, config.lastEditorBrushSize) put(LAST_CONFLICT_RESOLUTION, config.lastConflictResolution) put(LAST_CONFLICT_APPLY_TO_ALL, config.lastConflictApplyToAll) + put(ALBUM_COVERS, config.albumCovers) } - exportSettings(configItems, "gallery-settings.txt") + exportSettings(configItems) } } @@ -812,6 +816,18 @@ class SettingsActivity : SimpleActivity() { LAST_EDITOR_BRUSH_SIZE -> config.lastEditorBrushSize = value.toInt() LAST_CONFLICT_RESOLUTION -> config.lastConflictResolution = value.toInt() LAST_CONFLICT_APPLY_TO_ALL -> config.lastConflictApplyToAll = value.toBoolean() + ALBUM_COVERS -> { + val existingCovers = config.parseAlbumCovers() + val existingCoverPaths = existingCovers.map { it.path }.toMutableList() as ArrayList + + val listType = object : TypeToken>() {}.type + val covers = Gson().fromJson>(value.toString(), listType) ?: ArrayList(1) + covers.filter { !existingCoverPaths.contains(it.path) && getDoesFilePathExist(it.tmb) }.forEach { + existingCovers.add(it) + } + + config.albumCovers = Gson().toJson(existingCovers) + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt index f0eec2073..7f30b2096 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/ViewPagerActivity.kt @@ -3,6 +3,7 @@ package com.simplemobiletools.gallery.pro.activities import android.animation.Animator import android.animation.ValueAnimator import android.annotation.SuppressLint +import android.annotation.TargetApi import android.app.Activity import android.content.Intent import android.content.pm.ActivityInfo @@ -16,6 +17,7 @@ import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Icon import android.media.ExifInterface import android.net.Uri +import android.os.Build import android.os.Bundle import android.os.Handler import android.provider.MediaStore @@ -45,6 +47,7 @@ import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.adapters.MyPagerAdapter import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask import com.simplemobiletools.gallery.pro.dialogs.DeleteWithRememberDialog +import com.simplemobiletools.gallery.pro.dialogs.ResizeWithPathDialog import com.simplemobiletools.gallery.pro.dialogs.SaveAsDialog import com.simplemobiletools.gallery.pro.dialogs.SlideshowDialog import com.simplemobiletools.gallery.pro.extensions.* @@ -57,6 +60,7 @@ import com.simplemobiletools.gallery.pro.models.ThumbnailItem import kotlinx.android.synthetic.main.activity_medium.* import kotlinx.android.synthetic.main.bottom_actions.* import java.io.File +import java.io.OutputStream import java.util.* class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, ViewPagerFragment.FragmentListener { @@ -173,6 +177,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View findItem(R.id.menu_move_to).isVisible = visibleBottomActions and BOTTOM_ACTION_MOVE == 0 findItem(R.id.menu_save_as).isVisible = rotationDegrees != 0 findItem(R.id.menu_print).isVisible = currentMedium.isImage() || currentMedium.isRaw() + findItem(R.id.menu_resize).isVisible = visibleBottomActions and BOTTOM_ACTION_RESIZE == 0 && currentMedium.isImage() findItem(R.id.menu_hide).isVisible = !currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 && !currentMedium.getIsInRecycleBin() findItem(R.id.menu_unhide).isVisible = currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 && !currentMedium.getIsInRecycleBin() findItem(R.id.menu_add_to_favorites).isVisible = !currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 && !currentMedium.getIsInRecycleBin() @@ -227,12 +232,30 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View R.id.menu_default_orientation -> toggleOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) R.id.menu_save_as -> saveImageAs() R.id.menu_create_shortcut -> createShortcut() + R.id.menu_resize -> resizeImage() R.id.menu_settings -> launchSettings() else -> return super.onOptionsItemSelected(item) } return true } + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + if (requestCode == REQUEST_EDIT_IMAGE && resultCode == Activity.RESULT_OK && resultData != null) { + mPos = -1 + mPrevHashcode = 0 + refreshViewPager() + } else if (requestCode == REQUEST_SET_AS && resultCode == Activity.RESULT_OK) { + toast(R.string.wallpaper_set_successfully) + } else if (requestCode == REQUEST_VIEW_VIDEO && resultCode == Activity.RESULT_OK && resultData != null) { + if (resultData.getBooleanExtra(GO_TO_NEXT_ITEM, false)) { + goToNextItem() + } else if (resultData.getBooleanExtra(GO_TO_PREV_ITEM, false)) { + goToPrevItem() + } + } + super.onActivityResult(requestCode, resultCode, resultData) + } + private fun initViewPager() { val uri = intent.data if (uri != null) { @@ -258,7 +281,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } if (intent.extras?.containsKey(REAL_FILE_PATH) == true) { - mPath = intent.extras.getString(REAL_FILE_PATH) + mPath = intent.extras!!.getString(REAL_FILE_PATH)!! } if (mPath.isEmpty()) { @@ -666,9 +689,14 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View val path = medium.path val drawable = resources.getDrawable(R.drawable.shortcut_image).mutate() getShortcutImage(path, drawable) { - val intent = Intent(this, PhotoVideoActivity::class.java) - intent.action = Intent.ACTION_VIEW - intent.data = Uri.fromFile(File(path)) + val intent = Intent(this, ViewPagerActivity::class.java).apply { + putExtra(PATH, path) + putExtra(SHOW_ALL, config.showAll) + putExtra(SHOW_FAVORITES, path == FAVORITES) + putExtra(SHOW_RECYCLE_BIN, path == RECYCLE_BIN) + action = Intent.ACTION_VIEW + flags = flags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } val shortcut = ShortcutInfo.Builder(this, path) .setShortLabel(medium.name) @@ -804,6 +832,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View bottom_move.setOnClickListener { moveFileTo() } + + bottom_resize.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_RESIZE != 0 && currentMedium?.isImage() == true) + bottom_resize.setOnClickListener { + resizeImage() + } } private fun updateBottomActionIcons(medium: Medium?) { @@ -894,21 +927,62 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } } - override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { - if (requestCode == REQUEST_EDIT_IMAGE && resultCode == Activity.RESULT_OK && resultData != null) { - mPos = -1 - mPrevHashcode = 0 - refreshViewPager() - } else if (requestCode == REQUEST_SET_AS && resultCode == Activity.RESULT_OK) { - toast(R.string.wallpaper_set_successfully) - } else if (requestCode == REQUEST_VIEW_VIDEO && resultCode == Activity.RESULT_OK && resultData != null) { - if (resultData.getBooleanExtra(GO_TO_NEXT_ITEM, false)) { - goToNextItem() - } else if (resultData.getBooleanExtra(GO_TO_PREV_ITEM, false)) { - goToPrevItem() + @TargetApi(Build.VERSION_CODES.N) + private fun resizeImage() { + val oldPath = getCurrentPath() + val originalSize = oldPath.getImageResolution() ?: return + ResizeWithPathDialog(this, originalSize, oldPath) { newSize, newPath -> + ensureBackgroundThread { + try { + var oldExif: ExifInterface? = null + if (isNougatPlus()) { + val inputStream = contentResolver.openInputStream(Uri.fromFile(File(oldPath))) + oldExif = ExifInterface(inputStream!!) + } + + val newBitmap = Glide.with(applicationContext).asBitmap().load(oldPath).submit(newSize.x, newSize.y).get() + + val newFile = File(newPath) + val newFileDirItem = FileDirItem(newPath, newPath.getFilenameFromPath()) + getFileOutputStream(newFileDirItem, true) { + if (it != null) { + saveBitmap(newFile, newBitmap, it, oldExif, File(oldPath).lastModified()) + } else { + toast(R.string.image_editing_failed) + } + } + } catch (e: OutOfMemoryError) { + toast(R.string.out_of_memory_error) + } catch (e: Exception) { + showErrorToast(e) + } } } - super.onActivityResult(requestCode, resultCode, resultData) + } + + @TargetApi(Build.VERSION_CODES.N) + private fun saveBitmap(file: File, bitmap: Bitmap, out: OutputStream, oldExif: ExifInterface?, lastModified: Long) { + try { + bitmap.compress(file.absolutePath.getCompressionFormat(), 90, out) + + if (isNougatPlus()) { + val newExif = ExifInterface(file.absolutePath) + oldExif?.copyTo(newExif, false) + } + } catch (e: Exception) { + } + + toast(R.string.file_saved) + val paths = arrayListOf(file.absolutePath) + rescanPaths(paths) { + fixDateTaken(paths, false) + + if (config.keepLastModified) { + File(file.absolutePath).setLastModified(lastModified) + updateLastModified(file.absolutePath, lastModified) + } + } + out.close() } private fun checkDeleteConfirmation() { @@ -1096,9 +1170,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View override fun fragmentClicked() { mIsFullScreen = !mIsFullScreen checkSystemUI() - if (isChromebook()) { - fullscreenToggled() - } + fullscreenToggled() } override fun videoEnded(): Boolean { @@ -1163,7 +1235,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View if (bottom_actions.isVisible()) { bottom_actions.animate().alpha(newAlpha).start() arrayOf(bottom_favorite, bottom_edit, bottom_share, bottom_delete, bottom_rotate, bottom_properties, bottom_change_orientation, - bottom_slideshow, bottom_show_on_map, bottom_toggle_file_visibility, bottom_rename).forEach { + bottom_slideshow, bottom_show_on_map, bottom_toggle_file_visibility, bottom_rename, bottom_set_as, bottom_copy, bottom_move, + bottom_resize).forEach { it.isClickable = !mIsFullScreen } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt index 87c97c00b..4e3d29de4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/adapters/DirectoryAdapter.kt @@ -137,6 +137,10 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList rotateSelection(180) R.id.cab_copy_to -> copyMoveTo(true) R.id.cab_move_to -> moveFilesTo() + R.id.cab_create_shortcut -> createShortcut() R.id.cab_select_all -> selectAll() R.id.cab_open_with -> openPath() R.id.cab_fix_date_taken -> fixDateTaken() @@ -165,6 +171,10 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList Unit) { + init { + var realPath = path.getParentPath() + val view = activity.layoutInflater.inflate(R.layout.dialog_resize_image_with_path, null).apply { + image_path.text = "${activity.humanizePath(realPath).trimEnd('/')}/" + + val fullName = path.getFilenameFromPath() + val dotAt = fullName.lastIndexOf(".") + var name = fullName + + if (dotAt > 0) { + name = fullName.substring(0, dotAt) + val extension = fullName.substring(dotAt + 1) + image_extension.setText(extension) + } + + image_name.setText(name) + image_path.setOnClickListener { + FilePickerDialog(activity, realPath, false, activity.config.shouldShowHidden, true, true) { + image_path.text = activity.humanizePath(it) + realPath = it + } + } + } + + val widthView = view.image_width + val heightView = view.image_height + + widthView.setText(size.x.toString()) + heightView.setText(size.y.toString()) + + val ratio = size.x / size.y.toFloat() + + widthView.onTextChangeListener { + if (widthView.hasFocus()) { + var width = getViewValue(widthView) + if (width > size.x) { + widthView.setText(size.x.toString()) + width = size.x + } + + heightView.setText((width / ratio).toInt().toString()) + } + } + + heightView.onTextChangeListener { + if (heightView.hasFocus()) { + var height = getViewValue(heightView) + if (height > size.y) { + heightView.setText(size.y.toString()) + height = size.y + } + + widthView.setText((height * ratio).toInt().toString()) + } + } + + AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this) { + showKeyboard(view.image_width) + getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + val width = getViewValue(widthView) + val height = getViewValue(heightView) + if (width <= 0 || height <= 0) { + activity.toast(R.string.invalid_values) + return@setOnClickListener + } + + val newSize = Point(getViewValue(widthView), getViewValue(heightView)) + + val filename = view.image_name.value + val extension = view.image_extension.value + if (filename.isEmpty()) { + activity.toast(R.string.filename_cannot_be_empty) + return@setOnClickListener + } + + if (extension.isEmpty()) { + activity.toast(R.string.extension_cannot_be_empty) + return@setOnClickListener + } + + val newFilename = "$filename.$extension" + val newPath = "${realPath.trimEnd('/')}/$newFilename" + if (!newFilename.isAValidFilename()) { + activity.toast(R.string.filename_invalid_characters) + return@setOnClickListener + } + + if (activity.getDoesFilePathExist(newPath)) { + val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newFilename) + ConfirmationDialog(activity, title) { + callback(newSize, newPath) + dismiss() + } + } else { + callback(newSize, newPath) + dismiss() + } + } + } + } + } + + private fun getViewValue(view: EditText): Int { + val textValue = view.value + return if (textValue.isEmpty()) 0 else textValue.toInt() + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt index 438487891..8d9885c7a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Activity.kt @@ -237,12 +237,12 @@ fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList, mediumDao try { val destination = "$recycleBinPath/$source" val fileDocument = getSomeDocumentFile(source) - inputStream = applicationContext.contentResolver.openInputStream(fileDocument?.uri) + inputStream = applicationContext.contentResolver.openInputStream(fileDocument?.uri!!) out = getFileOutputStreamSync(destination, source.getMimeType()) var copiedSize = 0L val buffer = ByteArray(DEFAULT_BUFFER_SIZE) - var bytes = inputStream.read(buffer) + var bytes = inputStream!!.read(buffer) while (bytes >= 0) { out!!.write(buffer, 0, bytes) copiedSize += bytes @@ -612,7 +612,7 @@ fun Activity.getShortcutImage(tmb: String, drawable: Drawable, callback: () -> U fun Activity.showFileOnMap(path: String) { val exif = try { if (path.startsWith("content://") && isNougatPlus()) { - ExifInterface(contentResolver.openInputStream(Uri.parse(path))) + ExifInterface(contentResolver.openInputStream(Uri.parse(path))!!) } else { ExifInterface(path) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt index be514de6c..552b47339 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/extensions/Context.kt @@ -251,7 +251,7 @@ fun Context.getDirectParentSubfolders(dirs: ArrayList, currentPathPre // /storage/emulated/0/Pictures/Screenshots, // but /storage/emulated/0/Pictures is empty, still Pictures with the first folders thumbnails and proper other info val parent = File(path).parent - if (!folders.contains(parent) && dirs.none { it.path == parent }) { + if (parent != null && !folders.contains(parent) && dirs.none { it.path == parent }) { currentPaths.add(parent) val isSortingAscending = config.sorting and SORT_DESCENDING == 0 val subDirs = dirs.filter { File(it.path).parent.equals(File(path).parent, true) } as ArrayList @@ -595,7 +595,7 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: it.name = if (it.path.doesThisOrParentHaveNoMedia() && !it.path.isThisOrParentIncluded(includedPaths)) { "${it.name.removeSuffix(hiddenString).trim()} $hiddenString" } else { - it.name + it.name.removeSuffix(hiddenString).trim() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt index 60d85a7aa..456680c0b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/PhotoFragment.kt @@ -771,7 +771,7 @@ class PhotoFragment : ViewPagerFragment() { this.mIsFullscreen = isFullscreen mView.apply { photo_details.apply { - if (mStoredShowExtendedDetails && isVisible()) { + if (mStoredShowExtendedDetails && isVisible() && context != null && resources != null) { animate().y(getExtendedDetailsY(height)) if (mStoredHideExtendedDetails) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt index e3bd29731..d120839ae 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt @@ -460,7 +460,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mTimeHolder.animate().alpha(newAlpha).start() mView.video_details.apply { - if (mStoredShowExtendedDetails && isVisible()) { + if (mStoredShowExtendedDetails && isVisible() && context != null && resources != null) { animate().y(getExtendedDetailsY(height)) if (mStoredHideExtendedDetails) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt index fd350941c..3c95c9927 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/ViewPagerFragment.kt @@ -81,7 +81,7 @@ abstract class ViewPagerFragment : Fragment() { return details.toString().trim() } - fun getPathToLoad(medium: Medium) = if (context!!.isPathOnOTG(medium.path)) medium.path.getOTGPublicPath(context!!) else medium.path + fun getPathToLoad(medium: Medium) = if (context?.isPathOnOTG(medium.path) == true) medium.path.getOTGPublicPath(context!!) else medium.path private fun getFileLastModified(file: File): String { val projection = arrayOf(MediaStore.Images.Media.DATE_MODIFIED) @@ -102,7 +102,12 @@ abstract class ViewPagerFragment : Fragment() { private fun getLatLonAltitude(path: String): String { var result = "" - val exif = ExifInterface(path) + val exif = try { + ExifInterface(path) + } catch (e: Exception) { + return "" + } + val latLon = FloatArray(2) if (exif.getLatLong(latLon)) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt index 4b083aad3..6d126dbce 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Config.kt @@ -94,7 +94,7 @@ class Config(context: Context) : BaseConfig(context) { set(isThirdPartyIntent) = prefs.edit().putBoolean(IS_THIRD_PARTY_INTENT, isThirdPartyIntent).apply() var pinnedFolders: Set - get() = prefs.getStringSet(PINNED_FOLDERS, HashSet()) + get() = prefs.getStringSet(PINNED_FOLDERS, HashSet())!! set(pinnedFolders) = prefs.edit().putStringSet(PINNED_FOLDERS, pinnedFolders).apply() var showAll: Boolean @@ -133,7 +133,7 @@ class Config(context: Context) : BaseConfig(context) { } var excludedFolders: MutableSet - get() = prefs.getStringSet(EXCLUDED_FOLDERS, HashSet()) + get() = prefs.getStringSet(EXCLUDED_FOLDERS, HashSet())!! set(excludedFolders) = prefs.edit().remove(EXCLUDED_FOLDERS).putStringSet(EXCLUDED_FOLDERS, excludedFolders).apply() fun addIncludedFolder(path: String) { @@ -155,7 +155,7 @@ class Config(context: Context) : BaseConfig(context) { } var includedFolders: MutableSet - get() = prefs.getStringSet(INCLUDED_FOLDERS, HashSet()) + get() = prefs.getStringSet(INCLUDED_FOLDERS, HashSet())!! set(includedFolders) = prefs.edit().remove(INCLUDED_FOLDERS).putStringSet(INCLUDED_FOLDERS, includedFolders).apply() var autoplayVideos: Boolean @@ -263,7 +263,7 @@ class Config(context: Context) : BaseConfig(context) { else R.integer.media_columns_vertical_scroll) var albumCovers: String - get() = prefs.getString(ALBUM_COVERS, "") + get() = prefs.getString(ALBUM_COVERS, "")!! set(albumCovers) = prefs.edit().putString(ALBUM_COVERS, albumCovers).apply() fun parseAlbumCovers(): ArrayList { @@ -320,7 +320,7 @@ class Config(context: Context) : BaseConfig(context) { set(loopSlideshow) = prefs.edit().putBoolean(SLIDESHOW_LOOP, loopSlideshow).apply() var tempFolderPath: String - get() = prefs.getString(TEMP_FOLDER_PATH, "") + get() = prefs.getString(TEMP_FOLDER_PATH, "")!! set(tempFolderPath) = prefs.edit().putString(TEMP_FOLDER_PATH, tempFolderPath).apply() var viewTypeFolders: Int @@ -348,7 +348,7 @@ class Config(context: Context) : BaseConfig(context) { set(wasNewAppShown) = prefs.edit().putBoolean(WAS_NEW_APP_SHOWN, wasNewAppShown).apply() var lastFilepickerPath: String - get() = prefs.getString(LAST_FILEPICKER_PATH, "") + get() = prefs.getString(LAST_FILEPICKER_PATH, "")!! set(lastFilepickerPath) = prefs.edit().putString(LAST_FILEPICKER_PATH, lastFilepickerPath).apply() var tempSkipDeleteConfirmation: Boolean @@ -412,7 +412,7 @@ class Config(context: Context) : BaseConfig(context) { // if a user hides a folder, then enables temporary hidden folder displaying, make sure we show it properly var everShownFolders: Set - get() = prefs.getStringSet(EVER_SHOWN_FOLDERS, getEverShownFolders()) + get() = prefs.getStringSet(EVER_SHOWN_FOLDERS, getEverShownFolders())!! set(everShownFolders) = prefs.edit().putStringSet(EVER_SHOWN_FOLDERS, everShownFolders).apply() private fun getEverShownFolders() = hashSetOf( diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt index 0697dfe0c..5e2ab2d33 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/Constants.kt @@ -195,6 +195,7 @@ const val BOTTOM_ACTION_RENAME = 1024 const val BOTTOM_ACTION_SET_AS = 2048 const val BOTTOM_ACTION_COPY = 4096 const val BOTTOM_ACTION_MOVE = 8192 +const val BOTTOM_ACTION_RESIZE = 16384 const val DEFAULT_BOTTOM_ACTIONS = BOTTOM_ACTION_TOGGLE_FAVORITE or BOTTOM_ACTION_EDIT or BOTTOM_ACTION_SHARE or BOTTOM_ACTION_DELETE diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt index a17eabeea..965771e9c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/helpers/MediaFetcher.kt @@ -61,7 +61,7 @@ class MediaFetcher(val context: Context) { val selection = "${getSelectionQuery(filterMedia)} ${MediaStore.Images.ImageColumns.BUCKET_ID} IS NOT NULL) GROUP BY (${MediaStore.Images.ImageColumns.BUCKET_ID}" val selectionArgs = getSelectionArgsQuery(filterMedia).toTypedArray() val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) - folders.addAll(parseCursor(cursor)) + folders.addAll(parseCursor(cursor!!)) val config = context.config val shouldShowHidden = config.shouldShowHidden diff --git a/app/src/main/res/layout/bottom_actions.xml b/app/src/main/res/layout/bottom_actions.xml index 88906f599..e03791630 100644 --- a/app/src/main/res/layout/bottom_actions.xml +++ b/app/src/main/res/layout/bottom_actions.xml @@ -213,10 +213,25 @@ android:padding="@dimen/medium_margin" android:src="@drawable/ic_move" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@+id/bottom_resize" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/bottom_copy" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.0"/> + + diff --git a/app/src/main/res/layout/dialog_manage_bottom_actions.xml b/app/src/main/res/layout/dialog_manage_bottom_actions.xml index fb76d7666..2ddeb0afc 100644 --- a/app/src/main/res/layout/dialog_manage_bottom_actions.xml +++ b/app/src/main/res/layout/dialog_manage_bottom_actions.xml @@ -126,5 +126,13 @@ android:paddingBottom="@dimen/activity_margin" android:text="@string/move"/> + + diff --git a/app/src/main/res/layout/dialog_resize_image_with_path.xml b/app/src/main/res/layout/dialog_resize_image_with_path.xml new file mode 100644 index 000000000..c1defcff2 --- /dev/null +++ b/app/src/main/res/layout/dialog_resize_image_with_path.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/directory_item_list.xml b/app/src/main/res/layout/directory_item_list.xml index 97937ee4e..20be472f9 100644 --- a/app/src/main/res/layout/directory_item_list.xml +++ b/app/src/main/res/layout/directory_item_list.xml @@ -4,10 +4,12 @@ android:id="@+id/dir_holder" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:background="?attr/selectableItemBackground" android:clickable="true" android:focusable="true" - android:paddingStart="@dimen/small_margin" - android:paddingTop="@dimen/small_margin"> + android:paddingStart="@dimen/medium_margin" + android:paddingTop="@dimen/small_margin" + android:paddingBottom="@dimen/small_margin"> @@ -64,7 +67,8 @@ android:alpha="0.4" android:ellipsize="end" android:maxLines="1" - android:paddingStart="6dp" + android:paddingStart="@dimen/medium_margin" + android:paddingEnd="@dimen/medium_margin" android:textColor="@android:color/white" android:textSize="@dimen/smaller_text_size"/> @@ -84,7 +88,7 @@ android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentBottom="true" - android:layout_marginEnd="@dimen/small_margin" + android:layout_marginEnd="@dimen/medium_margin" android:gravity="end" android:orientation="horizontal" android:paddingBottom="@dimen/tiny_margin"> @@ -106,15 +110,6 @@ android:paddingBottom="@dimen/small_margin" android:src="@drawable/ic_pin" android:visibility="gone"/> + - - - diff --git a/app/src/main/res/layout/photo_video_item_list.xml b/app/src/main/res/layout/photo_video_item_list.xml index d2e8e7def..bda74102d 100644 --- a/app/src/main/res/layout/photo_video_item_list.xml +++ b/app/src/main/res/layout/photo_video_item_list.xml @@ -5,10 +5,12 @@ android:id="@+id/media_item_holder" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:background="?attr/selectableItemBackground" android:clickable="true" android:focusable="true" - android:paddingStart="@dimen/small_margin" - android:paddingTop="@dimen/small_margin"> + android:paddingStart="@dimen/medium_margin" + android:paddingTop="@dimen/small_margin" + android:paddingBottom="@dimen/small_margin"> @@ -38,7 +41,7 @@ android:ellipsize="end" android:gravity="center_vertical" android:maxLines="3" - android:paddingStart="6dp" + android:paddingStart="@dimen/medium_margin" android:paddingEnd="@dimen/normal_margin" android:textColor="@android:color/white" android:textSize="@dimen/bigger_text_size" @@ -62,7 +65,7 @@ android:layout_alignParentEnd="true" android:layout_alignParentBottom="true" android:layout_marginEnd="@dimen/small_margin" - android:paddingBottom="6dp" + android:paddingBottom="@dimen/medium_margin" android:paddingEnd="@dimen/small_margin" android:fontFamily="sans-serif-medium" android:shadowColor="@color/default_background_color" @@ -77,7 +80,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" - android:layout_marginBottom="6dp" + android:layout_marginBottom="@dimen/medium_margin" android:layout_toStartOf="@+id/play_outline" android:paddingLeft="@dimen/small_margin" android:paddingRight="@dimen/small_margin" @@ -86,13 +89,4 @@ android:textSize="@dimen/normal_text_size" tools:text="00:05"/> - - diff --git a/app/src/main/res/menu/cab_directories.xml b/app/src/main/res/menu/cab_directories.xml index 7cd39f6b1..8c27750fc 100644 --- a/app/src/main/res/menu/cab_directories.xml +++ b/app/src/main/res/menu/cab_directories.xml @@ -36,6 +36,18 @@ android:icon="@drawable/ic_unhide_vector" android:title="@string/unhide_folder" app:showAsAction="ifRoom"/> + + + - - - + android:id="@+id/cab_select_all" + android:icon="@drawable/ic_select_all_vector" + android:title="@string/select_all" + app:showAsAction="ifRoom"/> diff --git a/app/src/main/res/menu/cab_media.xml b/app/src/main/res/menu/cab_media.xml index 0d0bb7b5b..cb8dda1e9 100644 --- a/app/src/main/res/menu/cab_media.xml +++ b/app/src/main/res/menu/cab_media.xml @@ -53,16 +53,31 @@ android:icon="@drawable/ic_unhide_vector" android:title="@string/unhide" app:showAsAction="ifRoom"/> + + + + + - - - - + android:id="@+id/cab_select_all" + android:icon="@drawable/ic_select_all_vector" + android:title="@string/select_all" + app:showAsAction="ifRoom"/> diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index e4aea1047..f8b02c0de 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -26,10 +26,6 @@ android:id="@+id/change_view_type" android:title="@string/change_view_type" app:showAsAction="never"/> - + + + + - - - + + + + + + + + + + - - - - - - - - - - + - الاستوديو البسيط - الاستوديو + الاستديو البسيط + الاستديو تعديل فتح الكاميرا - (مخفية) - (excluded) + (مخفي) + (مستبعد) تثبيت المجلد - ازالة تثبيت الملف - Pin to the top - عرض كل محتوى المجلدات - كل المجلدات + إلغاء تثبيت المجلد + تثبيت في الأعلى + إظهار كل محتويات المجلدات + كل المحلات التبديل إلى عرض المجلد مجلد آخر - عرض على الخريطة + عرض علي الخريطة موقع غير معروف - زيادة عدد الأعمدة + ذيادة عدد الأعمدة تقليل عدد الأعمدة تغيير صورة الغلاف - اختر الصور - استخدم الافتراضي + تحديد صورة + إستخدام كإفتراضي الصوت - السطوع - غلق الاتجاه + السبوع + قفل الاتجاه فتح الاتجاه - Change orientation - Force portrait - Force landscape - Use default orientation - Fix Date Taken value - Fixing… - Dates fixed successfully - Share a resized version - Hey,\n\nseems like you upgraded from the old free app. You can now uninstall the old version, which has an \'Upgrade to Pro\' button at the top of the app settings.\n\nYou will only have the Recycle bin items deleted, favorite items unmarked and you will also have to reset your app settings.\n\nThanks! - Switch to file search across all visible folders + تغيير الاتجاه + فرض الإتجاه العمودي + فرض الإتجاه الأفقي + إستخدام الإتجاه الافتراضي + إصلاح تاريخ إلتقاط القيمة + جارٍ الإصلاح… + تم إصلاح التواريخ بنجاح + مشاركة الصورة الذي تم تغيير حجمها + مرحباً,\n\nيبدو أنك قمت بترقية التطبيق المجاني القديم. يمكنك الآن إلغاء تثبيت الإصدار القديم، الذي يحتوي على زر \'الترقية إلى Pro\' في أعلي إعدادات التطبيق.\n\nسيتم حذف عناصر سلة المحذوفات فقط، كما سيتم حذف العناصر المفضلة، كما سيتعين عليك إعادة ضبط إعدادات التطبيق .\n\nشكراً! + التبديل إلي البحث فى الملفات عبر كافة المجلدات المرئية - فلتر الميديا + فلترة الوسائط الصور - الفديوهات - الصور المتحركة - RAW images - SVGs - Portraits - لم يتم العثور على ملفات وسائط مع الفلاتر المحددة - تغيير الفلاتر + الفيديوهات + الصور المتحركة (GIF) + صور الخام (RAW) + صور الرسومات المتجهة (SVG) + صور البورتريه + لم يتم العثور على ملفات وسائط مع الفلاتر المحددة. + تغيير الفلاتر - هذه الميزة تخفي المجلد عن طريق إضافة ملف \'.nomedia\' بداخله، فإنه سيتم إخفاء كافة المجلدات الفرعية أيضا. يمكنك رؤيتها عن طريق تبديل الخيار \"إظهار العناصر المخفية\" في الإعدادات. استمر؟ - استبعد + تقوم هذه الوظيفة باخفاء المجلد عن طريق إضافة ملف \'. nomedia \' إليه ، وستقوم باخفاء كل المجلدات الفرعية أيضًا. يمكنك رؤيتهم عن طريق تبديل خيار \'إظهار العناصر المخفية \' في الإعدادات. هل تريد المتابعة؟ + إستبعاد المجلدات المستبعدة - ادارة المجلدات المستبعدة - سيؤدي هذا إلى استبعاد التحديد مع مجلداته الفرعية من الاستوديو فقط. يمكنك إدارة المجلدات المستبعدة في الإعدادات - هل تريد استبعاد أحد الوالدين بدلا من ذلك؟ - باستثناء المجلدات سيجعلها جنبا إلى جنب مع المجلدات الفرعية مخبأة فقط في الاستوديو ، فإنها لا تزال مرئية في تطبيقات أخرى.\n - \n - إذا كنت تريد إخفاءها من تطبيقات أخرى أيضا، استخدم ميزة الإخفاء - حذف الكل - هل تريد إزالة جميع المجلدات من القائمة المستبعدة؟ لن يؤدي هذا إلى حذف المجلدات + إدارة المجلدات المستبعدة + سيؤدي ذلك الي إستبعاد التحديد مع المجلدات الفرعية من "الاستديو" فقط.. يمكنك إدارة المجلدات المستبعدة في الإعدادات. + إستبعاد المجلد الأصل بدلاً من ذلك(المحدد)؟ + سيؤدي إستبعاد المجلدات الي جعلها مع المجلدات الفرعية مخفية في "الاستديو" فقط, وستظل مرئية في تطبيقات أخرى. \n\nإذا كنت تريد إخفاءها من التطبيقات الأخرى أيضاً ، فاستخدم وظيفة الإخفاء. + إزالة الكل + هل تريد إزالة كافة المجلدات من قائمة المجلدات المستبعدة ؟ لن يؤدي هذا إلي حذف المجلدات. المجلدات المخفية إدارة المجلدات المخفية - يبدو أنك لا تملك أي مجلد مخفي بملف \".nomedia\". + يبدو أنه لا توجد لديك أي مجلدات مخفية بملف \".nomedia\". المجلدات المضمنة إدارة المجلدات المضمنة - اضافة مجلد - إذا كان لديك بعض المجلدات التي تحتوي على الملتيميديا ، ولكن لم يتم التعرف عليها من قبل التطبيق، يمكنك إضافتها يدويا هنا.\n \n لن تؤدي إضافة بعض العناصر هنا إلى استبعاد أي مجلد آخر. - No media files have been found. You can solve it by adding the folders containing media files manually. + إضافة مجلد + إذا كان لديك بعض المجلدات التي تحتوي على الوسائط ، ولكن لم يتم التعرف عليها من قبل التطبيق، يمكنك إضافتها يدوياً هنا.\n\nلن تؤدي إضافة بعض العناصر هنا إلى إستبعاد أي مجلد آخر. + لم يتم العثور علي أي ملفات وسائط.يمكنك حلها عن طريق إضافة المجلدات التي تحتوي على ملفات وسائط يدوياً. - تحجيم - تغيير حجم التحديد وحفظ + تغيير الحجم + تغيير حجم التحديد والحفظ العرض - الارتفاع - إبقاء نسبة القياس - الرجاء إدخال درجة دقة صحيحة + الإرتفاع + الحفاظ على نسبة الأبعاد + يرجى إدخال دقة صالحة تعديل حفظ - التدوير + تدوير المسار - مسار صورة غير صحيح + مسار الصورة غير صحيح فشل تعديل الصورة + File edited successfully تعديل الصورة باستخدام: لم يتم العثور على أي محرر للصور - موقع ملف غير معروف - تعذر الكتابة فوق الملف المصدر + موقع الملف غير معروف + لا يمكن إستبدال الملف الأصل تدوير لليسار تدوير لليمين - تدوير 180º - قلب - قلب أفقيا - قلب عموديا - Free - Other + تدوير بزاوية 180º + انعكاس + انعكاس أفقياً + انعكاس عمودياً + حر + أخري خلفية بسيطة - تعيين كخلفية الشاشة - فشل الإعداد كخلفية - تعيين كخلفية بواسطة: - … جار تعيين الخلفية ... - تم تعيبن الخلفية بنجاح - صورة نسبة العرض إلى الارتفاع - نسبة العرض إلى الارتفاع في المناظر الطبيعية + تعيين كخلفية + فشل التعيين كخلفية + تعيين كخلفية باستخدام: + جارٍ تعيين الخلفية… + تم تعيين الخلفية بنجاح + نسبة الأبعاد العمودية + نسبة الأبعاد الأفقية الشاشة الرئيسية شاشة القفل - الرئيسية وشاشة القفل + الشاشة الرئيسية وشاشة القفل عرض الشرائح الفاصل الزمني (بالثواني): تضمين الصور - تضمين الفديو - تضمين GIF + تضمين مقاطع الفيديو + تضمين الصور المتحركة (Gif) ترتيب عشوائي - ارجع للخلف + تحريك للخلف حلقة عرض الشرائح - Animation - None - Fade - Slide - انتهى عرض الشرائح - لم يتم العثور على وسائط لعرض الشرائح + الحركة + لا شيء + تلاشى + انزلاق + أنتهى عرض الشرائح + لم يتم العثور علي أي وسائط لعرض الشرائح - تغيير طريقة العرض + تغيير نوع العرض الشبكة القائمة - Group direct subfolders + تجميع المجلدات الفرعية مباشرة - Group by - Do not group files - Folder - Last modified - Last modified (daily) - Last modified (monthly) - Date taken - Date taken (daily) - Date taken (monthly) - File type - Extension - Please note that grouping and sorting are 2 independent fields + تجميع حسب + عدم تجميع الملفات + المجلد + آخر تعديل + آخر تعديل (يومياً) + آخر تعديل (شهرياً) + تاريخ الإلتقاط + تاريخ الإلتقاط (يومياً) + آخر تعديل (شهرياً) + نوع الملف + الإمتداد + يرجى ملاحظة أن التجميع والفرز هما حقلان مستقلان - Folder shown on the widget: - Show folder name + المجلد الظاهر فى الويدجت: + إظهار اسم المجلد - تشغيل الفديوهات تلقائيا - Remember last video playback position - تبديل رؤية اسم الملف - حلقة الفيديو - عرض صور GIF المتحركة في الصور المصغرة - أقصى سطوع عند عرض الوسائط - قص الصور المصغرة الى مستطيلات - Show video durations - تدوير وسائط ملء الشاشة بواسطة - اعدادات النظام + تشغيل مقاطع الفيديو تلقائياً + تذكر آخر موضع لتشغيل الفيديو + تبديل رؤية إسم الملف + حلقة مقاطع الفيديو + تحريك الصور المتحركة (Gif) في الصور المصغرة + أقصى سطوع عند عرض وسائط ملء الشاشة + إقتصاص الصور المصغرة إلى مربعات + إظهار مدة الفيديوهات + تدوير وسائط ملء الشاشة باستخدام + إعدادات النظام تدوير الجهاز - الابعاد - اجعل الخلفية وشريط الحالة باللون الاسود عند عرض المحتوى في كامل الشاشة - قم بتمرير الصور المصغرة أفقيا - إخفاء واجهة النظام تلقائيا عند العرض في وضع ملء الشاشة - احذف المجلدات الفارغة بعد حذف محتواها - السماح بالتحكم في سطوع الصورة باستخدام الإيماءات الرأسية - السماح بالتحكم في صوت الفيديو والسطوع بالإيماءات العمودية - إظهار عدد لوسائط المجلد على طريقة العرض الرئيسية - عرض تفاصيل موسعة على وسائط ملء الشاشة - إدارة المجلدات المستبعدة + نسبة الأبعاد + جعل الخلفية باللون الأسود في وسائط ملء الشاشة + تمرير الصور المصغرة أفقياً + إخفاء واجهة مستخدم النظام تلقائياً في وضع ملء الشاشة + حذف المجلدات الفارغة بعد حذف محتواها + السماح بالتحكم في سطوع الصور باستخدام الإيماءات العمودية + السماح بالتحكم في مستوي صوت الفيديو والسطوع باستخدام الإيماءات العمودية + إظهار عدد وسائط المجلد في العرض الرئيسي + إظهار التفاصيل الموسعة عبر وسائط ملء الشاشة + إدارة التفاصيل الموسعة السماح بتكبير الوسائط بأصبع واحد في وضع ملء الشاشة - السماح بتغيير الوسائط على الفور من خلال النقر على جوانب الشاشة - Allow deep zooming images + السماح بتغيير الوسائط علي الفور من خلال النقر علي جوانب الشاشة + السماح بالتكبير العميق للصور إخفاء التفاصيل الموسعة عند إخفاء شريط الحالة - Show some action buttons at the bottom of the screen - Show the Recycle Bin at the folders screen - Deep zoomable images - Show images in the highest possible quality - Show the Recycle Bin as the last item on the main screen - Allow closing the fullscreen view with a down gesture - Allow 1:1 zooming in with two double taps - Always open videos on a separate screen with new horizontal gestures - Show a notch if available - Allow rotating images with gestures - File loading priority - Speed - Compromise - Avoid showing invalid files - Show image file types + إظهار بعض أزرار الإجراءات في أسفل الشاشة + إظهار "سلة المحذوفات" في شاشة المجلدات + الصور القابلة للتكبير العميق + عرض الصور بأعلى جودة ممكنة + إظهار "سلة المحذوفات" كعنصر آخر علي الشاشة الرئيسية + السماح بإغلاق عرض ملء الشاشة باستخدام إيماءه لأسفل + السماح بالتكبير 1:1 باستخدام النقر مزدوجاّ + فتح مقاطع الفيديو دائماً علي شاشة منفصلة مع إيماءات أفقية جديدة + عرض النوتش إذا كان متوفر + السماح بتدوير الصور باستخدام الإيماءات + أولوية تحميل الملفات + بسرعة + إختيار وسط + تجنب إظهار الملفات غير الصالحة + إظهار أنواع ملفات الصور - المصغرات + الصور المصغرة وسائط ملء الشاشة - تفاصيل موسعة - Bottom actions + التفاصيل الموسعة + إجراءات الأزرار السفلية - Manage visible bottom actions - Toggle favorite - Toggle file visibility + إدارة إجراءات الأزرار المرئية + تبديل المفضل + تبديل رؤية الملف - كيف يمكنني جعل الاستوديو البسيط معرض الأجهزة الافتراضي؟ - أولاً ، عليك العثور على المعرض الافتراضي حاليًا في قسم التطبيقات في إعدادات جهازك ، ابحث عن زر يقول مثلا \"فتح افتراضيًا\" ، وانقر عليه ، ثم حدد \"مسح الإعدادات الافتراضية\". في المرة التالية التي ستحاول فيها فتح صورة أو فيديو ، يجب أن تذهب الى منتقي التطبيقات ، حيث يمكنك اختيار تطبيق الاستوديو البسيط وجعله التطبيق الافتراضي. - أغلقت التطبيق بكلمة مرور ، لكني نسيت ذلك. ماذا افعل؟ - يمكنك حلها بطريقتين. يمكنك إما إعادة تثبيت التطبيق ، أو العثور على التطبيق في إعدادات جهازك وتحديد \"مسح البيانات\". سيقوم بإعادة ضبط جميع إعداداتك ، ولن يزيل أي ملفات وسائط. - كيف يمكنني جعل الألبوم يظهر دائمًا في الجزء العلوي؟ - يمكنك الضغط لفترة طويلة على الألبوم المطلوب وتحديد أيقونة الدبوس في الإجراء ، والتي سوف تثبيته إلى الأعلى. يمكنك تثبيت عدة مجلدات أيضًا ، وسيتم ترتيب العناصر المثبتة حسب طريقة الفرز الافتراضية. - كيف يمكنني تقديم مقاطع فيديو بسرعة؟ - You can either drag your finger horizontally over the video player, or click on the current or max duration texts near the seekbar. That will move the video either backward, or forward. - ما الفرق بين إخفاء واستبعاد مجلد؟ - يمنع الاستبعاد من عرض المجلد في الاستوديو البسيط فقط ، بينما يقوم بإخفاء بالعمل على مستوى النظام ككل ويقوم بإخفاء المجلد من المعارض الأخرى أيضًا. وهو يعمل عن طريق إنشاء ملف \".nomedia\" فارغ في المجلد المحدد ، والذي يمكنك بعد ذلك إزالته مع أي مدير ملفات أيضًا. - لماذا تظهر المجلدات التي تحتوي على ملصقات أو ملصقات موسيقى تغطيها؟ - يمكن أن يحدث ذلك سترى بعض ألبومات غير عادية تظهر. يمكنك استبعادها بسهولة عن طريق الضغط عليها وتحديد \"استبعاد\". في مربع الحوار التالي ، يمكنك بعد ذلك تحديد المجلد الأصلي ، ومن المحتمل أن يؤدي ذلك إلى منع ظهور الألبومات الأخرى ذات الصلة أيضًا. - لا يظهر مجلد به صور ، فماذا أفعل؟ - يمكن أن يكون ذلك لأسباب متعددة ، ولكن حلها أمر سهل. أذهب إلى الإعدادات -> إدارة المجلدات المضمنة ، اضغط علامة الزائد وانتقل إلى المجلد المطلوب. - ماذا لو كنت أرغب في رؤية بعض المجلدات الخاصة؟ - لا يؤدي إضافة مجلد في \"المجلدات المضمنة\" إلى استبعاد أي شيء تلقائيًا. ما يمكنك فعله هو الذهاب إلى الإعدادات -> إدارة المجلدات المستبعدة ، واستبعاد المجلد الجذر \"/\" ، ثم إضافة المجلدات المطلوبة في الإعدادات -> إدارة المجلدات المضمنة. سيؤدي ذلك إلى إظهار المجلدات المحددة فقط ، حيث أن الاستبعاد والتضمين يكونان متكررين ، وإذا تم استبعاد أحد المجلدات وإدراجه ، فسيظهر. - هل يمكنني قص الصور باستخدام هذا التطبيق؟ - نعم ، يمكنك اقتصاص الصور في المحرر ، عن طريق سحب زوايا الصورة. يمكنك الوصول إلى المحرر إما عن طريق الضغط لفترة طويلة على صورة مصغرة وتحديد تحرير ، أو تحديد تحرير من العرض بملء الشاشة. - Can I somehow group media file thumbnails? - Sure, just use the \"Group by\" menu item while at the thumbnails view. You can group files by multiple criteria, including Date Taken. If you use the \"Show all folders content\" function you can group them by folders too. - Sorting by Date Taken doesn\'t seem to work properly, how can I fix it? - It is most likely caused by the files being copied from somewhere. You can fix it by selecting the file thumbnails and selecting \"Fix Date Taken value\". - I see some color banding on the images. How can I improve the quality? - The current solution for displaying images works fine in the vast majority of cases, but if you want even better image quality, you can enable the \"Show images in the highest possible quality\" at the app settings, in the \"Deep zoomable images\" section. - I have hidden a file/folder. How can I unhide it? - You can either press the \"Temporarily show hidden items\" menu item at the main screen, or toggle \"Show hidden items\" in the app settings to see the hidden item. If you want to unhide it, just long press it and select \"Unhide\". Folders are hidden by adding a hidden \".nomedia\" file into them, you can delete the file with any file manager too. - Why does the app take up so much space? - App cache can take up to 250MB, it ensures quicker image loading. If the app is taking up even more space, it is most likely caused by you having items in the Recycle Bin. Those files count to the app size. You can clear the Recycle bin by opening it and deleting all files, or from the app settings. Every file in the Bin is deleted automatically after 30 days. + كيف يمكنني جعل تطبيق الاستديو معرض الجهاز الإفتراضي ؟ + أولا، يجب عليك العثور على المعرض الإفتراضي الحالي في قسم "التطبيقات" من إعدادات الجهاز، أبحث عن زر يقول شيئاً مثل \"فتح كافتراضي/"، ثم أنقر عليه، ثم حدد \"مسح الإعدادات الإفتراضية\". في المرة القادمة التي ستحاول فيها فتح صورة أو مقطع فيديو يجب أن تري إختيار تطبيق، حيث يمكنك تحديد تطبيق "الاستديو" وجعله التطبيق الإفتراضي. + لقد أغلقت التطبيق بكلمة مرور، لكنني نسيت ذلك. ماذا يمكنني أن أفعل؟ + يمكنك حلها بطريقتين. يمكنك أما إعادة تثبيت التطبيق أو أبحث عن التطبيق في اعدادات جهازك وحدد \"مسح البيانات\". سيتم إعادة تعيين كل إعداداتك، ولن يقوم بإزالة أي ملفات وسائط. + كيف يمكنني جعل ألبوماً يظهر دائماً في الأعلى ؟ + يمكنك الضغط مطولاً علي الألبوم المطلوب وحدد أيقونة "التثبيت" في قائمة الإجراءات، التي ستقوم بتثبيته في الأعلي. يمكنك تثبيت مجلدات متعددة أيضا، سيتم فرز العناصر المثبتة حسب طريقة الفرز الإفتراضية. + كيف يمكنني تسريع مقاطع الفيديو؟ + يمكنك إما سحب إصبعك أفقياً على مشغل الفيديو، أو النقر على نصوص المدة الحالية أو أقصي مدة النصوص بالقرب من شريط التحكم (seekbar) . هذا سوف يحرك الفيديو إما إلى الخلف، أو إلى الأمام. + ما هو الفرق بين إخفاء المجلد وإستبعاده ؟ + الإستبعاد يمنع عرض المجلد فقط في الاستديو، بينما الإخفاء يعمل على مستوى النظام ويخفي المجلد من المعارض الأخرى أيضاً. يعمل عن طريق إنشاء ملف فارغ \ ".nomedia \" في المجلد المحدد ، والذي يمكنك إزالته بعد ذلك بواسطة أي مدير ملفات أيضًا. + لماذا تظهر المجلدات مع صورة غلاف الموسيقى أو الملصقات؟ + قد يحدث أن ترى بعض الألبومات غير العادية تظهر. يمكنك بسهولة إستبعادهم بالضغط مطولاً عليهم وأختر إستبعاد. في مربع الحوار التالي يمكنك بعد ذلك تحديد المجلد الاصل، من المحتمل ان يمنع ظهور الألبومات الأخري ذات الصلة أيضاً. + المجلد الذي به صور لا يظهر، أو لا يظهر كل العناصر. ماذا يمكنني أن أفعل؟ + قد يكون لهذا عدة أسباب، ولكن حل هذه المشكلة أمر سهل. فقط أذهب إلى الإعدادات -> إدارة المجلدات المضمنة، وأختر علامة زائد (+) وأنتقل إلى المجلد المطلوب. + ماذا أفعل لو كنت أريد بعض المجلدات المحددة مرئية فقط؟ + إضافة مجلد إلى المجلدات المضمنة لا يستبعد تلقائياً أي شيء. ما يمكنك القيام به هو الإنتقال إلى الإعدادات -> إدارة المجلدات المستبعدة، إستبعاد المجلد الأصل \"/\"، ثم إضافة المجلدات المطلوبة في الإعدادات -> إدارة المجلدات المضمنة. سيؤدي ذلك إلى جعل المجلدات المحددة مرئية فقط، حيث أن كل من الاستبعاد والتضمين منعكسين وإذا كان أحد المجلدات مستبعداً ومضمن معاً، فسوف يظهر. + هل يمكنني إقتصاص الصور باستخدام هذا التطبيق؟ + نعم ، يمكنك إقتصاص الصور في المحرر ، عن طريق سحب زوايا الصورة. يمكنك الوصول إلى المحرر إما بالضغط مطولاً على الصورة المصغرة وأختر تعديل ، أو أختر تعديل من عرض ملء الشاشة. + هل يمكنني بطريقة ما تجميع الصور المصغرة لملف الوسائط؟ + بالتأكيد، فقط تستخدم عنصر القائمة \"تجميع حسب\" أثناء عرض الصور المصغرة.يمكنك تجميع الملفات حسب معايير متعددة، بما في ذلك تاريخ الإلتقاط. إذا كنت تستخدم وظيفة \"إظهار كل محتويات المجلدات\" فيمكنك تجميعها حسب المجلدات أيضا. + يبدو ان الفرز حسب تاريخ الإلتقاط لا يعمل بشكل صحيح، كيف يمكنني إصلاحه؟ + غالباً ما يكون ذلك بسبب الملفات التي يتم نسخها من مكان ما. يمكنك اصلاحه عن طريق تحديد الصور المصغرة للملف وأختر \"إصلاح تاريخ إلتقاط القيمة\". + أرى بعض التباين اللونى على الصور. كيف يمكنني تحسين الجودة؟ + الحل الحالي لعرض الصور يعمل بشكل جيد في الأغلبية العظمي للحالات، ولكن إذا كنت تريد تحسين جودة الصور، يمكنك تمكين خيار \"عرض الصور بأعلي جودة ممكنة\" من اعدادات التطبيق، من قسم \"الصور العميقة القابلة للتكبير\". + لقد قمت بإخفاء ملف/مجلد. كيف يمكنني إظهاره؟ + يمكنك أما أن تضغط علي عنصر القائمة "إظهار العناصر المخفية مؤقتاً" علي الشاشه الرئيسية أو تفعيل خيار \"إظهار العناصر المخفية" في إعدادات التطبيق لرؤية العنصر المخفي. إذا كنت تريد إظهاره ، فقط أضغط مطولاً عليه وأختر \" إظهار\". يتم إخفاء المجلدات عن طريق إضافة ملف مخفي ". nomedia/" إليهم، يمكنك حذف الملف بواسطة أي مدير ملفات أيضاً. + لماذا يشغل التطبيق مساحة كبيرة؟ + يمكن لذاكرة التخزين المؤقت للتطبيق أن تصل سعتها إلى 250 ميجابايت، ، مما يضمن سرعة تحميل الصور. إذا كان التطبيق يشغل مساحة أكبر ، فمن المحتمل أن يكون ذلك بسبب وجود عناصر في "سلة المحذوفات". يتم حساب هذه الملفات إلى حجم التطبيق. يمكنك مسح "سلة المحذوفات" عن طريق فتحها وحذف جميع الملفات ، أو من إعدادات التطبيق. يتم حذف كل ملف في "سلة المحذوفات" تلقائياً بعد 30 يوماً. - - Simple Gallery Pro - Photo Manager & Editor + + المعرض البسيط الـ Pro - محرر ومدير الصور - Browse your memories without any interruptions. + تصفح ذكرياتك دون اي انقطاع. - Simple Gallery Pro is a highly customizable offline gallery. Organize & edit your photos, recover deleted files with the recycle bin, protect & hide files and view a huge variety of different photo & video formats including RAW, SVG and much more. + (تطبيق المعرض البسيط الـ Pro) هو معرض بدون إنترنت قابل للتخصيص بدرجة كبيرة يتمتع بتنظيم الصور وتحريرها وإستعادة الملفات المحذوفة من خلال "سلة المحذوفات" وحماية الملفات وإخفاؤها وعرض مجموعة كبيرة من تنسيقات الصور والفيديو المختلفة بما في ذلك تنسيقات RAW و SVG وغير ذلك الكثير. - The app contains no ads and unnecessary permissions. As the app doesn’t require internet access either, your privacy is protected. + لا يحتوي التطبيق على إعلانات وأذونات غير ضرورية. نظراً لأن التطبيق لا يتطلب الوصول إلى الإنترنت أيضاً ، فإن خصوصيتك محمية. ------------------------------------------------- - SIMPLE GALLERY PRO – FEATURES + المعرض البسيط الـ Pro - الميزات ------------------------------------------------- - • Offline gallery with no ads or popups - • Simple gallery photo editor – crop, rotate, resize, draw, filters & more - • No internet access needed, giving you more privacy and security - • No unnecessary permissions required - • Quickly search images, videos & files - • Open & view many different photo and video types (RAW, SVG, panoramic etc) - • A variety of intuitive gestures to easily edit & organize files - • Lots of ways to filter, group & sort files - • Customize the appearance of Simple Gallery Pro - • Available in 32 languages - • Mark files as favorites for quick access - • Protect your photos & videos with a pattern, pin or fingerprint - • Use pin, pattern & fingerprint to protect the app launch or specific functions too - • Recover deleted photos & videos from the recycle bin - • Toggle visibility of files to hide photos & videos - • Create a customizable slideshow of your files - • View detailed information of your files (resolution, EXIF values etc) - • Simple Gallery Pro is open source - … and much much more! + معرض بدون إنترنت بدون إعلانات أو نوافذ منبثقة + • محرر صور (معرض البسيط) - قص، تدوير، تغيير حجم، رسم، فلاتر وغير ذلك + • لا حاجة للوصول إلى الإنترنت، مما يمنحك المزيد من الخصوصية والأمان - PHOTO GALLERY EDITOR - Simple Gallery Pro makes it easy to edit your pictures on the fly. Crop, flip, rotate and resize your pictures. If you’re feeling a little more creative you can add filters and draw on your pictures! + • لا توجد أذونات غير ضرورية مطلوبة + • البحث بسرعة عن الصور ومقاطع الفيديو والملفات + • فتح وعرض العديد من أنواع مختلفة من الصور والفيديو (RAW ، SVG ، بانورامية الخ) + • مجموعة متنوعة من الإيماءات البسيطة لتحرير الملفات وتنظيمها بسهولة + • الكثير من الطرق لفلترة الملفات وتجميعها وفرزها + • تخصيص مظهر للتطبيق + • متوفر بـ ٣٢ لغة + • وضع علامة علي الملفات كمفضلة للوصول السريع + • تمتع بحماية صورك ومقاطع الفيديو باستخدام نمط أو رمز PIN أو بصمة إصبع + • أستخدم رمز الـ PIN والنقش وبصمة الاصبع لحماية تشغيل التطبيق أو وظائف معينة أيضاً + • إستعادة الصور ومقاطع الفيديو المحذوفة من "سلة المحذوفات" + • تبديل رؤية الملفات لإخفاء الصور ومقاطع الفيديو + • إنشاء عرض شرائح قابل للتخصيص لملفاتك + • عرض معلومات تفصيلية لملفاتك (دقة الوضوح، قيم EXIF، إلخ) + • تطبيق المعرض هو مصدر مفتوح + … والكثير الكثير! + محرر معرض الصور + يساعد (تطبيق المعرض البسيط الـ Pro ) على تسهيل تحرير الصور بسرعة فائقة. قص الصور وقلبها وتدويرها وتغيير حجمها. إذا كنت تشعر بقدر أكبر من الإبداع، يمكنك إضافة الفلاتر والرسم على صورك! - SUPPORT FOR MANY FILE TYPES - Unlike some other gallery viewers & photo organizers, Simple Gallery Pro supports a huge range of different file types including JPEG, PNG, MP4, MKV, RAW, SVG, Panoramic photos, Panoramic videos and many more. - HIGHLY CUSTOMIZABLE GALLERY MANAGER - From the UI to the function buttons on the bottom toolbar, Simple Gallery Pro is highly customizable and works the way you want it to. No other gallery manager has this kind of flexibility! Thanks to being open source, we’re also available in 32 languages! + يدعم العديد من انواع الملفات + على عكس بعض تطبيقات معرض الصور الأخري ومنظمي الصور ، يدعم (تطبيق المعرض البسيط الـ Pro )مجموعة كبيرة من أنواع الملفات المختلفة بما في ذلك JPEG و PNG و MP4 و MKV و RAW و SVG والصور البانورامية ومقاطع الفيديو البانورامية وغيرها الكثير. - RECOVER DELETED PHOTOS & VIDEOS - Accidentally deleted a precious photo or video? Don’t worry! Simple Gallery Pro features a handy recycle bin where you can recover deleted photos & videos easily. + مدير معرض الصور القابل للتخصيص بدرجة كبيرة + بدءاً من واجهة المستخدم وحتى أزرار الوظائف الموجودة على شريط الأدوات السفلي، يتسم (تطبيق المعرض البسيط الـ Pro ) بأنه قابل للتخصيص بدرجة كبيرة ويعمل بالطريقة التي تريدها في الإستخدام. لا يوجد أي مدير معرض آخر يتمتع بهذا النوع من المرونة! بفضل كونه مفتوح المصدر ، نحن متاحون أيضاً بـ 32 لغة! - PROTECT & HIDE PHOTOS, VIDEOS & FILES - Using pin, pattern or your device’s fingerprint scanner you can protect and hide photos, videos & entire albums. You can protect the app itself or place locks on specific functions of the app. For example, you can’t delete a file without a fingerprint scan, helping to protect your files from accidental deletion. + إسترداد الصور ومقاطع الفيديو المحذوفة + حذف صورة أو فيديو ثمين عن طريق الخطأ لا تقلق نظراً لأن(تطبيق المعرض البسيط الـ Pro) يتميز بسلة محذوفات سهلة الاستخدام يمكنك من خلالها إسترداد الصور ومقاطع الفيديو المحذوفة بسهولة. - Check out the full suite of Simple Tools here: + حماية وإخفاء الصور والفيديوهات والملفات + باستخدام رمز الـ PIN أو النمط أو الماسح الضوئي لبصمة الاصبع لجهازك يمكنك حماية الصور ومقاطع الفيديو والألبومات بأكملها وإخفائها. يمكنك حماية التطبيق نفسه أو وضع قفل الأمان علي وظائف معينة للتطبيق علي سبيل المثال، لا يمكنك حذف ملف دون إجراء مسح ضوئي لبصمة الاصبع، مما يساعد علي حماية ملفاتك من الحذف غير المقصود. + + أطلع على المجموعة الكاملة من الأدوات البسيطة هنا: https://www.simplemobiletools.com - Facebook: + موقع مستقل لتطبيق المعرض البسيط الـ Pro : + https://www.simplemobiletools.com/gallery + + صفحة الفيسبوك: https://www.facebook.com/simplemobiletools - Reddit: + موقع رديت: https://www.reddit.com/r/SimpleMobileTools diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index ca3c433b6..b8c83ea2f 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -82,6 +82,7 @@ Path Invalid image path Image editing failed + File edited successfully Edit image with: No image editor found Unknown file location diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index da07babb8..c4dc0344b 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -82,6 +82,7 @@ Ruta Ruta de imatge no vàlida Ha fallat la edició de la imatge + File edited successfully Editar imatge utilitzant: No s’ha trobat cap editor d’imatges Ubicació de l’arxiu desconeguda diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 35b8641ab..baf7bc05d 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -82,6 +82,7 @@ Cesta Neplatná cesta Úprava souboru selhala + File edited successfully Upravit soubor pomocí: Nebyl nalezen žádný editor Neznámé umístění souboru diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index ef70131fa..724f21045 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -82,6 +82,7 @@ Sti Ugyldig sti til billede Redigering af billede mislykkedes + File edited successfully Rediger billede med: Der blev ikke fundet en editor til billedbehandling Ukendt filplacering diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6e4e85b2d..e8162dfb5 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -82,6 +82,7 @@ Pfad Ungültiger Dateipfad. Bildbearbeitung fehlgeschlagen. + File edited successfully Bild bearbeiten mit: Keine Bildeditor-App gefunden. Unbekannter Dateipfad. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index fc8071014..5ef9cecfa 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -82,6 +82,7 @@ Διαδρομή Μη έγκυρη διαδρομή εικόνας Η επεξεργασία εικόνας απέτυχε + File edited successfully Επεξεργασία εικόνας με: Δεν βρέθηκε επεργαστής εικόνων Άγνωστη τοποθεσία αρχείου diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 0ee6f14a4..bd4ec6c57 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -82,6 +82,7 @@ Ruta Ruta de imagen no válida Falló la edición de imagen + File edited successfully Editar imagen usando: No se encontró editor de imágenes Ubicación del archivo desconocida diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index f8144fe2d..e7577e94f 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -82,6 +82,7 @@ Polku Kuvan polkua ei ole Kuvan muokkaus epäonnistui + File edited successfully Muokkaa kuvaa: Kuvamuokkainta ei löytynyt Tuntematon tiedostosijainti diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index f9a4bdfbd..99a1b0387 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -82,6 +82,7 @@ Emplacement Emplacement invalide Échec de l\'édition de l\'image + File edited successfully Modifier l\'image avec : Aucun éditeur d\'image trouvé Emplacement du fichier inconnu @@ -151,11 +152,11 @@ Lecture automatique des vidéos Mémoriser la position de lecture des vidéos - Permuter la visibilité des noms de fichier + Permuter l\'affichage des noms de fichier Lecture en boucle des vidéos - Animer le GIFs dans les miniatures + Animer les miniatures des GIF Luminosité maximale - Recadrer les miniatures en carrés + Recadrer les miniatures en carré Afficher la durée des vidéos Orientation de l\'affichage Paramètres système @@ -199,7 +200,7 @@ Gérer la barre d\'actions Ajouter aux favoris - Changer la visibilité des fichiers + Visibilité du fichier Comment faire de Simple Gallery ma galerie par défaut ? diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 2a0fd706a..de6fa84a1 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -82,6 +82,7 @@ Ruta Ruta a imaxe non válida Fallo na edición da imaxe + File edited successfully Editar imaxe con: Non se atopou ningún editor Localización do ficheiro descoñecida diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 7f72b193b..372f978bb 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -82,6 +82,7 @@ Putanja Neispravna putanja slike Uređivanje slika nije uspjelo + File edited successfully Uredi sliku pomoću: Nije pronađen uređivač slika Nepoznata lokacija datoteke diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 05178e032..08d3d33e9 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -82,6 +82,7 @@ Elérési útvonal Érvénytelen kép elérési útvonal Sikertelen kép szerkesztés + File edited successfully Kép szerkesztés ezzel: Nem található kép szerkesztő Ismeretlen fájl hely diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index dbd959a21..2f13ee5a3 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -82,6 +82,7 @@ Jalur Jalur gambar tidak valid Gagal menyunting gambar + File edited successfully Sunting gambar dengan: Tidak ditemukan aplikasi penyunting gambar Lokasi berkas tidak diketahui @@ -237,7 +238,7 @@ Simple Gallery Pro - Pengelola & Penyunting Foto - Browse your memories without any interruptions. + Menampilkan semua kenangan anda tanpa gangguan. Simple Gallery Pro adalah aplikasi galeri luring yang sangat mudah diubahsuai. Mengelola & menyunting foto anda, memulihkan berkas yang terhapus dari keranjang sampah, melindungi & menyembunyikan berkas, dan menampilkan banyak format foto & video, diantaranya RAW, SVG dan masih banyak lainnya. diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index dbd959a21..2f13ee5a3 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -82,6 +82,7 @@ Jalur Jalur gambar tidak valid Gagal menyunting gambar + File edited successfully Sunting gambar dengan: Tidak ditemukan aplikasi penyunting gambar Lokasi berkas tidak diketahui @@ -237,7 +238,7 @@ Simple Gallery Pro - Pengelola & Penyunting Foto - Browse your memories without any interruptions. + Menampilkan semua kenangan anda tanpa gangguan. Simple Gallery Pro adalah aplikasi galeri luring yang sangat mudah diubahsuai. Mengelola & menyunting foto anda, memulihkan berkas yang terhapus dari keranjang sampah, melindungi & menyembunyikan berkas, dan menampilkan banyak format foto & video, diantaranya RAW, SVG dan masih banyak lainnya. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3d5f28c7c..a38aaa46a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -82,6 +82,7 @@ Percorso Percorso dell\'immagine non valido Modifica dell\'immagine fallita + File edited successfully Modifica immagine con: Editor delle immagini non trovato Posizione del file sconosciuta diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3873aea87..a65590f8f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -82,6 +82,7 @@ パス 無効な画像パス 画像の編集に失敗しました + File edited successfully 画像を編集: 画像エディターが見つかりません ファイルの場所が不明です diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 3a23e4d01..fa94511aa 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -82,6 +82,7 @@ 경로 유효하지 않은 사진 경로 사진 편집 실패 + File edited successfully 사진 편집 프로그램 연결: 사진 편집 프로그램 없음 알 수 없는 파일 위치 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index ad6e733c0..447ee9b0c 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -82,6 +82,7 @@ Kelias Netinkamas atvaizdo kelias Atvaizdo redagavimas nepavyko + File edited successfully Redaguoti atvaizdą su: Nerasta atvaizdų redagavimo programėlės Nežinoma bylos vieta diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 9e5ed7bd8..a50a62907 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -82,6 +82,7 @@ Bane Ugyldig bildebane Bilderedigering feilet + File edited successfully Rediger bilde med: Ingen bilderedigeringsapp funnet Ukjent filplassering diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index f0f276ae2..82c50ba89 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -82,6 +82,7 @@ Pad Ongeldig pad naar afbeelding Fout bij bewerken van afbeelding + File edited successfully Afbeelding bewerken met: Geen app gevonden voor fotobewerking Onbekende bestandslocatie diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 021f302c4..f3ee11f77 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -82,6 +82,7 @@ Ścieżka Nieprawidłowa ścieżka Edycja obrazu nie powiodła się + File edited successfully Edytuj obraz w: Nie znalazłem edytora zdjęć Nieznana lokalizacja pliku diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index e5bfe22e3..d3f2495fd 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -82,6 +82,7 @@ Caminho Caminho inválido Falha na edição da imagem + File edited successfully Editar imagem com: Editor não encontrado Localização desconhecida diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 3afb56f68..bcf4b5ef1 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -82,6 +82,7 @@ Caminho Caminho inválido Falha na edição da imagem + File edited successfully Editar imagem com: Editor não encontrado Localização desconhecida @@ -237,11 +238,11 @@ Simple Gallery Pro - Editor e gestor de fotos - Browse your memories without any interruptions. + Explore as suas memórias sem interrupções. Simple Gallery Pro é uma aplicação local para gerir fotos e vídeos. Pode organizar e editar as suas fotos, recuperar ficheiros através da reciclagem, proteger e ocultar ficheiros e ver imagens e vídeos disponíveis em vários formatos tais como RAW, SVG e muito mais. - A aplicação não tem anúncios nem pede permissões desnecessárias. Uma vez que também não precisa de aceder à Internet, os seus ficheiros estão protegidos. + A aplicação não tem anúncios nem permissões desnecessárias. Uma vez que também não precisa de aceder à Internet, os seus ficheiros estão protegidos. ------------------------------------------------- SIMPLE GALLERY PRO – FUNCIONALIDADES diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index adff0354b..4cd04cf6b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -82,6 +82,7 @@ Путь Недопустимый путь изображения Редактирование изображения не удалось + File edited successfully Редактировать изображение в: Ни одного редактора изображений не найдено Неизвестное местоположение файла diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 109d765f9..3c126a8bd 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -82,6 +82,7 @@ Cesta Neplatná cesta Úprava súboru zlyhala + Súbor bol úspešne upravený Upraviť súbor s: Nebol nájdený žiadny editor Neznáme umiestnenie súboru diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index ebfac19a5..659514b1b 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -82,6 +82,7 @@ Pot Napačna pot Urejanje slike ni uspelo + File edited successfully Uredi sliko z: Ne najdem urejevalnika slik Neznana lokacija datoteke diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index a2e82e684..0dda5fde3 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -82,6 +82,7 @@ Стаза Неисправна стаза слике Измена слике неуспешна + File edited successfully Измени слику са: Није пронађен едитор слика Непозната локација датотеке diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index be177d669..1e6f7a038 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -82,6 +82,7 @@ Sökväg Ogiltig bildsökväg Bilden kunde inte redigeras + File edited successfully Redigera bilden med: Ingen bildredigerare hittades Okänd filplats diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 4323a9f9f..e04f830c0 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -82,6 +82,7 @@ Yol Geçersiz resim yolu Resim düzenleme başarısız + File edited successfully Resmi şununla düzenle: Resim düzenleyici bulunamadı Bilinmeyen dosya konumu diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index ae6a73028..dfd954b03 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -82,6 +82,7 @@ Шлях Неприпустимий шлях до зображення Не вдалося редагувати зображення + File edited successfully Редагувати зображення за допомогою: Не знайдено редакторів зображень Невідоме розташування файлу diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 7f3c8c1c8..ea954d84d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -82,6 +82,7 @@ 路径 无效的图片路径 图片编辑失败 + File edited successfully 编辑方式: 没有找到图片编辑器 未知文件位置 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index d7ebe00e6..3a59c68ae 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -82,6 +82,7 @@ 路徑 無效的圖片路徑 圖片編輯失敗 + File edited successfully 編輯圖片: 找不到圖片編輯器 未知的檔案位置 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a015013e4..c2623c0dc 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -82,6 +82,7 @@ 路徑 無效的圖片路徑 圖片編輯失敗 + File edited successfully 編輯圖片: 找不到圖片編輯器 未知的檔案位置 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4eee33fa8..bd6354007 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -82,6 +82,7 @@ Path Invalid image path Image editing failed + File edited successfully Edit image with: No image editor found Unknown file location diff --git a/build.gradle b/build.gradle index d28a976a8..969a40070 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.3.61' repositories { google() @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' + classpath 'com.android.tools.build:gradle:3.5.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/fastlane/metadata/android/ar/full_description.txt b/fastlane/metadata/android/ar/full_description.txt new file mode 100644 index 000000000..1bbc1f5a9 --- /dev/null +++ b/fastlane/metadata/android/ar/full_description.txt @@ -0,0 +1,55 @@ + + +لا يحتوي التطبيق على إعلانات وأذونات غير ضرورية. نظراً لأن التطبيق لا يتطلب الوصول إلى الإنترنت أيضاً ، فإن خصوصيتك محمية. + +------------------------------------------------- +المعرض البسيط الـ Pro - الميزات +------------------------------------------------- + +معرض بدون إنترنت بدون إعلانات أو نوافذ منبثقة +• محرر صور (معرض البسيط) - قص، تدوير، تغيير حجم، رسم، فلاتر وغير ذلك +• لا حاجة للوصول إلى الإنترنت، مما يمنحك المزيد من الخصوصية والأمان + +• لا توجد أذونات غير ضرورية مطلوبة +• البحث بسرعة عن الصور ومقاطع الفيديو والملفات +• فتح وعرض العديد من أنواع مختلفة من الصور والفيديو (RAW ، SVG ، بانورامية الخ) +• مجموعة متنوعة من الإيماءات البسيطة لتحرير الملفات وتنظيمها بسهولة +• الكثير من الطرق لفلترة الملفات وتجميعها وفرزها +• تخصيص مظهر للتطبيق +• متوفر بـ ٣٢ لغة +• وضع علامة علي الملفات كمفضلة للوصول السريع +• تمتع بحماية صورك ومقاطع الفيديو باستخدام نمط أو رمز PIN أو بصمة إصبع +• أستخدم رمز الـ PIN والنقش وبصمة الاصبع لحماية تشغيل التطبيق أو وظائف معينة أيضاً +• إستعادة الصور ومقاطع الفيديو المحذوفة من "سلة المحذوفات" +• تبديل رؤية الملفات لإخفاء الصور ومقاطع الفيديو +• إنشاء عرض شرائح قابل للتخصيص لملفاتك +• عرض معلومات تفصيلية لملفاتك (دقة الوضوح، قيم EXIF، إلخ) +• تطبيق المعرض هو مصدر مفتوح +… والكثير الكثير! +محرر معرض الصور +يساعد (تطبيق المعرض البسيط الـ Pro ) على تسهيل تحرير الصور بسرعة فائقة. قص الصور وقلبها وتدويرها وتغيير حجمها. إذا كنت تشعر بقدر أكبر من الإبداع، يمكنك إضافة الفلاتر والرسم على صورك! + + +يدعم العديد من انواع الملفات +على عكس بعض تطبيقات معرض الصور الأخري ومنظمي الصور ، يدعم (تطبيق المعرض البسيط الـ Pro )مجموعة كبيرة من أنواع الملفات المختلفة بما في ذلك JPEG و PNG و MP4 و MKV و RAW و SVG والصور البانورامية ومقاطع الفيديو البانورامية وغيرها الكثير. + +مدير معرض الصور القابل للتخصيص بدرجة كبيرة +بدءاً من واجهة المستخدم وحتى أزرار الوظائف الموجودة على شريط الأدوات السفلي، يتسم (تطبيق المعرض البسيط الـ Pro ) بأنه قابل للتخصيص بدرجة كبيرة ويعمل بالطريقة التي تريدها في الإستخدام. لا يوجد أي مدير معرض آخر يتمتع بهذا النوع من المرونة! بفضل كونه مفتوح المصدر ، نحن متاحون أيضاً بـ 32 لغة! + +إسترداد الصور ومقاطع الفيديو المحذوفة +حذف صورة أو فيديو ثمين عن طريق الخطأ لا تقلق نظراً لأن(تطبيق المعرض البسيط الـ Pro) يتميز بسلة محذوفات سهلة الاستخدام يمكنك من خلالها إسترداد الصور ومقاطع الفيديو المحذوفة بسهولة. + +حماية وإخفاء الصور والفيديوهات والملفات +باستخدام رمز الـ PIN أو النمط أو الماسح الضوئي لبصمة الاصبع لجهازك يمكنك حماية الصور ومقاطع الفيديو والألبومات بأكملها وإخفائها. يمكنك حماية التطبيق نفسه أو وضع قفل الأمان علي وظائف معينة للتطبيق علي سبيل المثال، لا يمكنك حذف ملف دون إجراء مسح ضوئي لبصمة الاصبع، مما يساعد علي حماية ملفاتك من الحذف غير المقصود. + +أطلع على المجموعة الكاملة من الأدوات البسيطة هنا: +https://www.simplemobiletools.com + +موقع مستقل لتطبيق المعرض البسيط الـ Pro : +https://www.simplemobiletools.com/gallery + +الفيسبوك: +https://www.facebook.com/simplemobiletools + +موقع رديت: +https://www.reddit.com/r/SimpleMobileTools diff --git a/fastlane/metadata/android/ar/short_description.txt b/fastlane/metadata/android/ar/short_description.txt new file mode 100644 index 000000000..3081b0253 --- /dev/null +++ b/fastlane/metadata/android/ar/short_description.txt @@ -0,0 +1 @@ +تصفح ذكرياتك دون اي انقطاع. diff --git a/fastlane/metadata/android/ar/title.txt b/fastlane/metadata/android/ar/title.txt new file mode 100644 index 000000000..9143c5c30 --- /dev/null +++ b/fastlane/metadata/android/ar/title.txt @@ -0,0 +1 @@ +المعرض البسيط الـ Pro - محرر ومدير الصور diff --git a/fastlane/metadata/android/en-US/changelogs/272.txt b/fastlane/metadata/android/en-US/changelogs/272.txt new file mode 100644 index 000000000..c6217f294 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/272.txt @@ -0,0 +1,6 @@ + * Remember the last used pattern at batch renaming + * Allow adding an incrementing number at pattern batch renaming + * Fixed some USB file related issues + * Fixed some fullscreen glitches at using split screen + * Allow using videos as custom folder covers + * Some stability and translation improvements diff --git a/fastlane/metadata/android/en-US/changelogs/273.txt b/fastlane/metadata/android/en-US/changelogs/273.txt new file mode 100644 index 000000000..7f22492b0 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/273.txt @@ -0,0 +1,2 @@ + * Fixed some smaller glitches + * Added some stability and translation improvements diff --git a/fastlane/metadata/android/en-US/changelogs/275.txt b/fastlane/metadata/android/en-US/changelogs/275.txt new file mode 100644 index 000000000..cb8428b03 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/275.txt @@ -0,0 +1,7 @@ + * Refreshed the thumbnails list views by removing the dividers + * Reordered some top menu items for consistency + * Added a Resize button to resize images directly from the fullscreen view + * Migrate album covers at export/import settings too + * Remember the last used path and file name at exporting settings + * Fixed a glitch with empty screen at direct subfolder grouping + * Many other stability, ux and translation improvements diff --git a/fastlane/metadata/android/id/short_description.txt b/fastlane/metadata/android/id/short_description.txt index 64f9a3446..cb3fd9ef3 100644 --- a/fastlane/metadata/android/id/short_description.txt +++ b/fastlane/metadata/android/id/short_description.txt @@ -1 +1 @@ -Galeri luring tanpa iklan. Kelola, sunting, pulihkan dan lindungi foto & video +Menampilkan semua kenangan anda tanpa gangguan. diff --git a/fastlane/metadata/android/in/short_description.txt b/fastlane/metadata/android/in/short_description.txt index 64f9a3446..cb3fd9ef3 100644 --- a/fastlane/metadata/android/in/short_description.txt +++ b/fastlane/metadata/android/in/short_description.txt @@ -1 +1 @@ -Galeri luring tanpa iklan. Kelola, sunting, pulihkan dan lindungi foto & video +Menampilkan semua kenangan anda tanpa gangguan. diff --git a/fastlane/metadata/android/pt-rPT/full_description.txt b/fastlane/metadata/android/pt-rPT/full_description.txt index 51ff06a56..a2fc0ade0 100644 --- a/fastlane/metadata/android/pt-rPT/full_description.txt +++ b/fastlane/metadata/android/pt-rPT/full_description.txt @@ -1,6 +1,6 @@ Simple Gallery Pro é uma aplicação local para gerir fotos e vídeos. Pode organizar e editar as suas fotos, recuperar ficheiros através da reciclagem, proteger e ocultar ficheiros e ver imagens e vídeos disponíveis em vários formatos tais como RAW, SVG e muito mais. -A aplicação não tem anúncios nem pede permissões desnecessárias. Uma vez que também não precisa de aceder à Internet, os seus ficheiros estão protegidos. +A aplicação não tem anúncios nem permissões desnecessárias. Uma vez que também não precisa de aceder à Internet, os seus ficheiros estão protegidos. ------------------------------------------------- SIMPLE GALLERY PRO – FUNCIONALIDADES diff --git a/fastlane/metadata/android/pt-rPT/short_description.txt b/fastlane/metadata/android/pt-rPT/short_description.txt index 0c6cb387c..3ebb2c472 100644 --- a/fastlane/metadata/android/pt-rPT/short_description.txt +++ b/fastlane/metadata/android/pt-rPT/short_description.txt @@ -1 +1 @@ -Sem anúncios. Organize, edite, recupere e protega os seus vídeos e fotos +Explore as suas memórias sem interrupções. diff --git a/fastlane/metadata/android/ru/short_description.txt b/fastlane/metadata/android/ru/short_description.txt index 8021a58ca..8b0a76ce3 100644 --- a/fastlane/metadata/android/ru/short_description.txt +++ b/fastlane/metadata/android/ru/short_description.txt @@ -1 +1 @@ -Галерея без рекламы. Управление, изменение, восстановление и защита фото и видео +Просматривайте свои воспоминания без перерывов.