diff --git a/CHANGELOG.md b/CHANGELOG.md index feff7768b..4679c2ccb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,24 @@ Changelog ========== +Version 6.2.1 *(2019-01-08)* +---------------------------- + + * Fixed some menu buttons at the video player activity + * Added buttons to the videoplayer for going to the previous/next item + * Allow pressing play/pause at the video player at fullscreen mode + * Properly retain exif values after editing a file, when overwriting the source file + +Version 6.2.0 *(2019-01-04)* +---------------------------- + + * Rewrote video playback, use a separate screen + added fast-forwarding with horizontal swiping + * Added optional 1:1 pixel ratio zooming with two double taps at fullscreen view + * Allow adding Copy at the fullscreen bottom actions + * Always include images at slideshows, never videos + * Fixed scanning of some predefined folders for images + * Some other stability/performance/translation improvements + Version 6.1.3 *(2018-12-26)* ---------------------------- diff --git a/app/build.gradle b/app/build.gradle index b31ee9a6c..e0cd7c297 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.simplemobiletools.gallery.pro" minSdkVersion 21 targetSdkVersion 28 - versionCode 216 - versionName "6.1.3" + versionCode 219 + versionName "6.2.1" multiDexEnabled true setProperty("archivesBaseName", "gallery") } @@ -57,7 +57,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.6.3' + implementation 'com.simplemobiletools:commons:5.6.6' 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' @@ -78,7 +78,7 @@ dependencies { //implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.10.0' //implementation 'com.github.tibbi:subsampling-scale-image-view:v3.10.1-fork' - implementation 'com.github.tibbi:subsampling-scale-image-view:4.0.2' + implementation 'com.github.tibbi:subsampling-scale-image-view:7a000e651e' // implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'com.github.tibbi:PhotoView:2.3.0-fork' 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 8ee45eacb..f665296be 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 @@ -77,6 +77,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener private var currAspectRatio = ASPECT_RATIO_FREE private var isCropIntent = false private var isEditingWithThirdParty = false + private var oldExif: ExifInterface? = null private var initialBitmap: Bitmap? = null @@ -136,6 +137,14 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener setupBottomActions() if (config.lastEditorCropAspectRatio == ASPECT_RATIO_OTHER) { + if (config.lastEditorCropOtherAspectRatioX == 0) { + config.lastEditorCropOtherAspectRatioX = 1 + } + + if (config.lastEditorCropOtherAspectRatioY == 0) { + config.lastEditorCropOtherAspectRatioY = 1 + } + lastOtherAspectRatio = Pair(config.lastEditorCropOtherAspectRatioX, config.lastEditorCropOtherAspectRatioY) } updateAspectRatio(config.lastEditorCropAspectRatio) @@ -222,7 +231,19 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } } + @TargetApi(Build.VERSION_CODES.N) private fun saveImage() { + var inputStream: InputStream? = null + try { + if (isNougatPlus()) { + inputStream = contentResolver.openInputStream(uri) + oldExif = ExifInterface(inputStream) + } + } catch (e: Exception) { + } finally { + inputStream?.close() + } + if (crop_image_view.isVisible()) { crop_image_view.getCroppedImageAsync() } else { @@ -371,7 +392,12 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener if (currPrimaryAction == PRIMARY_ACTION_FILTER && bottom_actions_filter_list.adapter == null) { Thread { val thumbnailSize = resources.getDimension(R.dimen.bottom_filters_thumbnail_size).toInt() - val bitmap = Glide.with(this).asBitmap().load(uri).submit(thumbnailSize, thumbnailSize).get() + val bitmap = Glide.with(this) + .asBitmap() + .load(uri) + .submit(thumbnailSize, thumbnailSize) + .get() + runOnUiThread { val filterThumbnailsManager = FilterThumbnailsManager() filterThumbnailsManager.clearThumbs() @@ -593,17 +619,12 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener bitmap.compress(file.absolutePath.getCompressionFormat(), 90, out) } - var inputStream: InputStream? = null try { if (isNougatPlus()) { - inputStream = contentResolver.openInputStream(uri) - val oldExif = ExifInterface(inputStream) val newExif = ExifInterface(file.absolutePath) - oldExif.copyTo(newExif, false) + oldExif?.copyTo(newExif, false) } } catch (e: Exception) { - } finally { - inputStream?.close() } setResult(Activity.RESULT_OK, intent) 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 58701c6ce..330e88e3d 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 @@ -1230,6 +1230,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { add(Release(202, R.string.release_202)) add(Release(206, R.string.release_206)) add(Release(213, R.string.release_213)) + add(Release(217, R.string.release_217)) checkWhatsNew(this, BuildConfig.VERSION_CODE) } } 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 fdca85100..13572628f 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 @@ -153,7 +153,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { media_horizontal_fastscroller.allowBubbleDisplay = config.showInfoBubble media_vertical_fastscroller.allowBubbleDisplay = config.showInfoBubble media_refresh_layout.isEnabled = config.enablePullToRefresh - tryloadGallery() + tryLoadGallery() invalidateOptionsMenu() media_empty_text_label.setTextColor(config.textColor) media_empty_text.setTextColor(getAdjustedPrimaryColor()) @@ -320,17 +320,20 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { private fun searchQueryChanged(text: String) { Thread { - val filtered = mMedia.filter { it is Medium && it.name.contains(text, true) } as ArrayList - filtered.sortBy { it is Medium && !it.name.startsWith(text, true) } - val grouped = MediaFetcher(applicationContext).groupMedia(filtered as ArrayList, mPath) - runOnUiThread { - getMediaAdapter()?.updateMedia(grouped) - measureRecyclerViewContent(grouped) + try { + val filtered = mMedia.filter { it is Medium && it.name.contains(text, true) } as ArrayList + filtered.sortBy { it is Medium && !it.name.startsWith(text, true) } + val grouped = MediaFetcher(applicationContext).groupMedia(filtered as ArrayList, mPath) + runOnUiThread { + getMediaAdapter()?.updateMedia(grouped) + measureRecyclerViewContent(grouped) + } + } catch (ignored: Exception) { } }.start() } - private fun tryloadGallery() { + private fun tryLoadGallery() { handlePermission(PERMISSION_WRITE_STORAGE) { if (it) { val dirName = when { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PanoramaVideoActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PanoramaVideoActivity.kt index 8183613d4..c442bd718 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PanoramaVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/PanoramaVideoActivity.kt @@ -244,6 +244,7 @@ open class PanoramaVideoActivity : SimpleActivity(), SeekBar.OnSeekBarChangeList } video_time_holder.setPadding(0, 0, right, bottom) + video_time_holder.background = resources.getDrawable(R.drawable.gradient_background) video_time_holder.onGlobalLayout { val newBottomMargin = video_time_holder.height - resources.getDimension(R.dimen.video_player_play_pause_size).toInt() - resources.getDimension(R.dimen.activity_margin).toInt() (explore.layoutParams as RelativeLayout.LayoutParams).bottomMargin = newBottomMargin 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 b5b1c0fff..224b58325 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 @@ -30,7 +30,6 @@ import java.io.File import java.io.FileInputStream open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentListener { - private var mMedium: Medium? = null private var mIsFullScreen = false private var mIsFromGallery = false @@ -42,7 +41,6 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.fragment_holder) - setTranslucentNavigation() handlePermission(PERMISSION_WRITE_STORAGE) { if (it) { @@ -56,7 +54,15 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList override fun onResume() { super.onResume() - supportActionBar?.setBackgroundDrawable(resources.getDrawable(R.drawable.gradient_background_flipped)) + supportActionBar?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window.statusBarColor = Color.TRANSPARENT + + if (config.bottomActions) { + window.navigationBarColor = Color.TRANSPARENT + } else { + setTranslucentNavigation() + } + if (config.blackBackground) { updateStatusbarColor(Color.BLACK) } @@ -170,6 +176,11 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList val mimeType = getUriMimeType(mUri.toString(), newUri) Intent(applicationContext, VideoPlayerActivity::class.java).apply { setDataAndType(newUri, mimeType) + addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT) + if (intent.extras != null) { + putExtras(intent.extras!!) + } + startActivity(this) } } @@ -240,7 +251,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).forEach { + bottom_toggle_file_visibility, bottom_rename, bottom_copy).forEach { it.beGone() } @@ -273,8 +284,10 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList showSystemUI(true) } + val newAlpha = if (mIsFullScreen) 0f else 1f + top_shadow.animate().alpha(newAlpha).start() if (!bottom_actions.isGone()) { - bottom_actions.animate().alpha(if (mIsFullScreen) 0f else 1f).start() + bottom_actions.animate().alpha(newAlpha).start() } } @@ -283,4 +296,6 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList override fun goToPrevItem() {} override fun goToNextItem() {} + + override fun launchViewVideoIntent(path: String) {} } 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 8426bd8c4..eb292610f 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 @@ -65,6 +65,7 @@ class SettingsActivity : SimpleActivity() { setupAllowZoomingImages() setupShowHighestQuality() setupOneFingerZoom() + setupAllowOneToOneZoom() setupAllowInstantChange() setupShowExtendedDetails() setupHideExtendedDetails() @@ -377,6 +378,7 @@ class SettingsActivity : SimpleActivity() { private fun updateDeepZoomToggleButtons() { settings_one_finger_zoom_holder.beVisibleIf(config.allowZoomingImages) settings_show_highest_quality_holder.beVisibleIf(config.allowZoomingImages) + settings_allow_one_to_one_zoom_holder.beVisibleIf(config.allowZoomingImages) } private fun setupShowHighestQuality() { @@ -395,6 +397,14 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupAllowOneToOneZoom() { + settings_allow_one_to_one_zoom.isChecked = config.allowOneToOneZoom + settings_allow_one_to_one_zoom_holder.setOnClickListener { + settings_allow_one_to_one_zoom.toggle() + config.allowOneToOneZoom = settings_allow_one_to_one_zoom.isChecked + } + } + private fun setupAllowInstantChange() { settings_allow_instant_change.isChecked = config.allowInstantChange settings_allow_instant_change_holder.setOnClickListener { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt index d4ea4fb25..d47601c06 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt @@ -1,5 +1,7 @@ package com.simplemobiletools.gallery.pro.activities +import android.app.Activity +import android.content.Intent import android.content.pm.ActivityInfo import android.content.res.Configuration import android.graphics.Color @@ -26,31 +28,40 @@ import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.isPiePlus import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.extensions.* -import com.simplemobiletools.gallery.pro.helpers.MIN_SKIP_LENGTH +import com.simplemobiletools.gallery.pro.helpers.* import kotlinx.android.synthetic.main.activity_video_player.* import kotlinx.android.synthetic.main.bottom_video_time_holder.* open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener, TextureView.SurfaceTextureListener { + private val PLAY_WHEN_READY_DRAG_DELAY = 100L + private var mIsFullscreen = false private var mIsPlaying = false private var mWasVideoStarted = false private var mIsDragged = false + private var mIsOrientationLocked = false + private var mScreenWidth = 0 private var mCurrTime = 0 private var mDuration = 0 private var mVideoSize = Point(0, 0) + private var mDragThreshold = 0f private var mUri: Uri? = null private var mExoPlayer: SimpleExoPlayer? = null private var mTimerHandler = Handler() + private var mPlayWhenReadyHandler = Handler() private var mTouchDownX = 0f private var mTouchDownY = 0f + private var mTouchDownTime = 0L + private var mProgressAtDown = 0L private var mCloseDownThreshold = 100f private var mIgnoreCloseDown = false public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_video_player) + setupOrientation() handlePermission(PERMISSION_WRITE_STORAGE) { if (it) { @@ -93,7 +104,12 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen override fun onDestroy() { super.onDestroy() if (!isChangingConfigurations) { - cleanup() + pauseVideo() + video_curr_time.text = 0.getFormattedDuration() + releaseExoPlayer() + video_seekbar.progress = 0 + mTimerHandler.removeCallbacksAndMessages(null) + mPlayWhenReadyHandler.removeCallbacksAndMessages(null) } } @@ -105,6 +121,8 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.menu_change_orientation -> changeOrientation() + R.id.menu_open_with -> openPath(mUri!!.toString(), true) + R.id.menu_share -> shareMediumPath(mUri!!.toString()) else -> return super.onOptionsItemSelected(item) } return true @@ -116,6 +134,16 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen initTimeHolder() } + private fun setupOrientation() { + if (!mIsOrientationLocked) { + if (config.screenRotation == ROTATE_BY_DEVICE_ROTATION) { + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR + } else if (config.screenRotation == ROTATE_BY_SYSTEM_SETTING) { + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED + } + } + } + private fun initPlayer() { mUri = intent.data ?: return supportActionBar?.title = getFilenameFromUri(mUri!!) @@ -132,40 +160,36 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen fullscreenToggled(isFullscreen) } - // adding an empty click listener just to avoid ripple animation at toggling fullscreen - video_seekbar.setOnClickListener { } video_curr_time.setOnClickListener { skip(false) } video_duration.setOnClickListener { skip(true) } video_toggle_play_pause.setOnClickListener { togglePlayPause() } - video_player_holder.setOnClickListener { - fullscreenToggled(!mIsFullscreen) + + video_next_file.beVisibleIf(intent.getBooleanExtra(SHOW_NEXT_ITEM, false)) + video_next_file.setOnClickListener { handleNextFile() } + + video_prev_file.beVisibleIf(intent.getBooleanExtra(SHOW_PREV_ITEM, false)) + video_prev_file.setOnClickListener { handlePrevFile() } + + video_player_holder.setOnTouchListener { view, event -> + handleEvent(event) + true } - if (config.allowDownGesture) { - video_player_holder.setOnTouchListener { v, event -> - handleEvent(event) - false - } - - video_surface.setOnTouchListener { v, event -> - handleEvent(event) - false - } + video_surface.setOnTouchListener { view, event -> + handleEvent(event) + true } initExoPlayer() video_surface.surfaceTextureListener = this - video_surface.setOnClickListener { - fullscreenToggled(!mIsFullscreen) - } if (config.allowVideoGestures) { video_brightness_controller.initialize(this, slide_info, true, video_player_holder) { x, y -> - video_player_holder.performClick() + fullscreenToggled(!mIsFullscreen) } video_volume_controller.initialize(this, slide_info, false, video_player_holder) { x, y -> - video_player_holder.performClick() + fullscreenToggled(!mIsFullscreen) } } else { video_brightness_controller.beGone() @@ -177,6 +201,8 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen fullscreenToggled(true) }, 500) } + + mDragThreshold = DRAG_THRESHOLD * resources.displayMetrics.density } private fun initExoPlayer() { @@ -370,9 +396,21 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } video_surface.layoutParams = this } + + val multiplier = if (screenWidth > screenHeight) 0.5 else 0.8 + mScreenWidth = (screenWidth * multiplier).toInt() + + if (config.screenRotation == ROTATE_BY_ASPECT_RATIO) { + if (mVideoSize.x > mVideoSize.y) { + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE + } else if (mVideoSize.x < mVideoSize.y) { + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + } + } } private fun changeOrientation() { + mIsOrientationLocked = true requestedOrientation = if (resources.configuration.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE } else { @@ -389,10 +427,11 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen } val newAlpha = if (isFullScreen) 0f else 1f - top_shadow.animate().alpha(newAlpha).start() - video_time_holder.animate().alpha(newAlpha).start() + arrayOf(video_prev_file, video_toggle_play_pause, video_next_file, video_curr_time, video_seekbar, video_duration, top_shadow, video_bottom_gradient).forEach { + it.animate().alpha(newAlpha).start() + } video_seekbar.setOnSeekBarChangeListener(if (mIsFullscreen) null else this) - arrayOf(video_toggle_play_pause, video_curr_time, video_duration).forEach { + arrayOf(video_prev_file, video_next_file, video_curr_time, video_duration).forEach { it.isClickable = !mIsFullscreen } } @@ -412,7 +451,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen video_time_holder.setPadding(0, 0, right, bottom) video_seekbar.setOnSeekBarChangeListener(this) - video_seekbar!!.max = mDuration + video_seekbar.max = mDuration video_duration.text = mDuration.getFormattedDuration() video_curr_time.text = mCurrTime.getFormattedDuration() setupTimer() @@ -453,26 +492,84 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen MotionEvent.ACTION_DOWN -> { mTouchDownX = event.x mTouchDownY = event.y + mTouchDownTime = System.currentTimeMillis() + mProgressAtDown = mExoPlayer!!.currentPosition } MotionEvent.ACTION_POINTER_DOWN -> mIgnoreCloseDown = true + MotionEvent.ACTION_MOVE -> { + val diffX = event.x - mTouchDownX + val diffY = event.y - mTouchDownY + + if (mIsDragged || (Math.abs(diffX) > mDragThreshold && Math.abs(diffX) > Math.abs(diffY))) { + if (!mIsDragged) { + arrayOf(video_curr_time, video_seekbar, video_duration).forEach { + it.animate().alpha(1f).start() + } + } + mIgnoreCloseDown = true + mIsDragged = true + var percent = ((diffX / mScreenWidth) * 100).toInt() + percent = Math.min(100, Math.max(-100, percent)) + + val skipLength = (mDuration * 1000f) * (percent / 100f) + var newProgress = mProgressAtDown + skipLength + newProgress = Math.max(Math.min(mExoPlayer!!.duration.toFloat(), newProgress), 0f) + val newSeconds = (newProgress / 1000).toInt() + setPosition(newSeconds) + resetPlayWhenReady() + } + } MotionEvent.ACTION_UP -> { val diffX = mTouchDownX - event.x val diffY = mTouchDownY - event.y - if (!mIgnoreCloseDown && Math.abs(diffY) > Math.abs(diffX) && diffY < -mCloseDownThreshold) { + if (config.allowDownGesture && !mIgnoreCloseDown && Math.abs(diffY) > Math.abs(diffX) && diffY < -mCloseDownThreshold) { supportFinishAfterTransition() } + mIgnoreCloseDown = false + if (mIsDragged) { + if (mIsFullscreen) { + arrayOf(video_curr_time, video_seekbar, video_duration).forEach { + it.animate().alpha(0f).start() + } + } + + if (!mIsPlaying) { + togglePlayPause() + } + } else { + if (System.currentTimeMillis() - mTouchDownTime < CLICK_MAX_DURATION) { + fullscreenToggled(!mIsFullscreen) + } + } + mIsDragged = false } } } - private fun cleanup() { - pauseVideo() - video_curr_time.text = 0.getFormattedDuration() - releaseExoPlayer() - video_seekbar.progress = 0 - mTimerHandler.removeCallbacksAndMessages(null) + private fun handleNextFile() { + Intent().apply { + putExtra(GO_TO_NEXT_ITEM, true) + setResult(Activity.RESULT_OK, this) + } + finish() + } + + private fun handlePrevFile() { + Intent().apply { + putExtra(GO_TO_PREV_ITEM, true) + setResult(Activity.RESULT_OK, this) + } + finish() + } + + private fun resetPlayWhenReady() { + mExoPlayer?.playWhenReady = false + mPlayWhenReadyHandler.removeCallbacksAndMessages(null) + mPlayWhenReadyHandler.postDelayed({ + mExoPlayer?.playWhenReady = true + }, PLAY_WHEN_READY_DRAG_DELAY) } private fun releaseExoPlayer() { @@ -486,6 +583,7 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { if (mExoPlayer != null && fromUser) { setPosition(progress) + resetPlayWhenReady() } } 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 7225ab6ab..6edf32c38 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 @@ -19,7 +19,6 @@ import android.os.Build import android.os.Bundle import android.os.Handler import android.provider.MediaStore -import android.util.DisplayMetrics import android.view.Menu import android.view.MenuItem import android.view.View @@ -33,6 +32,7 @@ import com.simplemobiletools.commons.dialogs.RenameItemDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.FileDirItem +import com.simplemobiletools.gallery.pro.BuildConfig import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.adapters.MyPagerAdapter import com.simplemobiletools.gallery.pro.asynctasks.GetMediaAsynctask @@ -54,6 +54,8 @@ import java.io.OutputStream import java.util.* class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, ViewPagerFragment.FragmentListener { + private val REQUEST_VIEW_VIDEO = 1 + private var mPath = "" private var mDirectory = "" private var mIsFullScreen = false @@ -74,11 +76,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private var mMediaFiles = ArrayList() private var mFavoritePaths = ArrayList() - companion object { - var screenWidth = 0 - var screenHeight = 0 - } - @TargetApi(Build.VERSION_CODES.P) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -125,7 +122,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View window.attributes = attributes } - setupRotation() + setupOrientation() invalidateOptionsMenu() supportActionBar?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) @@ -168,6 +165,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View findItem(R.id.menu_rename).isVisible = visibleBottomActions and BOTTOM_ACTION_RENAME == 0 && !currentMedium.getIsInRecycleBin() findItem(R.id.menu_rotate).isVisible = currentMedium.isImage() && visibleBottomActions and BOTTOM_ACTION_ROTATE == 0 findItem(R.id.menu_set_as).isVisible = visibleBottomActions and BOTTOM_ACTION_SET_AS == 0 + findItem(R.id.menu_copy_to).isVisible = visibleBottomActions and BOTTOM_ACTION_COPY == 0 findItem(R.id.menu_save_as).isVisible = mRotationDegrees != 0 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() @@ -225,7 +223,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } private fun initViewPager() { - measureScreen() val uri = intent.data if (uri != null) { var cursor: Cursor? = null @@ -364,7 +361,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View }.start() } - private fun setupRotation() { + private fun setupOrientation() { if (!mIsOrientationLocked) { if (config.screenRotation == ROTATE_BY_DEVICE_ROTATION) { requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR @@ -870,6 +867,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View bottom_set_as.setOnClickListener { setAs(getCurrentPath()) } + + bottom_copy.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_COPY != 0) + bottom_copy.setOnClickListener { + copyMoveTo(true) + } } private fun updateBottomActionIcons(medium: Medium?) { @@ -908,15 +910,17 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { - if (requestCode == REQUEST_EDIT_IMAGE) { - if (resultCode == Activity.RESULT_OK && resultData != null) { - mPos = -1 - mPrevHashcode = 0 - refreshViewPager() - } - } else if (requestCode == REQUEST_SET_AS) { - if (resultCode == Activity.RESULT_OK) { - toast(R.string.wallpaper_set_successfully) + 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) @@ -1005,17 +1009,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View override fun onConfigurationChanged(newConfig: Configuration?) { super.onConfigurationChanged(newConfig) - measureScreen() initBottomActionsLayout() } - private fun measureScreen() { - val metrics = DisplayMetrics() - windowManager.defaultDisplay.getRealMetrics(metrics) - screenWidth = metrics.widthPixels - screenHeight = metrics.heightPixels - } - private fun refreshViewPager() { if (config.getFileSorting(mDirectory) and SORT_BY_RANDOM == 0) { GetMediaAsynctask(applicationContext, mDirectory, false, false, mShowAll) { @@ -1107,6 +1103,34 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View checkOrientation() } + override fun launchViewVideoIntent(path: String) { + Thread { + val newUri = getFinalUriFromPath(path, BuildConfig.APPLICATION_ID) ?: return@Thread + val mimeType = getUriMimeType(path, newUri) + Intent().apply { + action = Intent.ACTION_VIEW + setDataAndType(newUri, mimeType) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + putExtra(IS_FROM_GALLERY, true) + putExtra(REAL_FILE_PATH, path) + putExtra(SHOW_PREV_ITEM, view_pager.currentItem != 0) + putExtra(SHOW_NEXT_ITEM, view_pager.currentItem != mMediaFiles.size - 1) + + if (resolveActivity(packageManager) != null) { + try { + startActivityForResult(this, REQUEST_VIEW_VIDEO) + } catch (e: NullPointerException) { + showErrorToast(e) + } + } else { + if (!tryGenericMimeType(this, mimeType, newUri)) { + toast(R.string.no_app_found) + } + } + } + }.start() + } + private fun checkSystemUI() { if (mIsFullScreen) { hideSystemUI(true) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ManageBottomActionsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ManageBottomActionsDialog.kt index 94a16c3be..760f51be2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ManageBottomActionsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/dialogs/ManageBottomActionsDialog.kt @@ -26,6 +26,7 @@ class ManageBottomActionsDialog(val activity: BaseSimpleActivity, val callback: manage_bottom_actions_toggle_visibility.isChecked = actions and BOTTOM_ACTION_TOGGLE_VISIBILITY != 0 manage_bottom_actions_rename.isChecked = actions and BOTTOM_ACTION_RENAME != 0 manage_bottom_actions_set_as.isChecked = actions and BOTTOM_ACTION_SET_AS != 0 + manage_bottom_actions_copy.isChecked = actions and BOTTOM_ACTION_COPY != 0 } AlertDialog.Builder(activity) @@ -63,6 +64,8 @@ class ManageBottomActionsDialog(val activity: BaseSimpleActivity, val callback: result += BOTTOM_ACTION_RENAME if (manage_bottom_actions_set_as.isChecked) result += BOTTOM_ACTION_SET_AS + if (manage_bottom_actions_copy.isChecked) + result += BOTTOM_ACTION_COPY } activity.config.visibleBottomActions = result 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 a8103b206..1c66fdf2b 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 @@ -70,7 +70,7 @@ fun SimpleActivity.launchAbout() { FAQItem(R.string.faq_1_title, R.string.faq_1_text), FAQItem(R.string.faq_2_title, R.string.faq_2_text), FAQItem(R.string.faq_3_title, R.string.faq_3_text), - FAQItem(R.string.faq_4_title, R.string.faq_4_text), + FAQItem(R.string.faq_4_title, R.string.faq_4_text_old), FAQItem(R.string.faq_5_title, R.string.faq_5_text), FAQItem(R.string.faq_6_title, R.string.faq_6_text), FAQItem(R.string.faq_7_title, R.string.faq_7_text), 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 847d5f95a..f8a36a11b 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 @@ -34,7 +34,6 @@ import com.simplemobiletools.commons.helpers.OTG_PATH import com.simplemobiletools.gallery.pro.R import com.simplemobiletools.gallery.pro.activities.PanoramaPhotoActivity import com.simplemobiletools.gallery.pro.activities.PhotoActivity -import com.simplemobiletools.gallery.pro.activities.ViewPagerActivity import com.simplemobiletools.gallery.pro.extensions.* import com.simplemobiletools.gallery.pro.helpers.MEDIUM import com.simplemobiletools.gallery.pro.helpers.PATH @@ -63,27 +62,29 @@ class PhotoFragment : ViewPagerFragment() { "google nexus 5x" ) - private var isFragmentVisible = false - private var isFullscreen = false - private var wasInit = false - private var isPanorama = false - private var isSubsamplingVisible = false // checking view.visibility is unreliable, use an extra variable for it - private var imageOrientation = -1 - private var loadZoomableViewHandler = Handler() - - private var storedShowExtendedDetails = false - private var storedHideExtendedDetails = false - private var storedAllowDeepZoomableImages = false - private var storedShowHighestQuality = false - private var storedAllowOneFingerZoom = false + private var mIsFragmentVisible = false + private var mIsFullscreen = false + private var mWasInit = false + private var mIsPanorama = false + private var mIsSubsamplingVisible = false // checking view.visibility is unreliable, use an extra variable for it + private var mImageOrientation = -1 private var mOriginalSubsamplingScale = 0f - private var storedExtendedDetails = 0 + private var mIoadZoomableViewHandler = Handler() + private var mScreenWidth = 0 + private var mScreenHeight = 0 - lateinit var view: ViewGroup - lateinit var medium: Medium + private var mStoredShowExtendedDetails = false + private var mStoredHideExtendedDetails = false + private var mStoredAllowDeepZoomableImages = false + private var mStoredShowHighestQuality = false + private var mStoredAllowOneFingerZoom = false + private var mStoredExtendedDetails = 0 + + private lateinit var mView: ViewGroup + private lateinit var mMedium: Medium override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { - view = (inflater.inflate(R.layout.pager_photo_item, container, false) as ViewGroup).apply { + mView = (inflater.inflate(R.layout.pager_photo_item, container, false) as ViewGroup).apply { subsampling_view.setOnClickListener { photoClicked() } photo_view.setOnClickListener { photoClicked() } gif_view.setOnClickListener { photoClicked() } @@ -95,7 +96,7 @@ class PhotoFragment : ViewPagerFragment() { instant_next_item.parentView = container photo_brightness_controller.initialize(activity!!, slide_info, true, container) { x, y -> - view.apply { + mView.apply { if (subsampling_view.isVisible()) { subsampling_view.sendFakeClick(x, y) } else { @@ -111,7 +112,7 @@ class PhotoFragment : ViewPagerFragment() { } subsampling_view.setOnTouchListener { v, event -> - if (view.subsampling_view.scale == mOriginalSubsamplingScale) { + if (mView.subsampling_view.scale == mOriginalSubsamplingScale) { handleEvent(event) } false @@ -121,16 +122,16 @@ class PhotoFragment : ViewPagerFragment() { checkScreenDimensions() storeStateVariables() - if (!isFragmentVisible && activity is PhotoActivity) { - isFragmentVisible = true + if (!mIsFragmentVisible && activity is PhotoActivity) { + mIsFragmentVisible = true } - medium = arguments!!.getSerializable(MEDIUM) as Medium - if (medium.path.startsWith("content://") && !medium.path.startsWith("content://mms/")) { - val originalPath = medium.path - medium.path = context!!.getRealPathFromURI(Uri.parse(originalPath)) ?: medium.path + mMedium = arguments!!.getSerializable(MEDIUM) as Medium + if (mMedium.path.startsWith("content://") && !mMedium.path.startsWith("content://mms/")) { + val originalPath = mMedium.path + mMedium.path = context!!.getRealPathFromURI(Uri.parse(originalPath)) ?: mMedium.path - if (medium.path.isEmpty()) { + if (mMedium.path.isEmpty()) { var out: FileOutputStream? = null try { var inputStream = context!!.contentResolver.openInputStream(Uri.parse(originalPath)) @@ -147,24 +148,24 @@ class PhotoFragment : ViewPagerFragment() { val file = File(context!!.externalCacheDir, Uri.parse(originalPath).lastPathSegment) out = FileOutputStream(file) rotated.compress(Bitmap.CompressFormat.JPEG, 100, out) - medium.path = file.absolutePath + mMedium.path = file.absolutePath } catch (e: Exception) { activity!!.toast(R.string.unknown_error_occurred) - return view + return mView } finally { out?.close() } } } - isFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN + mIsFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN loadImage() initExtendedDetails() - wasInit = true + mWasInit = true checkIfPanorama() updateInstantSwitchWidths() - return view + return mView } override fun onPause() { @@ -175,17 +176,17 @@ class PhotoFragment : ViewPagerFragment() { override fun onResume() { super.onResume() val config = context!!.config - if (wasInit && (config.showExtendedDetails != storedShowExtendedDetails || config.extendedDetails != storedExtendedDetails)) { + if (mWasInit && (config.showExtendedDetails != mStoredShowExtendedDetails || config.extendedDetails != mStoredExtendedDetails)) { initExtendedDetails() } - if (wasInit) { - if (config.allowZoomingImages != storedAllowDeepZoomableImages || config.showHighestQuality != storedShowHighestQuality || - config.oneFingerZoom != storedAllowOneFingerZoom) { - isSubsamplingVisible = false - view.subsampling_view.beGone() + if (mWasInit) { + if (config.allowZoomingImages != mStoredAllowDeepZoomableImages || config.showHighestQuality != mStoredShowHighestQuality || + config.oneFingerZoom != mStoredAllowOneFingerZoom) { + mIsSubsamplingVisible = false + mView.subsampling_view.beGone() loadImage() - } else if (medium.isGIF()) { + } else if (mMedium.isGIF()) { loadGif() } } @@ -193,7 +194,7 @@ class PhotoFragment : ViewPagerFragment() { val allowPhotoGestures = config.allowPhotoGestures val allowInstantChange = config.allowInstantChange - view.apply { + mView.apply { photo_brightness_controller.beVisibleIf(allowPhotoGestures) instant_prev_item.beVisibleIf(allowInstantChange) instant_next_item.beVisibleIf(allowInstantChange) @@ -205,9 +206,9 @@ class PhotoFragment : ViewPagerFragment() { override fun setMenuVisibility(menuVisible: Boolean) { super.setMenuVisibility(menuVisible) - isFragmentVisible = menuVisible - if (wasInit) { - if (!medium.isGIF()) { + mIsFragmentVisible = menuVisible + if (mWasInit) { + if (!mMedium.isGIF()) { photoFragmentVisibilityChanged(menuVisible) } } @@ -215,17 +216,17 @@ class PhotoFragment : ViewPagerFragment() { private fun storeStateVariables() { context!!.config.apply { - storedShowExtendedDetails = showExtendedDetails - storedHideExtendedDetails = hideExtendedDetails - storedAllowDeepZoomableImages = allowZoomingImages - storedShowHighestQuality = showHighestQuality - storedAllowOneFingerZoom = oneFingerZoom - storedExtendedDetails = extendedDetails + mStoredShowExtendedDetails = showExtendedDetails + mStoredHideExtendedDetails = hideExtendedDetails + mStoredAllowDeepZoomableImages = allowZoomingImages + mStoredShowHighestQuality = showHighestQuality + mStoredAllowOneFingerZoom = oneFingerZoom + mStoredExtendedDetails = extendedDetails } } private fun checkScreenDimensions() { - if (ViewPagerActivity.screenWidth == 0 || ViewPagerActivity.screenHeight == 0) { + if (mScreenWidth == 0 || mScreenHeight == 0) { measureScreen() } } @@ -233,8 +234,8 @@ class PhotoFragment : ViewPagerFragment() { private fun measureScreen() { val metrics = DisplayMetrics() activity!!.windowManager.defaultDisplay.getRealMetrics(metrics) - ViewPagerActivity.screenWidth = metrics.widthPixels - ViewPagerActivity.screenHeight = metrics.heightPixels + mScreenWidth = metrics.widthPixels + mScreenHeight = metrics.heightPixels } private fun photoFragmentVisibilityChanged(isVisible: Boolean) { @@ -264,26 +265,26 @@ class PhotoFragment : ViewPagerFragment() { } private fun loadImage() { - imageOrientation = getImageOrientation() + mImageOrientation = getImageOrientation() when { - medium.isGIF() -> loadGif() - medium.isSVG() -> loadSVG() + mMedium.isGIF() -> loadGif() + mMedium.isSVG() -> loadSVG() else -> loadBitmap() } } private fun loadGif() { try { - val pathToLoad = getPathToLoad(medium) + val pathToLoad = getPathToLoad(mMedium) val source = if (pathToLoad.startsWith("content://") || pathToLoad.startsWith("file://")) { InputSource.UriSource(context!!.contentResolver, Uri.parse(pathToLoad)) } else { InputSource.FileSource(pathToLoad) } - view.photo_view.beGone() - view.gif_view.beVisible() - view.gif_view.setInputSource(source) + mView.photo_view.beGone() + mView.gif_view.beVisible() + mView.gif_view.setInputSource(source) } catch (e: Exception) { loadBitmap() } catch (e: OutOfMemoryError) { @@ -295,35 +296,35 @@ class PhotoFragment : ViewPagerFragment() { Glide.with(context!!) .`as`(PictureDrawable::class.java) .listener(SvgSoftwareLayerSetter()) - .load(medium.path) - .into(view.photo_view) + .load(mMedium.path) + .into(mView.photo_view) } private fun loadBitmap(degrees: Int = 0) { checkScreenDimensions() - var pathToLoad = if (medium.path.startsWith("content://")) medium.path else "file://${medium.path}" + var pathToLoad = if (mMedium.path.startsWith("content://")) mMedium.path else "file://${mMedium.path}" pathToLoad = pathToLoad.replace("%", "%25").replace("#", "%23") try { val picasso = Picasso.get() .load(pathToLoad) .centerInside() - .resize(ViewPagerActivity.screenWidth, ViewPagerActivity.screenHeight) + .resize(mScreenWidth, mScreenHeight) if (degrees != 0) { picasso.rotate(degrees.toFloat()) } - picasso.into(view.photo_view, object : Callback { + picasso.into(mView.photo_view, object : Callback { override fun onSuccess() { - view.photo_view.isZoomable = degrees != 0 || context?.config?.allowZoomingImages == false - if (isFragmentVisible && degrees == 0) { + mView.photo_view.isZoomable = degrees != 0 || context?.config?.allowZoomingImages == false + if (mIsFragmentVisible && degrees == 0) { scheduleZoomableView() } } override fun onError(e: Exception) { - if (context != null) { + if (activity != null) { tryLoadingWithGlide() } } @@ -333,56 +334,56 @@ class PhotoFragment : ViewPagerFragment() { } private fun tryLoadingWithGlide() { - var targetWidth = if (ViewPagerActivity.screenWidth == 0) com.bumptech.glide.request.target.Target.SIZE_ORIGINAL else ViewPagerActivity.screenWidth - var targetHeight = if (ViewPagerActivity.screenHeight == 0) com.bumptech.glide.request.target.Target.SIZE_ORIGINAL else ViewPagerActivity.screenHeight + var targetWidth = if (mScreenWidth == 0) com.bumptech.glide.request.target.Target.SIZE_ORIGINAL else mScreenWidth + var targetHeight = if (mScreenHeight == 0) com.bumptech.glide.request.target.Target.SIZE_ORIGINAL else mScreenHeight - if (imageOrientation == ORIENTATION_ROTATE_90) { + if (mImageOrientation == ORIENTATION_ROTATE_90) { targetWidth = targetHeight targetHeight = com.bumptech.glide.request.target.Target.SIZE_ORIGINAL } val options = RequestOptions() - .signature(medium.path.getFileSignature()) + .signature(mMedium.path.getFileSignature()) .format(DecodeFormat.PREFER_ARGB_8888) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .override(targetWidth, targetHeight) Glide.with(context!!) .asBitmap() - .load(getPathToLoad(medium)) + .load(getPathToLoad(mMedium)) .apply(options) .listener(object : RequestListener { override fun onLoadFailed(e: GlideException?, model: Any?, target: com.bumptech.glide.request.target.Target?, isFirstResource: Boolean) = false override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target?, dataSource: com.bumptech.glide.load.DataSource?, isFirstResource: Boolean): Boolean { - if (isFragmentVisible) { + if (mIsFragmentVisible) { scheduleZoomableView() } return false } - }).into(view.photo_view) + }).into(mView.photo_view) } private fun openPanorama() { Intent(context, PanoramaPhotoActivity::class.java).apply { - putExtra(PATH, medium.path) + putExtra(PATH, mMedium.path) startActivity(this) } } private fun scheduleZoomableView() { - loadZoomableViewHandler.removeCallbacksAndMessages(null) - loadZoomableViewHandler.postDelayed({ - if (isFragmentVisible && context?.config?.allowZoomingImages == true && medium.isImage() && !isSubsamplingVisible) { + mIoadZoomableViewHandler.removeCallbacksAndMessages(null) + mIoadZoomableViewHandler.postDelayed({ + if (mIsFragmentVisible && context?.config?.allowZoomingImages == true && mMedium.isImage() && !mIsSubsamplingVisible) { addZoomableView() } }, ZOOMABLE_VIEW_LOAD_DELAY) } private fun addZoomableView() { - val rotation = degreesForRotation(imageOrientation) - val path = getPathToLoad(medium) - isSubsamplingVisible = true + val rotation = degreesForRotation(mImageOrientation) + val path = getPathToLoad(mMedium) + mIsSubsamplingVisible = true val bitmapDecoder = object : DecoderFactory { override fun make() = PicassoDecoder(path, Picasso.get(), rotation) @@ -392,15 +393,17 @@ class PhotoFragment : ViewPagerFragment() { override fun make() = PicassoRegionDecoder() } - view.subsampling_view.apply { - setMaxTileSize(if (context!!.config.showHighestQuality) Integer.MAX_VALUE else 4096) - setMinimumTileDpi(if (context!!.config.showHighestQuality) -1 else getMinTileDpi()) + val config = context!!.config + mView.subsampling_view.apply { + setMaxTileSize(if (config.showHighestQuality) Integer.MAX_VALUE else 4096) + setMinimumTileDpi(if (config.showHighestQuality) -1 else getMinTileDpi()) background = ColorDrawable(Color.TRANSPARENT) setBitmapDecoderFactory(bitmapDecoder) setRegionDecoderFactory(regionDecoder) maxScale = 10f beVisible() - isQuickScaleEnabled = context.config.oneFingerZoom + isQuickScaleEnabled = config.oneFingerZoom + isOneToOneZoomEnabled = config.allowOneToOneZoom setResetScaleOnSizeChange(false) setImage(ImageSource.uri(path)) setOrientation(rotation) @@ -410,9 +413,9 @@ class PhotoFragment : ViewPagerFragment() { } override fun onReady() { - background = ColorDrawable(if (context.config.blackBackground) Color.BLACK else context.config.backgroundColor) - val useWidth = if (imageOrientation == ORIENTATION_ROTATE_90 || imageOrientation == ORIENTATION_ROTATE_270) sHeight else sWidth - val useHeight = if (imageOrientation == ORIENTATION_ROTATE_90 || imageOrientation == ORIENTATION_ROTATE_270) sWidth else sHeight + background = ColorDrawable(if (config.blackBackground) Color.BLACK else config.backgroundColor) + val useWidth = if (mImageOrientation == ORIENTATION_ROTATE_90 || mImageOrientation == ORIENTATION_ROTATE_270) sHeight else sWidth + val useHeight = if (mImageOrientation == ORIENTATION_ROTATE_90 || mImageOrientation == ORIENTATION_ROTATE_270) sWidth else sHeight setDoubleTapZoomScale(getDoubleTapZoomScale(useWidth, useHeight)) mOriginalSubsamplingScale = scale } @@ -424,15 +427,15 @@ class PhotoFragment : ViewPagerFragment() { } override fun onImageLoadError(e: Exception) { - view.photo_view.isZoomable = true + mView.photo_view.isZoomable = true background = ColorDrawable(Color.TRANSPARENT) - isSubsamplingVisible = false + mIsSubsamplingVisible = false beGone() } override fun onPreviewLoadError(e: Exception) { background = ColorDrawable(Color.TRANSPARENT) - isSubsamplingVisible = false + mIsSubsamplingVisible = false beGone() } }) @@ -452,9 +455,9 @@ class PhotoFragment : ViewPagerFragment() { } private fun checkIfPanorama() { - isPanorama = try { - val inputStream = if (medium.path.startsWith("content:/")) context!!.contentResolver.openInputStream(Uri.parse(medium.path)) else File(medium.path).inputStream() - val imageParser = JpegImageParser().getXmpXml(ByteSourceInputStream(inputStream, medium.name), HashMap()) + mIsPanorama = try { + val inputStream = if (mMedium.path.startsWith("content:/")) context!!.contentResolver.openInputStream(Uri.parse(mMedium.path)) else File(mMedium.path).inputStream() + val imageParser = JpegImageParser().getXmpXml(ByteSourceInputStream(inputStream, mMedium.name), HashMap()) imageParser.contains("GPano:UsePanoramaViewer=\"True\"", true) || imageParser.contains("True", true) } catch (e: Exception) { false @@ -462,7 +465,7 @@ class PhotoFragment : ViewPagerFragment() { false } - view.panorama_outline.beVisibleIf(isPanorama) + mView.panorama_outline.beVisibleIf(mIsPanorama) } private fun getImageOrientation(): Int { @@ -470,11 +473,11 @@ class PhotoFragment : ViewPagerFragment() { var orient = defaultOrientation try { - val pathToLoad = getPathToLoad(medium) + val pathToLoad = getPathToLoad(mMedium) val exif = android.media.ExifInterface(pathToLoad) orient = exif.getAttributeInt(android.media.ExifInterface.TAG_ORIENTATION, defaultOrientation) - if (orient == defaultOrientation || medium.path.startsWith(OTG_PATH)) { + if (orient == defaultOrientation || mMedium.path.startsWith(OTG_PATH)) { val uri = if (pathToLoad.startsWith("content:/")) Uri.parse(pathToLoad) else Uri.fromFile(File(pathToLoad)) val inputStream = context!!.contentResolver.openInputStream(uri) val exif2 = ExifInterface() @@ -489,65 +492,65 @@ class PhotoFragment : ViewPagerFragment() { private fun getDoubleTapZoomScale(width: Int, height: Int): Float { val bitmapAspectRatio = height / width.toFloat() - val screenAspectRatio = ViewPagerActivity.screenHeight / ViewPagerActivity.screenWidth.toFloat() + val screenAspectRatio = mScreenHeight / mScreenWidth.toFloat() return if (context == null || bitmapAspectRatio == screenAspectRatio) { DEFAULT_DOUBLE_TAP_ZOOM } else if (context!!.portrait && bitmapAspectRatio <= screenAspectRatio) { - ViewPagerActivity.screenHeight / height.toFloat() + mScreenHeight / height.toFloat() } else if (context!!.portrait && bitmapAspectRatio > screenAspectRatio) { - ViewPagerActivity.screenWidth / width.toFloat() + mScreenWidth / width.toFloat() } else if (!context!!.portrait && bitmapAspectRatio >= screenAspectRatio) { - ViewPagerActivity.screenWidth / width.toFloat() + mScreenWidth / width.toFloat() } else if (!context!!.portrait && bitmapAspectRatio < screenAspectRatio) { - ViewPagerActivity.screenHeight / height.toFloat() + mScreenHeight / height.toFloat() } else { DEFAULT_DOUBLE_TAP_ZOOM } } fun rotateImageViewBy(degrees: Int) { - loadZoomableViewHandler.removeCallbacksAndMessages(null) - view.subsampling_view.beGone() - isSubsamplingVisible = false + mIoadZoomableViewHandler.removeCallbacksAndMessages(null) + mView.subsampling_view.beGone() + mIsSubsamplingVisible = false loadBitmap(degrees) } private fun initExtendedDetails() { if (context!!.config.showExtendedDetails) { - view.photo_details.apply { + mView.photo_details.apply { beInvisible() // make it invisible so we can measure it, but not show yet - text = getMediumExtendedDetails(medium) + text = getMediumExtendedDetails(mMedium) onGlobalLayout { if (isAdded) { val realY = getExtendedDetailsY(height) if (realY > 0) { y = realY beVisibleIf(text.isNotEmpty()) - alpha = if (!context!!.config.hideExtendedDetails || !isFullscreen) 1f else 0f + alpha = if (!context!!.config.hideExtendedDetails || !mIsFullscreen) 1f else 0f } } } } } else { - view.photo_details.beGone() + mView.photo_details.beGone() } } override fun onDestroyView() { super.onDestroyView() if (activity?.isDestroyed == false) { - view.subsampling_view.recycle() + mView.subsampling_view.recycle() } - loadZoomableViewHandler.removeCallbacksAndMessages(null) + mIoadZoomableViewHandler.removeCallbacksAndMessages(null) } override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) // avoid GIFs being skewed, played in wrong aspect ratio - if (medium.isGIF()) { - view.onGlobalLayout { + if (mMedium.isGIF()) { + mView.onGlobalLayout { Handler().postDelayed({ loadGif() }, 50) @@ -563,10 +566,10 @@ class PhotoFragment : ViewPagerFragment() { private fun hideZoomableView() { if (context?.config?.allowZoomingImages == true) { - isSubsamplingVisible = false - view.subsampling_view.recycle() - view.subsampling_view.beGone() - loadZoomableViewHandler.removeCallbacksAndMessages(null) + mIsSubsamplingVisible = false + mView.subsampling_view.recycle() + mView.subsampling_view.beGone() + mIoadZoomableViewHandler.removeCallbacksAndMessages(null) } } @@ -576,17 +579,17 @@ class PhotoFragment : ViewPagerFragment() { private fun updateInstantSwitchWidths() { val newWidth = resources.getDimension(R.dimen.instant_change_bar_width) + if (activity?.portrait == false) activity!!.navigationBarWidth else 0 - view.instant_prev_item.layoutParams.width = newWidth.toInt() - view.instant_next_item.layoutParams.width = newWidth.toInt() + mView.instant_prev_item.layoutParams.width = newWidth.toInt() + mView.instant_next_item.layoutParams.width = newWidth.toInt() } override fun fullscreenToggled(isFullscreen: Boolean) { - this.isFullscreen = isFullscreen - view.photo_details.apply { - if (storedShowExtendedDetails && isVisible()) { + this.mIsFullscreen = isFullscreen + mView.photo_details.apply { + if (mStoredShowExtendedDetails && isVisible()) { animate().y(getExtendedDetailsY(height)) - if (storedHideExtendedDetails) { + if (mStoredHideExtendedDetails) { animate().alpha(if (isFullscreen) 0f else 1f).start() } } @@ -595,8 +598,8 @@ class PhotoFragment : ViewPagerFragment() { private fun getExtendedDetailsY(height: Int): Float { val smallMargin = resources.getDimension(R.dimen.small_margin) - val fullscreenOffset = smallMargin + if (isFullscreen) 0 else context!!.navigationBarHeight - val actionsHeight = if (context!!.config.bottomActions && !isFullscreen) resources.getDimension(R.dimen.bottom_actions_height) else 0f + val fullscreenOffset = smallMargin + if (mIsFullscreen) 0 else context!!.navigationBarHeight + val actionsHeight = if (context!!.config.bottomActions && !mIsFullscreen) resources.getDimension(R.dimen.bottom_actions_height) else 0f return context!!.realScreenSize.y - height - actionsHeight - fullscreenOffset } } 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 586edfaa4..0ef8a6223 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 @@ -32,8 +32,8 @@ class VideoFragment : ViewPagerFragment() { private lateinit var mBrightnessSideScroll: MediaSideScroll private lateinit var mVolumeSideScroll: MediaSideScroll - lateinit var mView: View - lateinit var medium: Medium + private lateinit var mView: View + private lateinit var mMedium: Medium override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { mView = inflater.inflate(R.layout.pager_video_item, container, false).apply { @@ -56,8 +56,8 @@ class VideoFragment : ViewPagerFragment() { } storeStateVariables() - medium = arguments!!.getSerializable(MEDIUM) as Medium - Glide.with(context!!).load(medium.path).into(mView.video_preview) + mMedium = arguments!!.getSerializable(MEDIUM) as Medium + Glide.with(context!!).load(mMedium.path).into(mView.video_preview) mIsFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN checkIfPanorama() @@ -68,7 +68,7 @@ class VideoFragment : ViewPagerFragment() { video_play_outline.beGone() mVolumeSideScroll.beGone() mBrightnessSideScroll.beGone() - Glide.with(context!!).load(medium.path).into(video_preview) + Glide.with(context!!).load(mMedium.path).into(video_preview) } } @@ -104,10 +104,7 @@ class VideoFragment : ViewPagerFragment() { instant_next_item.beVisibleIf(allowInstantChange) } - if (config.showExtendedDetails != mStoredShowExtendedDetails || config.extendedDetails != mStoredExtendedDetails) { - checkExtendedDetails() - } - + checkExtendedDetails() storeStateVariables() } @@ -132,7 +129,7 @@ class VideoFragment : ViewPagerFragment() { } private fun launchVideoPlayer() { - activity!!.openPath(medium.path, false) + listener?.launchViewVideoIntent(mMedium.path) } private fun toggleFullscreen() { @@ -143,7 +140,7 @@ class VideoFragment : ViewPagerFragment() { if (context!!.config.showExtendedDetails) { mView.video_details.apply { beInvisible() // make it invisible so we can measure it, but not show yet - text = getMediumExtendedDetails(medium) + text = getMediumExtendedDetails(mMedium) onGlobalLayout { if (isAdded) { val realY = getExtendedDetailsY(height) @@ -162,8 +159,8 @@ class VideoFragment : ViewPagerFragment() { private fun checkIfPanorama() { try { - val fis = FileInputStream(File(medium.path)) - context!!.parseFileChannel(medium.path, fis.channel, 0, 0, 0) { + val fis = FileInputStream(File(mMedium.path)) + context!!.parseFileChannel(mMedium.path, fis.channel, 0, 0, 0) { mIsPanorama = true } } catch (ignored: Exception) { @@ -173,7 +170,7 @@ class VideoFragment : ViewPagerFragment() { private fun openPanorama() { Intent(context, PanoramaVideoActivity::class.java).apply { - putExtra(PATH, medium.path) + putExtra(PATH, mMedium.path) startActivity(this) } } @@ -199,6 +196,8 @@ class VideoFragment : ViewPagerFragment() { private fun getExtendedDetailsY(height: Int): Float { val smallMargin = resources.getDimension(R.dimen.small_margin) - return context!!.realScreenSize.y.toFloat() - height - smallMargin + val fullscreenOffset = smallMargin + if (mIsFullscreen) 0 else context!!.navigationBarHeight + val actionsHeight = if (context!!.config.bottomActions && !mIsFullscreen) resources.getDimension(R.dimen.bottom_actions_height) else 0f + return context!!.realScreenSize.y - height - actionsHeight - fullscreenOffset } } 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 8c2545ff7..5153859ad 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 @@ -28,6 +28,8 @@ abstract class ViewPagerFragment : Fragment() { fun goToPrevItem() fun goToNextItem() + + fun launchViewVideoIntent(path: String) } fun getMediumExtendedDetails(medium: Medium): String { 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 1b479de80..c218dc78c 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 @@ -441,4 +441,8 @@ class Config(context: Context) : BaseConfig(context) { var showWidgetFolderName: Boolean get() = prefs.getBoolean(SHOW_WIDGET_FOLDER_NAME, true) set(showWidgetFolderName) = prefs.edit().putBoolean(SHOW_WIDGET_FOLDER_NAME, showWidgetFolderName).apply() + + var allowOneToOneZoom: Boolean + get() = prefs.getBoolean(ALLOW_ONE_TO_ONE_ZOOM, false) + set(allowOneToOneZoom) = prefs.edit().putBoolean(ALLOW_ONE_TO_ONE_ZOOM, allowOneToOneZoom).apply() } 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 16e61ddc8..d0c1d72e4 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 @@ -74,6 +74,7 @@ const val LAST_EDITOR_CROP_OTHER_ASPECT_RATIO_X = "last_editor_crop_other_aspect const val LAST_EDITOR_CROP_OTHER_ASPECT_RATIO_Y = "last_editor_crop_other_aspect_ratio_y" const val GROUP_DIRECT_SUBFOLDERS = "group_direct_subfolders" const val SHOW_WIDGET_FOLDER_NAME = "show_widget_folder_name" +const val ALLOW_ONE_TO_ONE_ZOOM = "allow_one_to_one_zoom" // slideshow const val SLIDESHOW_INTERVAL = "slideshow_interval" @@ -91,13 +92,15 @@ const val FAVORITES = "favorites" const val RECYCLE_BIN = "recycle_bin" const val SHOW_FAVORITES = "show_favorites" const val SHOW_RECYCLE_BIN = "show_recycle_bin" +const val SHOW_NEXT_ITEM = "show_next_item" +const val SHOW_PREV_ITEM = "show_prev_item" +const val GO_TO_NEXT_ITEM = "go_to_next_item" +const val GO_TO_PREV_ITEM = "go_to_prev_item" const val MAX_COLUMN_COUNT = 20 const val SHOW_TEMP_HIDDEN_DURATION = 300000L const val CLICK_MAX_DURATION = 150 const val DRAG_THRESHOLD = 8 const val MONTH_MILLISECONDS = MONTH_SECONDS * 1000L -const val HIDE_PLAY_PAUSE_DELAY = 500L -const val PLAY_PAUSE_VISIBLE_ALPHA = 0.8f const val MIN_SKIP_LENGTH = 2000 const val DIRECTORY = "directory" @@ -164,6 +167,7 @@ const val BOTTOM_ACTION_SHOW_ON_MAP = 256 const val BOTTOM_ACTION_TOGGLE_VISIBILITY = 512 const val BOTTOM_ACTION_RENAME = 1024 const val BOTTOM_ACTION_SET_AS = 2048 +const val BOTTOM_ACTION_COPY = 4096 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 3978d0a49..a5912edce 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 @@ -369,11 +369,6 @@ class MediaFetcher(val context: Context) { else -> o1.taken.compareTo(o2.taken) } - // do just a quick extra sorting if the original sorting is equal, does not need to be accurate in all cases - if (result == 0 && sorting and SORT_BY_NAME == 0 && sorting and SORT_BY_PATH == 0) { - result = o1.name.compareTo(o2.name) - } - if (sorting and SORT_DESCENDING != 0) { result *= -1 } diff --git a/app/src/main/res/drawable-hdpi/ic_next_outline.png b/app/src/main/res/drawable-hdpi/ic_next_outline.png new file mode 100644 index 000000000..88c0a34aa Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_next_outline.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_prev_outline.png b/app/src/main/res/drawable-hdpi/ic_prev_outline.png new file mode 100644 index 000000000..898c74d78 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_prev_outline.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_next_outline.png b/app/src/main/res/drawable-xhdpi/ic_next_outline.png new file mode 100644 index 000000000..e92ce5556 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_next_outline.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_prev_outline.png b/app/src/main/res/drawable-xhdpi/ic_prev_outline.png new file mode 100644 index 000000000..8c2c6774b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_prev_outline.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_next_outline.png b/app/src/main/res/drawable-xxhdpi/ic_next_outline.png new file mode 100644 index 000000000..f88b8d317 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_next_outline.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_prev_outline.png b/app/src/main/res/drawable-xxhdpi/ic_prev_outline.png new file mode 100644 index 000000000..b92feff7d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_prev_outline.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_next_outline.png b/app/src/main/res/drawable-xxxhdpi/ic_next_outline.png new file mode 100644 index 000000000..34fe17702 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_next_outline.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_prev_outline.png b/app/src/main/res/drawable-xxxhdpi/ic_prev_outline.png new file mode 100644 index 000000000..2e0a23b8b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_prev_outline.png differ diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 75d86d798..72de10803 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -795,6 +795,30 @@ + + + + + + @@ -35,7 +36,7 @@ android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" - android:layout_marginBottom="120dp" + android:layout_marginBottom="200dp" android:alpha="0" android:background="@drawable/black_rounded_background" android:gravity="center" @@ -46,6 +47,15 @@ android:textColor="@android:color/white" android:textSize="@dimen/extra_big_text_size"/> + + diff --git a/app/src/main/res/layout/bottom_actions.xml b/app/src/main/res/layout/bottom_actions.xml index 2cb308bbc..48bacf38d 100644 --- a/app/src/main/res/layout/bottom_actions.xml +++ b/app/src/main/res/layout/bottom_actions.xml @@ -137,8 +137,19 @@ android:background="?attr/selectableItemBackgroundBorderless" android:padding="@dimen/medium_margin" android:src="@drawable/ic_set_as" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toEndOf="@+id/bottom_copy" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/bottom_rename"/> + + diff --git a/app/src/main/res/layout/bottom_video_time_holder.xml b/app/src/main/res/layout/bottom_video_time_holder.xml index 69acead92..ec34b6501 100644 --- a/app/src/main/res/layout/bottom_video_time_holder.xml +++ b/app/src/main/res/layout/bottom_video_time_holder.xml @@ -5,8 +5,19 @@ android:id="@+id/video_time_holder" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentBottom="true" - android:background="@drawable/gradient_background"> + android:layout_alignParentBottom="true"> + + + + + + diff --git a/app/src/main/res/layout/fragment_holder.xml b/app/src/main/res/layout/fragment_holder.xml index d10a3a193..77f5953e7 100644 --- a/app/src/main/res/layout/fragment_holder.xml +++ b/app/src/main/res/layout/fragment_holder.xml @@ -10,6 +10,12 @@ android:layout_width="match_parent" android:layout_height="match_parent"/> + + diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 2f15a3572..3d9aa2dc2 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -120,6 +120,7 @@ حلقة عرض الشرائح انتهى عرض الشرائح لم يتم العثور على وسائط لعرض الشرائح + Use crossfade animations تغيير طريقة العرض @@ -174,6 +175,7 @@ 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 المصغرات @@ -194,7 +196,8 @@ كيف يمكنني جعل الألبوم يظهر دائمًا في الجزء العلوي؟ يمكنك الضغط لفترة طويلة على الألبوم المطلوب وتحديد أيقونة الدبوس في الإجراء ، والتي سوف تثبيته إلى الأعلى. يمكنك تثبيت عدة مجلدات أيضًا ، وسيتم ترتيب العناصر المثبتة حسب طريقة الفرز الافتراضية. كيف يمكنني تقديم مقاطع فيديو بسرعة؟ - يمكنك النقر على النصوص الحالية أو أقصى مدة قريبة من شريط السحب ، والتي ستنقل الفيديو إما للخلف أو إلى الأمام. + 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\" فارغ في المجلد المحدد ، والذي يمكنك بعد ذلك إزالته مع أي مدير ملفات أيضًا. لماذا تظهر المجلدات التي تحتوي على ملصقات أو ملصقات موسيقى تغطيها؟ diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index e12e2ee27..bf0b0aa1d 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -116,6 +116,7 @@ Loop slideshow The slideshow ended No media for the slideshow have been found + Use crossfade animations Change view type @@ -170,6 +171,7 @@ 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 Thumbnails @@ -191,7 +193,8 @@ How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actionmenu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. How can I fast-forward videos? - You can click on the current or max duration texts near the seekbar, that will move the video either backward, or forward. + 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. + 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. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 555fd7dbd..04b8538bb 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -116,6 +116,7 @@ Presentació de diapositives S\'ha acabat la presentació de diapositives No s\'han trobat mitjans per a la presentació de diapositives + Use crossfade animations Canviar el tipus de vista @@ -170,6 +171,7 @@ Mostra imatges amb la màxima qualitat possible Mostra la paperera de reciclatge com a últim element a la pantalla principal Permet tancar la vista de pantalla completa amb un gest avall + Allow 1:1 zooming in with two double taps Miniatures @@ -191,7 +193,8 @@ Com puc fer que un àlbum sempre aparegui a la part superior? Podeu prémer l\'àlbum desitjat i seleccionar la icona de la xinxeta al menú d\'acció i el fixarà a la part superior. També podeu enganxar diverses carpetes, els elements fixats s\'ordenaran pel mètode de classificació predeterminat. Com puc fer avançar els vídeos? - Podeu fer clic als textos actuals o de duració màxima que hi ha a prop de la barra de cerca, això mourà el vídeo cap a enrere o cap endavant. + 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. + Podeu fer clic als textos actuals o de duració màxima que hi ha a prop de la barra de cerca, això mourà el vídeo cap a enrere o cap endavant. Quina és la diferència entre ocultar i excloure una carpeta? Excloure impedeix mostrar la carpeta només a Simple Galery, mentre que Ocultar també amaga la carpeta a altres galeries. Funciona creant un fitxer \". Nomedia \" buit a la carpeta donada, que podeu eliminar amb qualsevol gestor de fitxers. Per què apareixen les carpetes amb les portades de la música o adhesius? diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index b27b77b50..473005bc5 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -116,6 +116,7 @@ Smyčková prezentace Prezentace skončila Nebyla nalezena žádná média pro prezentaci + Use crossfade animations Změnit typ zobrazení @@ -170,6 +171,7 @@ Zobrazit obrázky v nejlepší možné kvalitě Zobrazit odpadkový koš jako poslední položku na hlavní obrazovce Povolit zavírání celoobrazovkového režimu tažením prstu dolů + Allow 1:1 zooming in with two double taps Náhledy @@ -191,7 +193,8 @@ Jak můžu dosáhnout, aby bylo dané album stále zobrazeno první? Můžete označit danou složku dlouhým podržením a zvolit tlačítko s obrázkem připínáčku, to jej připne na vrch. Můžete připnout i více složek, budou seřazeny podle zvoleného řazení. Jak můžu rychle posunout videa? - Můžete kliknout na texty současné nebo maximální délky videa, které jsou vedle indikátoru současného progresu. To posune video buď vpřed, nebo vzad. + 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. + Můžete kliknout na texty současné nebo maximální délky videa, které jsou vedle indikátoru současného progresu. To posune video buď vpřed, nebo vzad. Jaký je rozdíl mezi Skrytím a Vyloučením složky? Zatímco vyloučení předejde zobrazení složky pouze vrámci Jednoduché Galerie, skrytí ho ukryje vrámci celého systému, tedy to ovlivní i ostatní galerie. Skrytí funguje pomocí vytvoření prázdného \".nomedia\" souboru v daném adresáři, který můžete vymazat i nějakým správcem souborů. Proč se mi zobrazují složky s obaly hudebních alb, nebo nálepkami? diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 059977161..f343b3e35 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -116,6 +116,7 @@ Endeløs kørsel Slideshowet endte Der blev ikke funket nogen mediefiler til slideshowet + Use crossfade animations Skift visning @@ -161,15 +162,16 @@ Administrer udvidede oplysninger Tillad zoom med en finger når medier er i fuldskærm Tillad skift af medie ved klik på skærmens sider - Allow deep zooming images + Tillad dyb zooming af billeder Skjul udvidede oplysninger når statuslinjen er skjult Tjek en ekstra gang for at undgå visning af ugyldige filer Vis handlingsknapper i bunden af skærmen Vis papirkurven ved mappevisning - Deep zoomable images + Dybt zoombare billeder Vis billeder i den højst mulige kvalitet Vis papirkurven som sidste element på hovedskærmen - Allow closing the fullscreen view with a down gesture + Luk fuldskærmsvisning ved at swipe ned + Tillad 1:1 zooming med to dobbelttryk Miniaturer @@ -191,7 +193,8 @@ How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actionmenu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. How can I fast-forward videos? - You can click on the current or max duration texts near the seekbar, that will move the video either backward, or forward. + 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. + 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. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ddae898bf..e5eea5b16 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -116,6 +116,7 @@ Endlos abspielen Diashow beendet. Keine Medien für Diashow gefunden. + Use crossfade animations Darstellung ändern @@ -170,6 +171,7 @@ Zeige Bilder in der höchstmöglichen Qualität Zeige den Papierkorb als letztes Element auf dem Hauptbildschirm Erlaube das Schließen der Vollbildansicht mit einer Abwärtsgeste + Allow 1:1 zooming in with two double taps Thumbnails @@ -191,7 +193,8 @@ Wie kann ich ein Album immer zuoberst erscheinen lassen? Du kannst lange auf das gewünschte Album drücken und im Aktionsmenü das Stecknadelsymbol auswählen; es wird nun zuoberst angepinnt. Ebenso kannst du mehrere Ordner anpinnen. Angepinnte Objekte werden nach der Standardmethode sortiert. Wie kann ich in Videos vor- oder zurückspringen? - Du kannst auf den Text der aktuellen oder der maximalen Dauer nahe der Suchleiste drücken, um im Video vor- oder zurück zu springen. + 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. + Du kannst auf den Text der aktuellen oder der maximalen Dauer nahe der Suchleiste drücken, um im Video vor- oder zurück zu springen. Was ist der Unterschied zwischen \'Verstecken\' und \'Ausschließen\' eines Ordners? \'Ausschließen\' verhindert lediglich, dass der Ordner in Schlichte Galerie angezeigt wird. \'Verstecken\' hingegen versteckt den Ordner auch vor anderen Apps. Dies funktioniert durch das Erstellen einer leeren \".nomedia\"-Datei im betroffenen Ordner, welche du mit jedem Dateimanager wieder löschen kannst. Wieso erscheinen Ordner mit Musik-Cover oder Stickers? diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index bec488bcf..557603bd7 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -116,6 +116,7 @@ Επανάληψη εμφάνισης διαφανιών Η εμφάνιση διαφανειών τελείωσε Δεν βρέθηκαν πολυμέσα για την εμφάνιση διαφανειών + Use crossfade animations Αλλαγή τύπου εμφάνισης @@ -170,6 +171,7 @@ Εμφάνιση εικόνων με την υψηλότερη δυνατή ποιότητα Εμφάνιση του Κάδου ως τελευταίο στοιχείο στην κύρια οθόνη Επιτρέψτε το κλείσιμο προβολής πλήρους οθόνης με χειρονομία προς τα κάτω + Allow 1:1 zooming in with two double taps Εικονίδια @@ -191,7 +193,8 @@ Πώς μπορώ να κάνω ένα άλμπουμ να φαίνεται στην κορυφή; Μπορείτε να πατήσετε παρατεταμένα στο άλμπουμ και να επιλέξετε το εικονίδιο καρφιτσώματος στο μενού, αυτό θα το καρφιτσώσει στην κορυφή. Επίσης μπορείτε να καρφιτσώσετε πολλαπλούς φακέλους, τα καρφιτσωμένα αντικείμενα θα είναι ταξινομημένα με την προεπιλεγμένη μέθοδο. Πώς μπορώ να τρέξω μπροστά (fast-forward) τα βίντεο; - Μπορείτε να αγγίξετε στο τρέχον ή στο κείμενο μέγιστης διάρκειας κοντά στην μπάρα αναζήτησης. Αυτό θα μετακινήσει το βίντεο μπροστά ή πίσω. + 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. + Μπορείτε να αγγίξετε στο τρέχον ή στο κείμενο μέγιστης διάρκειας κοντά στην μπάρα αναζήτησης. Αυτό θα μετακινήσει το βίντεο μπροστά ή πίσω. Ποια είναι διαφορά μεταξύ απόκρυψης και εξαίρεσης ενός φακέλου; Η εξαίρεση δεν επιτρέπει την εμφάνιση του φακέλου μόνο στο Simple Gallery, ενώ η απόκρυψη λειτουργεί σε επίπεδο συστήματος και θα αποκρύψει τον φάκελο και από άλλες εφαρμογές γκάλερι. Λειτουργεί δημιουργώντας ένα άδειο \".nomedia\" αρχείο στον επιλεγμένο φάκελο, το οποίο μπορείτε να το διαγράψετε και με οποιονδήποτε διαχειριστή αρχείων. Γιατί εμφανίζονται φάκελοι με εξώφυλλο μουσικής ή αυτόκολλητα; diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 16787f52d..a4ff72ed6 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -116,6 +116,7 @@ Presentación de diapositivas La diapositiva terminó No se han encontrado medios para la presentación de diapositivas + Use crossfade animations Cambiar tipo de vista @@ -170,6 +171,7 @@ Muestra imágenes con la mayor calidad posible Mostrar la Papelera de reciclaje como el último elemento en la pantalla principal Permite cerrar la vista de pantalla completa con un gesto hacia abajo. + Allow 1:1 zooming in with two double taps Miniaturas @@ -191,7 +193,8 @@ ¿Cómo puedo hacer que un álbum siempre aparezca en la parte superior? Puede aguantar pulsado el álbum deseado y seleccionar el ícono Pin en el menú de acción, que lo fijará en la parte superior. También puede anclar varias carpetas, los artículos fijados se ordenarán por el método de clasificación predeterminado. ¿Cómo puedo avanzar videos? - Puede hacer clic en los textos de duración actual o máxima cerca de la barra de búsqueda, que moverán el video hacia atrás o hacia adelante. + 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. + Puede hacer clic en los textos de duración actual o máxima cerca de la barra de búsqueda, que moverán el video hacia atrás o hacia adelante. ¿Cuál es la diferencia entre ocultar y excluir una carpeta? Excluir evita mostrar la carpeta solo en Simple Gallery, mientras que Ocultar funciona en el sistema y oculta la carpeta de otras galerías también. Funciona al crear un archivo \".nomedia \" vacío en la carpeta determinada, que luego puede eliminar también con cualquier administrador de archivos. ¿Por qué aparecen las carpetas con la portada de la música o las pegatinas? diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 5575db260..012074dbb 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -116,6 +116,7 @@ Jatkuva diaesitys Diaesitys päättyi Mediaa diaesitykseen ei löytynyt + Use crossfade animations Vaihda näkymää @@ -170,6 +171,7 @@ 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 Esikatselukuvat @@ -191,7 +193,8 @@ How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actionmenu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. How can I fast-forward videos? - You can click on the current or max duration texts near the seekbar, that will move the video either backward, or forward. + 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. + 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. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 89d4c2a6c..7a9554894 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -116,6 +116,7 @@ Diaporama en boucle Diaporama terminé Aucun média trouvé pour le diaporama + Use crossfade animations Changer de mode d\'affichage @@ -170,6 +171,7 @@ Afficher les images avec la meilleur qualité possible Afficher la corbeille en dernière place sur l\'écran principal Fermeture de la vue plein écran par un geste vers le bas + Allow 1:1 zooming in with two double taps Miniatures @@ -190,7 +192,8 @@ Comment faire pour qu\'un album soit toujours affiché tout en haut ? Vous devez simplement à effectuer un appui prolongé sur l\'album en question et choisir l\'icône \"Épingler\" dans le menu d\'actions. Vous pouvez en épingler plusieurs. Les éléments épinglés seront alors triés selon l\'ordre par défaut. Comment avancer rapidement dans les vidéos ? - Vous pouvez appuyer sur la durée actuelle ou totale de la vidéo sur la barre de progression, la vidéo reculera ou avancera selon votre choix. + 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. + Vous pouvez appuyer sur la durée actuelle ou totale de la vidéo sur la barre de progression, la vidéo reculera ou avancera selon votre choix. Quelle est la différence entre masquer et exclure un dossier ? \"Exclure un dossier\" permet de ne pas l\'afficher uniquement dans Simple Gallery, alors que \"Masquer un dossier\" rend le dossier invisible sur l\'ensemble de l\'appareil, y compris les autres applications de galerie. Dans le dernier cas, un fichier \".nomedia\" est créé dans le dossier masqué, et peut être supprimé avec n\'importe quel explorateur de fichiers. Pourquoi des dossiers avec des pochettes d\'albums musicaux ou des miniatures d\'images sont affichés ? diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 919d02c66..df63a45aa 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -116,6 +116,7 @@ Reproducir en bucle Rematou a presentación Non se atoparon medios para a presentación + Use crossfade animations Cambiar o tipo de vista @@ -170,6 +171,7 @@ 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 Iconas @@ -191,7 +193,8 @@ Cómo podo facer que un álbume apareza sempre arriba de todo? Pode manter premido o álbume e escoller a icona de Fixar no menú de accións, esto fixarao arriba. Pode fixar varios cartafoles tambén, os elementos fixados estarán ordenados polo criterio por omisión. Cómo podo aumentar a velocidade de reprodución de vídeo? - Pode pulsar no texto de duración actual ou máxima preto da barra de busca, esto moverá ou vídeo hacia adiante ou atrás. + 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. + Pode pulsar no texto de duración actual ou máxima preto da barra de busca, esto moverá ou vídeo hacia adiante ou atrás. Cal é a diferenza entre agochar e excluír un cartafol? A Exclusión prevén que se mostre o cartafol só en Simple Gallery, mentras Agochar funciona para todo o sistema e agocha o cartafol para outras galerías tamén. Esto funciona creando un ficheiro baldeiro de nome \".nomedia\" no cartafol, que tamén pode quitar con calquer xestor de ficheiros. Por qué aparecen cartafoles de música con portadas ou pegatinas? diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index b7452023b..205680116 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -30,7 +30,7 @@ Koristi zadanu orijentaciju slike Ispravi vrijednost datuma snimanja Popravljam… - Dates fixed successfully + Datumi uspješno popravljeni Filtriranje medija @@ -89,7 +89,7 @@ Okreni vertikalno Uredi pomoću Slobodan odabir - Other + Ostalo Jednostavna pozadina @@ -116,6 +116,7 @@ Prikaži dijaprojekciju kao petlju Kraj dijaprojekcije Nema datoteka za dijaprojekciju + Koristi prijelazne animacije Promijeni vrstu prikaza @@ -133,18 +134,18 @@ Vrsta datoteke - Folder shown on the widget: - Show folder name + Mapa prikazana na widgetu: + Prikaži naziv mape Automatsko pokretanje videa - Remember last video playback position + Zapamti poziciju zadnjeg reproduciranog videozapisa Uključi prikaz naziva datoteka Ponavljanje videa Prikaz animacije GIF-ova na sličicama Maksimalna svjetlina pri pregledu datoteka Izreži sličice u kvadrate - Show video durations + Prikaži trajanje videozapisa Rotiraj datoteku u punom zaslonu za Postavke sustava Rotacija uređaja @@ -161,15 +162,16 @@ Upravljaj proširenim pojedinostima Omogući zumiranje jednim prstom na mediju cijelog zaslona Dopusti trenutačno mijenjanje medija dodirom na stranice zaslona - Allow deep zooming images + Omogućite duboko zumiranje slika Sakrij proširene pojedinosti kada je traka statusa skrivena Napravite dodatnu provjeru da biste izbjegli prikazivanje nevažećih datoteka - Pokažite neke gumbe za radnju pri dnu zaslona + Prikaži neke gumbe za radnju pri dnu zaslona Prikažite koš za smeće na zaslonu mapa - 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 + Duboko zumirane slike + Prikaži slike u najvišoj mogućoj kvaliteti + Prikaži koš za smeće kao posljednju stavku na glavnom zaslonu + Omogućite zatvaranje prikaza preko cijelog zaslona pokretom prema dolje + Dopusti zumiranje 1: 1 s dva dvostruka dodira Sličice @@ -191,7 +193,8 @@ Kako postići da je album uvijek na vrhu? Dugo pritisnute željeni album i odaberite ikonu igle na akcijskom izborniku, koji će ga pričvrstiti na vrh. Možete prikvačiti više mapa odjednom, prikvačene stavke će biti razvrstane prema zadanom načinu razvrstavanja. Kako mogu ubrzati video? - Možete pritisnuti trenutačno vrijeme ili ukupno trajanje videozapisa na traci napretka, videozapis će se prema Vašem izboru pomicati unatrag ili prema naprijed. + 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. + Možete pritisnuti trenutačno vrijeme ili ukupno trajanje videozapisa na traci napretka, videozapis će se prema Vašem izboru pomicati unatrag ili prema naprijed. Koja je razlika između skrivanja i izuzimanja mape? Izuzimanje sprječava prikaz mape samo u Jednostavnoj galeriji, a skrivanje radi na razini sustava i skriva mapu iz drugih galerija. Djeluje stvaranjem praznih \".nomedia\" datoteka u zadanoj mapi, koju možete ukloniti pomoću bilo kojeg upraviteljem datoteka. Zašto se prikazuju mape s naslovnicama albuma i minijaturama slika? @@ -209,40 +212,40 @@ Naravno, koristeći stavku izbornika \"Grupiraj po\" u prikazu sličica. Možete grupirati datoteke prema više kriterija, uključujući datum snimanja. Ako koristite funkciju "Prikaži sve sadržaje mape", možete ih grupirati i mapama. Sortiranje po datumu nije točno, kako to mogu ispraviti? Vjerojatno uzrok tome da su Vaše slike kopirane s drugih mjesta. U tom slučaju trebali biste dugo dodirnuti sličice prikazanih slika, a zatim u izborniku u gornjem desnom kutu, odabrati funkciju \'Ispravi vrijednost datuma snimanja\'. - 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. + Vidim nekakvno preklapanje boja na slikama. Kako mogu poboljšati kvalitetu? + Trenutno rješenje za prikazivanje slika dobro funkcionira u velikoj većini slučajeva, ali ako želite još bolju kvalitetu slike, možete omogućiti prikazivanje slika u najvišoj mogućoj kvaliteti u postavkama aplikacije, u odjeljku "Duboko zumirane slike". + Sakrio sam datoteku/mapu. Kako je mogu otkriti? + Možete pritisnuti stavku izbornika "Privremeno prikazati skrivene stavke" na glavnom zaslonu ili uključiti "Prikaži skrivene stavke" u postavkama aplikacije da biste vidjeli skrivenu stavku. Ako je želite otkriti, samo ju dugo pritisnite i odaberite "Otkrij". Mape su skrivene dodavanjem skrivene datoteke ".Nomedia", možete i izbrisati navedenu datoteku. - An offline gallery for managing your files without ads, respecting your privacy. + Izvanmrežna galerija za upravljanje datotekama,bez oglasa,poštujući privatnost. - A highly customizable gallery capable of displaying many different image and video types including SVGs, RAWs, panoramic photos and videos. + Vrlo prilagodljiva galerija koja može prikazivati različite vrste slika i videozapisa, uključujući SVG-ove, RAW-ove, panoramske fotografije i videozapise. - It is open source, contains no ads or unnecessary permissions. + Otvorenog je koda, ne sadrži oglase ili nepotrebna dopuštenja. - Let\'s list some of its features worth mentioning: - 1. Search - 2. Slideshow - 3. Notch support - 4. Pinning folders to the top - 5. Filtering media files by type - 6. Recycle bin for easy file recovery - 7. Fullscreen view orientation locking - 8. Marking favorite files for easy access - 9. Quick fullscreen media closing with down gesture - 10. An editor for modifying images and applying filters - 11. Password protection for protecting hidden items or the whole app - 12. Changing the thumbnail column count with gestures or menu buttons - 13. Customizable bottom actions at the fullscreen view for quick access - 14. Showing extended details over fullscreen media with desired file properties - 15. Several different ways of sorting or grouping items, both ascending and descending - 16. Hiding folders (affects other apps too), excluding folders (affects only Simple Gallery) + Navedimo neke od značajki koje vrijedi spomenuti: + 1. Pretraživanje + 2. Dijaprojekcija + 3. Podrška za notch + 4. Pričvršćivanje mapa na vrh + 5. Filtriranje medijskih datoteka prema vrsti + 6. Koš za smeće za jednostavan oporavak datoteke + 7. Zaključavanje prikaza na cijelom zaslonu + 8. Označavanje omiljenih datoteka radi lakog pristupa + 9. Brzi mediji na cijelom zaslonu zatvaraju se pokretom prema dolje + 10. Urednik za izmjenu slika i primjenu filtara + 11. Zaštita lozinkom za zaštitu skrivenih stavki ili cijele aplikacije + 12. Promjena broja stupaca minijatura pomoću pokreta ili gumba izbornika + 13. Prilagodljive akcije na dnu cijelog zaslona za brzi pristup + 14. Prikazivanje proširenih detalja preko medija, preko cijelog zaslona sa željenim svojstvima datoteke + 15. Nekoliko različitih načina razvrstavanja ili grupiranja stavki, kako rastućih tako i silaznih + 16. Skrivanje mapa (utječe i na druge aplikacije), izuzimanje mapa (utječe samo na jednostavnu galeriju) - The fingerprint permission is needed for locking either hidden item visibility, the whole app, or protecting files from being deleted. + Dopuštenje za otisak prsta potreban je za zaključavanje vidljivosti skrivenih stavki, cijele aplikacije ili za zaštitu datoteka od brisanja. - This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com + Ova je aplikacija samo dio većeg broja aplikacija. Možete pronaći ostatak na https://www.simplemobiletools.com Nézet típus változtatása @@ -171,6 +172,7 @@ Mutassa a képeket a lehető legjobb minőségben Mutassa a Lomtárat a fő képernyő utolsó elemeként Engedélyezi a teljes képernyős nézetet a lefelé mozdulattal + Engedélyezi az 1:1 nagyítást két dupla érintéssel Miniatűrök @@ -192,7 +194,8 @@ A következő alkalommal, amikor megpróbál megnyitni egy képet vagy videót, Hogyan állíthatok be egy albumot úgy, hogy mindig felül legyen? Hosszan nyomja meg a kívánt albumot, és válassza ki a Kitűzés ikont a művelet menüben, ami rögzíti felülre. Többféle mappát is kitűzhet, ezeket az elemeket az alapértelmezett rendezési mód szerint rendezi. Hogyan tudom előre tekerni a videókat? - A keresősáv közelében lévő aktuális vagy maximális időtartamú szövegekre kattintva előre vagy hátra mozgathatja a videót. + Húzhatja az ujját vízszintesen a videolejátszón, vagy kattintson az aktuális vagy a max. időtartam szövegekre a keresősáv közelében. Ez visszafelé vagy előre mozgatja a videót. + Húzhatja az ujját vízszintesen a videolejátszón, vagy kattintson az aktuális vagy a max. időtartam szövegekre a keresősáv közelében. Ez visszafelé vagy előre mozgatja a videót. Mi a különbség a mappa elrejtése és kizárása között? A Kizárás megakadályozza, hogy a mappát a Simple Gallery megjelenítse, az Elrejtés pedig rendszer szinten működik, és elrejti a mappát más galériákból is. Úgy működik, hogy létrehoz egy üres \". nomedia\" nevű fájlt az adott mappában, amelyet bármikor eltávolíthat bármilyen fájlkezelővel is. Miért jelennek meg a zenei borítóval vagy matricával rendelkező mappák? @@ -217,7 +220,7 @@ Ezzel csak a kiválasztott mappák láthatók, mivel a kizárás és a befoglal - An offline gallery for managing your files without ads, respecting your privacy. + Egy offline galéria a fájlok hirdetés nélküli kezelésére. Nagyon testreszabható galéria, amely alkalmas számos különböző kép- és videotípus megjelenítésére, beleértve az SVG-ket, RAW-t, panorámaképeket és videókat. diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 9bf419404..2b4c0c882 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -116,6 +116,7 @@ Slideshow tanpa henti Slideshow berakhir Tidak ditemukan media untuk slideshow + Use crossfade animations Ubah jenis tampilan @@ -170,6 +171,7 @@ Tampilkan gambar dalam kualitas tertinggi Tampilkan Sampah sebagai item terakhir di layar utama Izinkan keluar dari layar penuh dengan menggeser kebawah + Allow 1:1 zooming in with two double taps Thumbnail @@ -191,7 +193,8 @@ Bagaimana agar sebuah album selalu muncul paling atas di daftar? Anda bisa menekan lama album tersebut dan pilih ikon Pin di menu tindakan, itu akan menaruhnya di atas daftar. Anda juga bisa menyematkan beberapa folder, item yang di-pin akan diurutkan berdasarkan metode urutan default. Bagaimana cara mempercepat laju video? - Anda bisa mengklik teks durasi saat ini/maksimal di dekat penggeser durasi, itu akan memajukan atau memundurkan video. + 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. + Anda bisa mengklik teks durasi saat ini/maksimal di dekat penggeser durasi, itu akan memajukan atau memundurkan video. Apa perbedaan antara menyembunyikan dan mengecualikan folder? Mengecualikan tidak akan menampilkan folder di Simple Gallery, sedangkan Sembunyikan bekerja sesuai aturan sistem dan akan menyembunyikan folder juga dari aplikasi galeri yang lain. Cara kerjanya dengan membuat file \".nomedia\" kosong pada folder yang diinginkan, yang bisa Anda hapus juga dengan aplikasi file manager. Mengapa folder dengan gambar album musik atau stiker muncul? diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index ba7f48e3b..080359793 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -116,6 +116,7 @@ Ripeti presentazione La presentazione è terminata Nessun file trovato per la presentazione + Usa le animazioni in dissolvenza Cambia modalità visualizzazione @@ -170,6 +171,7 @@ Mostra le immagini alla massima qualità possibile Mostra il cestino come ultimo elemento nella schermata principale Chiudi la visuale a schermo intero con un gesto verso il basso + Permetti l\'ingrandimento 1:1 con un doppio tasto Anteprime @@ -191,7 +193,8 @@ Come posso fare apparire un album sempre in cima? Si può toccare a lungo l\'album desiderato e selezionare l\'icona puntina nel menù azioni, ciò lo fisserà in cima. Si possono anche fissare varie cartelle, gli elementi fissati saranno ordinati dal metodo di ordinamento predefinito. Come avanzo velocemente nei video? - Si può cliccare sui testi di durata attuale o massima vicino alla barra di avanzamento, ciò avanzerà o riavvolgerà il video. + Si possono trascinare le proprie dita orrizontalmente sul video, oppure cliccando i testi accanto alla barra di avanzamento. In questo modo il video andrà avanti o indietro. + Si può cliccare sui testi di durata attuale o massima vicino alla barra di avanzamento, ciò avanzerà o riavvolgerà il video. Che differenza c\'è tra nascondere ed escludere una cartella? Escludere impedisce la visualizzazione della cartella solo in Semplice Galleria, mentre nascondere ha effetto in tutto il sistema e nasconde la cartella anche alle altre gallerie. Funziona creando un file vuoto \".nomedia\" nella cartella in questione, si possono anche rimuovere successivamente con qualsiasi gestore dei file. Perchè vengono mostrate cartelle con copertine o adesivi di musica? @@ -222,7 +225,6 @@ L\'applicazione non contiene pubblicità o permessi non necessari; è completamente opensource e la si può personalizzare con i propri colori preferiti. - Alcune funzionalità che vale la pena accennare: 1. Ricerca 2. Presentazione diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 635c0759c..82a57ac7d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -116,6 +116,7 @@ スライドショーをリピート再生する スライドショーが終了しました スライドショーに表示するメディアがありません + Use crossfade animations 表示形式の変更 @@ -170,6 +171,7 @@ 可能な限り高品質で画像を表示 ごみ箱をメイン画面の最後に表示 Allow closing the fullscreen view with a down gesture + Allow 1:1 zooming in with two double taps サムネイル設定 @@ -191,7 +193,8 @@ How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actionmenu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. 動画を早送りするにはどうすればよいですか? - シークバーの隣にある経過時間または最大時間の表示を押すごとに早送り、または巻き戻しが作動します。 + 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. + シークバーの隣にある経過時間または最大時間の表示を押すごとに早送り、または巻き戻しが作動します。 What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 440a533b6..143ab2f23 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -116,6 +116,7 @@ 슬라이드 쇼 반복 슬라이드 쇼 종료 슬라이드 쇼를 위한 미디어를 찾을 수 없음 + Use crossfade animations 보기방식 변경 @@ -170,6 +171,7 @@ 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 섬네일 @@ -191,7 +193,8 @@ How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actionmenu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. How can I fast-forward videos? - You can click on the current or max duration texts near the seekbar, that will move the video either backward, or forward. + 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. + 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. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index bdaefa6bb..0e5945bae 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -116,6 +116,7 @@ Klipuoti skaidrių demonstraciją Skaidrių demonstracija pasibaigė Nerasta medijos skaidrių demonstracijai + Use crossfade animations Keisti peržiūros tipą @@ -170,6 +171,7 @@ 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 Miniatiūros @@ -191,7 +193,8 @@ Kaip aš galiu padaryti albumą visada rodomą viršuje? Galite ilgai paspausti norimą albumą ir pasirinkti "Prisegti" piktogramą, esančią meniu "Veiksmo meniu", viršuje. Galite prisegti kelis aplankus, prisegti elementai bus rūšiuojami pagal numatytąjį rūšiavimo metodą. Kaip galėčiau greitai prasukti vaizdo įrašus? - Galite spustelėti tekstus šalia slinkties juostos, kad būtų perkeltas vaizdo įrašas atgal arba į priekį. + 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. + Galite spustelėti tekstus šalia slinkties juostos, kad būtų perkeltas vaizdo įrašas atgal arba į priekį. Koks skirtumas tarp slėpimo ir išskyrimo iš aplanko? Išskyrimas neleidžia rodyti aplanko tik paprastoje galerijoje, tuo tarpu slėpimas slepia aplanką iš kitų galerijų. Tai veikia, sukuriant tuščią \ ". Nomedia \" bylą tam tikrame aplanke, kurį vėliau galite pašalinti bet kuria bylų tvarkykle. Kodėl pasirodo aplankai su muzikos viršeliu ar lipdukais? diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 04ff031ca..ba6a24e90 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -89,7 +89,7 @@ Speilvend vertikalt Rediger med Fri - Other + Annen Bakgrunnsbilde @@ -116,6 +116,7 @@ Gjenta lysbildeshow Lysbildeshowet er slutt Ingen media for lysbildeshowet er funnet + Bruk krysstoningsanimasjon Endre visningstype @@ -133,8 +134,8 @@ Endelse - Folder shown on the widget: - Show folder name + Mappe vist på modulen: + Vis mappenavn Avspill videoer automatisk @@ -170,6 +171,7 @@ Vis bilder i høyest mulig kvalitet Vis papirkurven som siste element på hovedskjermen Tillat lukking av mediavisningen med en nedoverbevegelse + Tillat å zoome 1:1 med to dobbeltrykk Minibilder @@ -191,7 +193,8 @@ How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actionmenu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. How can I fast-forward videos? - You can click on the current or max duration texts near the seekbar, that will move the video either backward, or forward. + 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. + 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. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index efab9aca5..6aa91343e 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -116,6 +116,7 @@ Voorstelling herhalen De diavoorstelling is beëindigd Geen media gevonden voor diavoorstelling + Crossfade-animaties gebruiken Weergave @@ -170,6 +171,7 @@ Afbeeldingen in de hoogst mogelijke kwaliteit weergeven Prullenbak als laatste item tonen Naar beneden vegen om volledig scherm af te sluiten + 1:1 zoomen na 2x dubbelklikken Miniatuurvoorbeelden @@ -191,7 +193,8 @@ How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actionmenu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. How can I fast-forward videos? - You can click on the current or max duration texts near the seekbar, that will move the video either backward, or forward. + 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. + 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. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index fa1b6654f..f1414d43c 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -116,6 +116,7 @@    Zapętlaj Pokaz slajdów zakończony Nie znalazłem multimediów do pokazu slajdów + Use crossfade animations    Zmień typ widoku @@ -170,6 +171,7 @@ Pokazuj obrazy w najwyższej możliwej rozdzielczości Pokazuj kosz jako ostatni element na głównym ekranie Zezwalaj na zamykanie pełnoekranowego widoku gestem pociągnięcia w dół + Allow 1:1 zooming in with two double taps    Miniatury @@ -190,7 +192,8 @@    Jak sprawić, aby album(y) zawsze pojawiał(y) się na górze?    Przytrzymaj album(y) i wybierz ikonę przypięcia w pasku akcji.    Jak mogę przwijać filmy? -    Kliknij na napisie z czasem trwania filmu, bądź tym z obecnym momentem filmu. + 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. +    Kliknij na napisie z czasem trwania filmu, bądź tym z obecnym momentem filmu.    Jaka jest różnica między ukryciem, a wykluczeniem folderu?    Wykluczenie działa tylko w obrębie niniejszej aplikacji (wszędzie indziej pliki są normalnie widoczne), ukrywanie - w obrębie całego systemu (nie widać ich nigdzie), dodawany jest wtedy do folderu pusty plik \'.nomedia\', który możesz usunąć w dowolnym menedżerze plików.    Dlaczego pokazują mi się foldery z okładkami do piosenek i tym podobne rzeczy? diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index cb3587889..4e5ac0160 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -116,6 +116,7 @@ Apresentação em ciclo Fim da apresentação Nenhuma mídia encontrada para a apresentação + Use crossfade animations Alterar modo de visualização @@ -170,6 +171,7 @@ 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 Miniaturas @@ -191,7 +193,8 @@ How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actionmenu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. How can I fast-forward videos? - You can click on the current or max duration texts near the seekbar, that will move the video either backward, or forward. + 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. + 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. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index c3932e292..761f3a251 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -116,6 +116,7 @@ Apresentação em ciclo Apresentação terminada Não foram encontrados ficheiros para a apresentação + Use crossfade animations Tipo de exibição @@ -170,6 +171,7 @@ Mostrar fotos com a melhor qualidade possível Mostrar a reciclagem como o último item do ecrã principal Sair de ecrã completo com um gesto para baixo + Allow 1:1 zooming in with two double taps Miniaturas @@ -191,7 +193,8 @@ How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actionmenu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. How can I fast-forward videos? - You can click on the current or max duration texts near the seekbar, that will move the video either backward, or forward. + 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. + 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. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f4cea6eb6..98a841dd5 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -116,6 +116,7 @@ Зациклить Слайдшоу завершилось Медиафайлов для слайдшоу не найдено + Use crossfade animations Вид @@ -170,6 +171,7 @@ Показывать изображения с максимально высоким качеством Показывать корзину как последний элемент на главном экране Выходить из полноэкранного режима жестом вниз + Allow 1:1 zooming in with two double taps Миниатюры @@ -191,7 +193,8 @@ Как я могу сделать альбом всегда отображающимся сверху? Вы можете длительным нажатием на желаемый альбом открыть меню действий в нём выбрать пункт \"Закрепить\". Можно закрепить несколько альбомов (папок); прикреплённые элементы будут отсортированы по методу сортировки по умолчанию. Как ускорить перемотку видео? - Вы можете нажать на цифры текущего положения или максимальной длительности видео рядом с панелью поиска, что приведёт к перемещению позиции воспроизведения либо назад, либо вперёд. + 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. + Вы можете нажать на цифры текущего положения или максимальной длительности видео рядом с панелью поиска, что приведёт к перемещению позиции воспроизведения либо назад, либо вперёд. В чём разница между скрытием и исключением папки? Исключение запрещает отображение папки только в Simple Gallery, в то время как скрытие работает системно и скрывает папку из других галерей. Это достигается путём создания пустого файла \".nomedia\" в данной папке, который впоследствии можно удалить любым файловым менеджером. Почему отображаются папки с музыкальными обложками? diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 604d715f8..f8c929574 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -116,6 +116,7 @@ Automaticky reštartovať prezentáciu Prezentácia skončila Pre prezentáciu sa nenašli žiadne vhodné súbory + Použiť prelínacie animácie Zmeniť typ zobrazenia @@ -170,6 +171,7 @@ Zobrazovať obrázky v najlepšej možnej kvalite Zobraziť odpadkový kôš ako poslednú položku na hlavnej obrazovke Povoliť zatváranie celoobrazovkového režimu potiahnutím prsta dole + Povoliť 1:1 priblíženie dvojnásobným dvojklikom Náhľady @@ -191,7 +193,8 @@ Ako môžem dosiahnuť, aby bol daný album stále zobrazený prvý? Môžete označiť daný priečinok dlhým podržaním a zvoliť tlačidlo s obrázkom pripinačky, to ho pripne na vrch. Môžete pripnúť aj viacero priečinkov, budú zoradené podľa zvoleného radenia. Ako viem posunúť video vpred? - Môžete kliknúť na texty súčasnej, alebo maximálnej dĺžky videa, ktoré sú vedľa indikátora súčasného progresu. To posunie video buď vpred, alebo vzad. + Môžete to dosiahnuť vodorovným potiahnutím prsta cez video prehrávač, alebo kliknúť na texty súčasnej, alebo maximálnej dĺžky videa, ktoré sú vedľa indikátora súčasného progresu. To posunie video buď vpred, alebo vzad. + Môžete kliknúť na texty súčasnej, alebo maximálnej dĺžky videa, ktoré sú vedľa indikátora súčasného progresu. To posunie video buď vpred, alebo vzad. Aký je rozdiel medzi Skrytím a Vylúčením priečinka? Kým vylúčenie predíde zobrazeniu priečinka iba vrámci Jednoduchej Galérie, skrytie ho ukryje vrámci celého systému, teda to ovplyvní aj ostatné galérie. Skrytie funguje pomocou vytvorenia prázdneho \".nomedia\" súboru v danom priečinku, ktorý viete vymazať aj nejakým správcom súborov. Prečo sa mi zobrazujú priečinky s obalmi hudobných albumov, alebo nálepkami? diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index fe0e6a3f4..8be442876 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -116,6 +116,7 @@ Ponavljaj diaprojekcijo Diaprojekcija se je zaključila Ne najdem datotek za diaprojekcijo + Use crossfade animations Spremeni tip pogleda @@ -170,6 +171,7 @@ Prikaži slike v največji možni kvaliteti Prikaži Koš kot zadnji element na glavnem zaslonu Dovoli zapiranje celozaslonskega načina z gesto navzdol + Allow 1:1 zooming in with two double taps Sličice @@ -191,7 +193,8 @@ Kako nastaviti, da se določen album vedno prikaže na vrhu? Z dolgim pritiskom na album se vam prikaže meni, v katerem je na voljo bucika, s katero pripnete album na željeno mesto. Na ta način lahko pripnete več albumov, ki bodo razvrščeni v skladu s privzetim načinom razvrščanja. Ali lahko hitro predvajam videoposnetke? - Lahko kliknete na napis trenutnega ali maksimalnega trajanja poleg vrstice položaja, kar premakne/preskoči video naprej ali nazaj. + 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. + Lahko kliknete na napis trenutnega ali maksimalnega trajanja poleg vrstice položaja, kar premakne/preskoči video naprej ali nazaj. Kakšna je razlika med skrivanjem in izključevanjem mape? Izključevanje mape jo skrije le v Simple galeriji, medtem ko jo skrivanje skrije tudi v ostalih aplikacijah oz. galerijah. Deluje tako, da kreira prazno \".nomedia\" datoteko v izbrani mapi, katero lahko odstranite tudi s katerimkoli urejevalnikom datotek. Zakaj se v galeriji prikažejo datoteke z naslovnicami glasbenih map ali nalepk? diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index bfa6dc3dc..c2e6e6a9e 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -116,6 +116,7 @@ Spela upp i en slinga Bildspelet har avslutats Ingen media hittades för bildspelet + Use crossfade animations Ändra vy @@ -170,6 +171,7 @@ Visa bilder i högsta möjliga kvalitet Visa Papperskorgen som det sista objektet i huvudvyn Allow closing the fullscreen view with a down gesture + Allow 1:1 zooming in with two double taps Miniatyrer @@ -191,7 +193,8 @@ How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actionmenu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. How can I fast-forward videos? - You can click on the current or max duration texts near the seekbar, that will move the video either backward, or forward. + 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. + 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. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up? diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index bbd08e2fe..961371939 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -116,6 +116,7 @@ Slayt gösterisini tekrarla Slayt gösterisi sona erdi Slayt gösterisi için medya bulunamadı + Use crossfade animations Görünüm türünü değiştir @@ -170,6 +171,7 @@ Resimleri mümkün olan en yüksek kalitede göster Geri dönüşüm kutusu\'nu ana ekranda son öğe olarak göster Tam ekran görünümünü aşağı hareketi ile kapatmaya izin ver + Allow 1:1 zooming in with two double taps Küçük resimler @@ -191,7 +193,8 @@ Bir albümün her zaman en üstte görünmesini nasıl sağlayabilirim? İstediğiniz albüme uzunca basabilir ve eylem menüsündeki Sabitle simgesini seçebilirsiniz. Birden çok klasörü de sabitleyebilirsiniz, sabitlenmiş öğeler varsayılan sıralama yöntemine göre sıralanır. Videoları nasıl hızlıca ileri sarabilirim? - Videoyu geriye ya da ileriye taşıyacak olan arama çubuğunun yakınındaki geçerli veya maksimum süre metinlerini tıklayabilirsiniz. + 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. + Videoyu geriye ya da ileriye taşıyacak olan arama çubuğunun yakınındaki geçerli veya maksimum süre metinlerini tıklayabilirsiniz. Klasörün gizlenmesi ve hariç tutulması arasındaki fark nedir? Hariç tut, klasörü yalnızca Basit Galeri\'de görüntülemeyi engellerken, Gizle sistem genelinde çalışır ve klasörü diğer galerilerden de gizler. Verilen klasörde boş bir \".nomedia\" dosyası oluşturarak çalışır, daha sonra herhangi bir dosya yöneticisi ile kaldırabilirsiniz. Neden albüm resimlerini içeren klasörler görünüyor? diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index e8d0a3f17..e4f8f07dc 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -116,6 +116,7 @@ Зациклити показ слайдів Слайдшоу закінчено Не знайдено медіафайлів для показу у слайдшоу + Анімувати перехід між елементами Змінити тип перегляду @@ -170,6 +171,7 @@ Показувати зображення в найвищій можливій якості Показувати \"Кошик\" останнім елементом на головному екрані Дозволити закриття повноекранного перегляду свайпом згори вниз + Дозволити масштабування до 1:1 подвійним тапом Ескізи @@ -191,7 +193,8 @@ Як зробити альбом завжди доступним у верхній частині? Ви можете виконати довге натискання на бажаному альбомі і вибрати піктограму \"Закріпити\" у меню дій, що закріпить його вгорі. Ви також можете закріпити декілька тек; закріплені елементи будуть відсортовані за методом сортування за-замовчуванням. Як я можу швидко прокручувати відео? - Ви можете натиснути на текст поточного таймінгу або на текст загальної тривалості відео на прогрес-барі, що перемістить відео або назад, або вперед. + Ви можете або провести пальцем горизонтально під час відтворення відео, або натиснути на текст поточної або максимальної тривалості відео біля прогрес-бару, що прокрутить відео або назад, або вперед. + Ви можете натиснути на текст поточного таймінгу або на текст загальної тривалості відео на прогрес-барі, що перемістить відео або назад, або вперед. В чому полягає різниця між приховуванням та виключенням теки? \"Виключити\" запобігає відображенню теки тільки в додатку Simple Gallery, в той час як \"Приховати\" працює на системному рівні і приховує теку і в інших галереях також. Це здійснюється шляхом створення порожнього файлу \".nomedia\" в заданій теці, який може бути видалений пізніше будь-яким файловим менеджером. Чому відображаються теки з музичними обкладинками або стікерами? diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index a266a88de..abce63b4f 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -116,6 +116,7 @@ 循环幻灯片 幻灯片结束 未发现可用媒体 + 使用交叉渐变动画 更改视图类型 @@ -170,6 +171,7 @@ 以最高质量显示图像 在主屏幕界面的最后一项显示回收站 使用下滑手势关闭全屏视图 + 双击两次后 1:1 放大图像 缩略图 @@ -190,7 +192,8 @@ 如何让某个相册始终显示在最上面? 你可以长按该相册并在操作栏中点击图钉图标,这样 就可以将其固定在顶部了。你也可以固定多个文件夹,固定项目将按照默认排序方法排序。 如何快进/快退视频? - 可以点击底栏进度条两侧的时间文本,或拖动进度条。 + 只需在视频播放器上左右滑动,或点击底栏进度条两侧的时间文本,即可前进或后退视频。 + 可以点击底栏进度条两侧的时间文本,或拖动进度条。 文件夹的隐藏和排除有什么区别? 排除功能只是防止其在简约图库中显示,而隐藏功能则使用的是系统的方法,这样做也会在其他图库中隐藏。它的工作原理是在给定的文件夹中创建一个空的.nomedia文件,你可以使用任何文件管理器删除它。 为什么会出现音乐艺术家封面或贴纸文件夹? @@ -214,7 +217,7 @@ - An offline gallery for managing your files without ads, respecting your privacy. + 一个没有广告,尊重隐私,便于管理文件的离线图库。 一个高度可定制的图库,支持很多的图像和视频类型,包括SVG,RAW,全景照片和视频。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 08c7be32b..f342c0200 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -116,6 +116,7 @@ 投影片循環 投影片結束 找不到投影片的媒體檔案 + Use crossfade animations 改變瀏覽類型 @@ -170,6 +171,7 @@ 以最高品質顯示圖片 回收桶顯示在主畫面最後一項 允許用下滑手勢來關閉全螢幕檢視 + 允許用兩次雙擊來1:1縮放 縮圖 @@ -191,7 +193,8 @@ 我如何讓某個相冊總是出現在頂端? 你可以長按想要的相冊,然後在操作選單中選擇[圖釘]圖示,就會釘選於頂端。你也能釘選多個資料夾,釘選的項目會依預設的排序方法來排序。 我如何快轉影片? - 你可以點擊進度條附近的當前或總時長文字,影片就會快轉或倒轉。 + 你可以在影片撥放器上水平滑動你的手指,或者點擊進度條附近的當前或總時長文字。這會使影片快轉或倒轉。 + 你可以點擊進度條附近的當前或總時長文字,影片就會快轉或倒轉。 隱藏和排除資料夾,兩者有什麼不同? [排除]只在簡易相簿中避免顯示出來;而[隱藏]則作用於整個系統,資料夾也會被其他相簿隱藏。這是藉由在指定資料夾內建立一個\".nomedia\"空白檔案來進行隱藏,你之後也能用任何檔案管理器移除。 為什麼有些音樂專輯封面或貼圖的資料夾會出現? diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 2e6a8223d..e0f0e33c6 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -2,6 +2,12 @@ + + Rewrote video playback, use a separate screen + added fast-forwarding with horizontal swiping\n + Added optional 1:1 pixel ratio zooming with two double taps at fullscreen view\n + Allow adding Copy at the fullscreen bottom actions\n + Always include images at slideshows, never videos + Added an initial widget implementation for creating homescreen folder shortcuts\n Added optional grouping of direct subfolders, as a check at the \"Change view type\" dialog diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6fa8f41a3..927dcba38 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -116,6 +116,7 @@ Loop slideshow The slideshow ended No media for the slideshow have been found + Use crossfade animations Change view type @@ -170,6 +171,7 @@ 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 Thumbnails @@ -191,7 +193,8 @@ How can I make an album always appear at the top? You can long press the desired album and select the Pin icon at the actionmenu, that will pin it to the top. You can pin multiple folders too, pinned items will be sorted by the default sorting method. How can I fast-forward videos? - You can click on the current or max duration texts near the seekbar, that will move the video either backward, or forward. + 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. + 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. What is the difference between hiding and excluding a folder? Exclude prevents displaying the folder only in Simple Gallery, while Hide works system-wise and it hides the folder from other galleries too. It works by creating an empty \".nomedia\" file in the given folder, which you can then remove with any file manager too. Why do folders with music cover art or stickers show up?