From d42e0005b509f38507cf9d4b3200aa94e1250ffd Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 4 Jul 2018 19:24:52 +0200 Subject: [PATCH 01/90] remove the ACCESS_NETWORK_STATE permission, it came from ExoPlayer --- app/src/main/AndroidManifest.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 633440e5e..4cf7f3e97 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,9 @@ + From 0dba5114a1e96a338eb3681d27af9fc3ad12d4ab Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 4 Jul 2018 19:26:52 +0200 Subject: [PATCH 02/90] adding a null check at selecting directories --- .../simplemobiletools/gallery/adapters/DirectoryAdapter.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt index 6a165bdeb..e41fec139 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -436,7 +436,11 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList { val paths = HashSet(selectedPositions.size) - selectedPositions.forEach { paths.add(dirs[it].path) } + selectedPositions.forEach { + (dirs.getOrNull(it))?.apply { + paths.add(path) + } + } return paths } From 54203212078fd725120c71b51a51b9c084dc3eb4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 4 Jul 2018 19:54:51 +0200 Subject: [PATCH 03/90] show the bottom gradient at video fragment only if bottom actions are disabled --- .../gallery/fragments/VideoFragment.kt | 10 ++++++---- app/src/main/res/layout/pager_video_item.xml | 3 +-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt index 0f5ee02f6..322346b97 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -177,8 +177,9 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S override fun onResume() { super.onResume() activity!!.updateTextColors(mView!!.video_holder) - val allowVideoGestures = context!!.config.allowVideoGestures - val allowInstantChange = context!!.config.allowInstantChange + val config = context!!.config + val allowVideoGestures = config.allowVideoGestures + val allowInstantChange = config.allowInstantChange mView!!.apply { video_volume_controller.beVisibleIf(allowVideoGestures) video_brightness_controller.beVisibleIf(allowVideoGestures) @@ -187,14 +188,15 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S instant_next_item.beVisibleIf(allowInstantChange) } - if (context!!.config.showExtendedDetails != mStoredShowExtendedDetails || context!!.config.extendedDetails != mStoredExtendedDetails) { + if (config.showExtendedDetails != mStoredShowExtendedDetails || config.extendedDetails != mStoredExtendedDetails) { checkExtendedDetails() } - if (context!!.config.bottomActions != mStoredBottomActions) { + if (config.bottomActions != mStoredBottomActions) { initTimeHolder() } + mView!!.video_time_holder.setBackgroundResource(if (config.bottomActions) 0 else R.drawable.gradient_background) storeStateVariables() } diff --git a/app/src/main/res/layout/pager_video_item.xml b/app/src/main/res/layout/pager_video_item.xml index 03014aa82..3845d13e4 100644 --- a/app/src/main/res/layout/pager_video_item.xml +++ b/app/src/main/res/layout/pager_video_item.xml @@ -80,8 +80,7 @@ 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"> Date: Thu, 5 Jul 2018 11:13:01 +0200 Subject: [PATCH 04/90] adding a null check at video seekbar usage --- .../com/simplemobiletools/gallery/fragments/VideoFragment.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt index 322346b97..10b8190bc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -561,6 +561,9 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } override fun onStopTrackingTouch(seekBar: SeekBar) { + if (mExoPlayer == null) + return + if (!mIsPlaying) { togglePlayPause() } else { From 928d1e7c877aa088052083ef733e6f6b9938f09c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Fri, 6 Jul 2018 10:25:50 +0200 Subject: [PATCH 05/90] Update strings.xml --- app/src/main/res/values-ca/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index b3a3e2ca0..a98e8fc56 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -34,7 +34,7 @@ Imatges Vídeos GIFs - RAW images + Imatges RAW No s\'han tronat arxius amb els filtres seleccionats. Canviar filtres @@ -152,7 +152,7 @@ Substituïr imatges ampliades per les de millor quialitat Amaga els detalls estesos quan la barra d\'estat està amagada Fer una verificació addicional per evitar que es mostrin fitxers no vàlids - Show some action buttons at the bottom of the screen + Mostra alguns botons d\'acció a la part inferior de la pantalla Miniatures From 12921ebad18436c1bcbba5e3505ec0d66af39c99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Fri, 6 Jul 2018 10:26:59 +0200 Subject: [PATCH 06/90] Update strings.xml --- app/src/main/res/values-es/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 68e2a14d3..94f7565af 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -34,7 +34,7 @@ Imágenes Vídeos GIFs - RAW images + Imagenes RAW No se han encontrado ficheros con los filtros seleccionados. Cambiar filtros @@ -152,7 +152,7 @@ Reemplace las imágenes con mucho zoom por otras de mejor calidad Ocultar detalles ampliados cuando la barra de estado está oculta Hacer una comprobación adicional para evitar mostrar archivos inválidos - Show some action buttons at the bottom of the screen + Mostrar algunos botones de acción en la parte inferior de la pantalla Miniaturas From 05baeb8b538d2bbbd8f0b852919910c40689da5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Fri, 6 Jul 2018 10:32:42 +0200 Subject: [PATCH 07/90] Update strings.xml --- app/src/main/res/values-ca/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index b3a3e2ca0..2a89c67a5 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -188,8 +188,8 @@ Sí, hi ha un commutador a la configuració que diu \"Substituïu imatges ampliades i de gran qualitat\", podeu fer-ho. Millora la qualitat de les imatges, però es borraran una vegada que intenteu fer zoom massa. Puc retallar imatges amb aquesta aplicació? Sí, pots retallar imatges a l\'editor, arrossegant les cantonades de la imatge. Pots accedir a l\'editor prement una miniatura d\'imatge i seleccionant Edita o seleccionant Edita des de la visualització de pantalla completa. - Can I somehow group media file thumbnails? - Sure, just use the \"Group by\" menu item while at the thumbnails view. You can group files by multiple criteria, including Date Taken. If you use the \"Show all folders content\" function you can group them by folders too. + Puc agrupar d\'alguna manera les miniatures del fitxer multimèdia? + Si, només heu d\'utilitzar l\'ítem del menú \"Agrupar per\" mentre es troba a la vista en miniatura. Podeu agrupar fitxers amb diversos criteris, inclòs data de presa. Si utilitzeu la funció \"Mostra el contingut de totes les carpetes\", també podeu agrupar-les per carpetes. From 3bff3dc748d42f8627fef12bfd95c0e3c7bfb8ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Fri, 6 Jul 2018 10:34:23 +0200 Subject: [PATCH 08/90] Update strings.xml --- app/src/main/res/values-es/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 68e2a14d3..bd877e5fd 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -188,8 +188,8 @@ Sí, hay una alternancia en Configuración que dice \"Reemplazar imágenes con zoom profundo con las de mejor calidad\", puedes usar eso. Mejorará la calidad de las imágenes, pero se volverán borrosas una vez que intente ampliar demasiado. ¿Puedo recortar imágenes con esta aplicación? Sí, puede recortar imágenes en el editor arrastrando las esquinas de la imagen. Puede acceder al editor pulsando prolongadamente una imagen en miniatura y seleccionando Editar, o seleccionando Editar en la vista de pantalla completa. - Can I somehow group media file thumbnails? - Sure, just use the \"Group by\" menu item while at the thumbnails view. You can group files by multiple criteria, including Date Taken. If you use the \"Show all folders content\" function you can group them by folders too. + ¿Puedo de alguna manera agrupar miniaturas de archivos multimedia? + Claro, solo use el elemento de menú \"Agrupar por \" mientras esté en la vista de miniaturas. Puede agrupar archivos según varios criterios, incluida la Fecha de toma. Si usa la función \"Mostrar todo el contenido de las carpetas\" también puede agruparlas por carpetas. From 6d5882c1ccbd4009548641a6424860cc6917ad22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Fri, 6 Jul 2018 11:10:59 +0200 Subject: [PATCH 09/90] Update strings.xml --- app/src/main/res/values-ca/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 26a8b54ff..e686ad012 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -158,12 +158,12 @@ Miniatures Mitjans a pantalla completa Detalls estesos - Bottom actions + Accions de la part inferior - Manage visible bottom actions - Toggle favorite - Toggle file visibility + Administra les accions de la part inferior + Activa favorits + Activa la visibilitat del fitxer Com puc fer que Simple Gallery sigui la galeria de dispositius predeterminada? From 70d97fe50388a822e522db9b03587aa7ce5c5a2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Fri, 6 Jul 2018 11:12:06 +0200 Subject: [PATCH 10/90] Update strings.xml --- app/src/main/res/values-es/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 078858235..1981ca083 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -158,12 +158,12 @@ Miniaturas Medios a pantalla compelta Detalles ampliados - Bottom actions + Acciones en la parte inferior - Manage visible bottom actions - Toggle favorite - Toggle file visibility + Administrar los botones de la parte inferior + Activar favoritos + Activar visibilidad de fichero ¿Cómo puedo hacer que Simple Gallery sea la galería de dispositivos predeterminada? From 07dc8c69e5945fe305283288bd7d5ad614f4b3f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Fri, 6 Jul 2018 11:15:41 +0200 Subject: [PATCH 11/90] Update strings.xml --- app/src/main/res/values-ca/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 26a8b54ff..99088dc65 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -24,10 +24,10 @@ Brillantor Bloquejar orientació Desbloquejar orientació - Change orientation - Force portrait - Force landscape - Use default orientation + Canviar orientació + Forçar vertical + Forçar horitzontal + Fer servir la orientació per defecte Filtre d\'arxius From fe92d554982042b6a295130e82bc434e1409f30e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Fri, 6 Jul 2018 11:17:02 +0200 Subject: [PATCH 12/90] Update strings.xml --- app/src/main/res/values-es/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 078858235..99d4d55dd 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -24,10 +24,10 @@ Brillo Bloquear orientación Desbloquear orientación - Change orientation - Force portrait - Force landscape - Use default orientation + Cambiar orientación + Forzar retrato + Forzar paisaje + Usar la orientación por defecto Filtro de medios From 393420ab2d910ede56fc459d57feef5463a9ec88 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 6 Jul 2018 11:52:00 +0200 Subject: [PATCH 13/90] use a background thread for releasing exoplayer --- .../simplemobiletools/gallery/fragments/VideoFragment.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt index 10b8190bc..135617e02 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -456,8 +456,10 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S private fun releaseExoPlayer() { mExoPlayer?.stop() - mExoPlayer?.release() - mExoPlayer = null + Thread { + mExoPlayer?.release() + mExoPlayer = null + }.start() } override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture?, width: Int, height: Int) { From 902bdb025545eab223d446d997de0bdad75365b8 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 6 Jul 2018 12:42:07 +0200 Subject: [PATCH 14/90] use smaller play/pause/panorama icons with dynamic background --- .../gallery/fragments/VideoFragment.kt | 4 ++-- .../main/res/drawable-hdpi/ic_panorama.png | Bin 7259 -> 520 bytes app/src/main/res/drawable-hdpi/ic_pause.png | Bin 0 -> 140 bytes app/src/main/res/drawable-hdpi/ic_play.png | Bin 0 -> 214 bytes .../drawable-hdpi/img_pause_outline_big.png | Bin 3975 -> 0 bytes .../drawable-hdpi/img_play_outline_big.png | Bin 5426 -> 0 bytes .../main/res/drawable-xhdpi/ic_panorama.png | Bin 8668 -> 622 bytes app/src/main/res/drawable-xhdpi/ic_pause.png | Bin 0 -> 92 bytes app/src/main/res/drawable-xhdpi/ic_play.png | Bin 0 -> 246 bytes .../drawable-xhdpi/img_pause_outline_big.png | Bin 3593 -> 0 bytes .../drawable-xhdpi/img_play_outline_big.png | Bin 4664 -> 0 bytes .../main/res/drawable-xxhdpi/ic_panorama.png | Bin 16691 -> 940 bytes app/src/main/res/drawable-xxhdpi/ic_pause.png | Bin 0 -> 143 bytes app/src/main/res/drawable-xxhdpi/ic_play.png | Bin 0 -> 320 bytes .../drawable-xxhdpi/img_pause_outline_big.png | Bin 7171 -> 0 bytes .../drawable-xxhdpi/img_play_outline_big.png | Bin 10332 -> 0 bytes .../main/res/drawable-xxxhdpi/ic_panorama.png | Bin 16452 -> 1190 bytes .../main/res/drawable-xxxhdpi/ic_pause.png | Bin 0 -> 110 bytes app/src/main/res/drawable-xxxhdpi/ic_play.png | Bin 0 -> 361 bytes .../img_pause_outline_big.png | Bin 4450 -> 0 bytes .../drawable-xxxhdpi/img_play_outline_big.png | Bin 6171 -> 0 bytes .../circle_black_background_with_inset.xml | 7 +++++++ app/src/main/res/layout/pager_photo_item.xml | 4 ++-- app/src/main/res/layout/pager_video_item.xml | 6 +++--- app/src/main/res/values-sw600dp/dimens.xml | 1 - app/src/main/res/values/dimens.xml | 2 +- 26 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_pause.png create mode 100644 app/src/main/res/drawable-hdpi/ic_play.png delete mode 100644 app/src/main/res/drawable-hdpi/img_pause_outline_big.png delete mode 100644 app/src/main/res/drawable-hdpi/img_play_outline_big.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_pause.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_play.png delete mode 100644 app/src/main/res/drawable-xhdpi/img_pause_outline_big.png delete mode 100644 app/src/main/res/drawable-xhdpi/img_play_outline_big.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_pause.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_play.png delete mode 100644 app/src/main/res/drawable-xxhdpi/img_pause_outline_big.png delete mode 100644 app/src/main/res/drawable-xxhdpi/img_play_outline_big.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_pause.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_play.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/img_pause_outline_big.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/img_play_outline_big.png create mode 100644 app/src/main/res/drawable/circle_black_background_with_inset.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt index 135617e02..79ff16a0f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -386,7 +386,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mIsPlaying = true mExoPlayer?.playWhenReady = true - mView!!.video_play_outline.setImageDrawable(resources.getDrawable(R.drawable.img_pause_outline_big)) + mView!!.video_play_outline.setImageResource(R.drawable.ic_pause) activity!!.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) mHidePauseHandler.postDelayed({ mView!!.video_play_outline.animate().alpha(0f).start() @@ -403,7 +403,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mExoPlayer?.playWhenReady = false } - mView?.video_play_outline?.setImageDrawable(resources.getDrawable(R.drawable.img_play_outline_big)) + mView?.video_play_outline?.setImageResource(R.drawable.ic_play) mView!!.video_play_outline.alpha = PLAY_PAUSE_VISIBLE_ALPHA activity!!.window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) diff --git a/app/src/main/res/drawable-hdpi/ic_panorama.png b/app/src/main/res/drawable-hdpi/ic_panorama.png index ab2b517b7e918f3603f14b1c716def46323c78b5..513420277b6ab165259b9ebf0e41c27c7ab896fb 100644 GIT binary patch literal 520 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 diff --git a/app/src/main/res/drawable-hdpi/ic_pause.png b/app/src/main/res/drawable-hdpi/ic_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb009d8175ce5a363c2c1b6771d04f2ed65a496 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^W+2SL1|)l2v+e?^U{4pvkP61PH#hP!7;rEj?3ooP zp*!1BIY4n%b?3E9S7kgWsjQvyM6L4d-Nw0v5lh!UD?fk(Y)iQ3F-gTU>z7x@I*rAC SR<1zf89ZJ6T-G@yGywqmZaC)v literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_play.png b/app/src/main/res/drawable-hdpi/ic_play.png new file mode 100644 index 0000000000000000000000000000000000000000..a2efea8dca4dbeadc77728af2ec261672dae34df GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^W+2SL0wmRZ7KH(+xt=bLAr*{orwj5p8wxl~*FS7| zcA;PC`rUfP^M2o{?JHfmoNw{Ldmm!t?!2q~G-=uTz1E_xfhtYX?dr{*pHn_OJa}^w zqs}h%W_^FXX*>zWHj)RrSF1Ohm-BhE8Dvhl2^N}ci?5vq;)`t OGI+ZBxvXs#rY$2n_p8aN>v1W*g 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 diff --git a/app/src/main/res/drawable-hdpi/img_play_outline_big.png b/app/src/main/res/drawable-hdpi/img_play_outline_big.png deleted file mode 100644 index 67419faa27611fa64fee8b1566bb2c7242a6fc24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5426 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 a^DB|ng}Lxs(-aXDp#4z)L5&7H?EeA2WqYCk diff --git a/app/src/main/res/drawable-xhdpi/ic_panorama.png b/app/src/main/res/drawable-xhdpi/ic_panorama.png index 8d1a82b24afe26d60e4e1b56047347e7f7b864aa..c7f48d89ce5937dc8bd281feffa8385cc8f7f362 100644 GIT binary patch literal 622 zcmV-!0+IcRP)g?y+sO zgJZp;UEXnQG*2JL`$fC`;&^?cagOk#PWjOh(FkiAp~`sgdBg<{v8QcqXjT0Uw5knl zYfp!`z{B1(UX>BnjQZHYXvKc@s1vLkb+UouJ?a<5M%y83v$ipM``z_6iYD3A_5RY^ z7;8s0Lwv2L4;&C}-~b=!=^I0$iYIjUt0SY09N|~pJsIU}ZV{4K430K4#0y9k**wa) z4arr}A+AJnTa@vgMbd@*qsJOBOL1=^(!qY^0)n>aR#}@#8yjs`p?-0 zMY9ZcimzKKA^F5<`bX>R>1Kba?S|6O_inUFw3n@2<|W@*pxA9uz*CO5W^|JNb|~*G zCCf-BSw=d^GSW$wkxsIVbdqJHlPn{hWEtrsWt}X`vMkG%0Os6=C{sYmLjV8(07*qo IM6N<$f`za+WdHyG literal 8668 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 diff --git a/app/src/main/res/drawable-xhdpi/ic_pause.png b/app/src/main/res/drawable-xhdpi/ic_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..7192ad487eacb4f8f530ebe2878760e2528fbc5f GIT binary patch literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^9w5vJBp7O^^}Pa8OeH~n!3+##lh0ZJd7_>!jv*C{ m$r5W0{Noqkjk>0hJ%NeAb!~d=tj~okAZ?zmelF{r5}E*xz!xz9 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_play.png b/app/src/main/res/drawable-xhdpi/ic_play.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5d7c623d6cd456525ab02c42911bd5f672f570 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhaw_IkQFhEy=Vys zHiKk^1DjGoQ)iU}8`BKQnLA1+82)Ylt$D&S_tL)d2`ZjaeN$7z6n+#vx6l+g(0zK1 z!-vNQGlLWw%&$i_J~%)5^AZOJ`Mk|cjB9ijGrhH7W7*xq7+KGA;#ac6HF@Su|0E`S zJ>Ia!o-O6Cp~CBam{fp7vy*~+WZlZOwQ_FuvfADI<##^#cj#GDHP0#5?;3Nt-&7=cFx+v-+oZ>_6(Z3+NFBPgg&ebxsLQ0NLbV*8l(j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/img_pause_outline_big.png b/app/src/main/res/drawable-xhdpi/img_pause_outline_big.png deleted file mode 100644 index 0dccd18e26f0bcba4988b54e1d711155b91b5d7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3593 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 I2PuF41N-cL1ONa4 diff --git a/app/src/main/res/drawable-xhdpi/img_play_outline_big.png b/app/src/main/res/drawable-xhdpi/img_play_outline_big.png deleted file mode 100644 index e950835526dada0d628e4100b585142fa70f7765..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4664 zcmb7Ii96I$_y5kAVJuLw=iYPg`J5YPVPbgl$uFASS|I#_46F1JoUDtYr*87Z3b z^n%qM_@t=0I!m2+c8W+z=Kk4JVTLQLM>l#pLfP5*HQd#^deF{*>}1HK}?VS7iwJo z;?4s&7st0nW$xQ+AXlzlI6#dVKoE?wfcC}9zqF?}8slKt>=#^>>eTmFlB^OTl1X?V zZ%S?cI$mZ%6hf%~aVoT{Z=GJ!1_NazmzQ^FEtyrId#^y-jOvfs>TW3gDaxr}W{ZO5Tt%_=6T+k}_{dkOV9d0jymWicqxHK>8UF zdDSF=wbH@_K5C0Gtnr@}e(L;!PU8#32bHR_VDxdu7Mhd6#*YNPQ-<-Dv`_53q^`W- zPkHVM$8dmhOyAYssJ@A4Uea3roZjUER!@E4M?xXbh5VyMUu_pakTN+WhQFDo%bvX4 zJ-C4^f2}FBQ2+?HawyVDFV!OC8b3J*rRKWxG}m}n5d*@)4vfAZm_;kJRUh58BO)B( zq*YtN)ZC8h<4w==WYj;7`=GZrX4uO;4!+PluRSCOf@qC>W$m7qO>p`Hkrpj-zIX`X zyxQB9U~Zvq*IZ#LU9bn-t&qOt8Q1o8{rjrs(9}=qgIn+?s57e(XAyw8aBzajhhazY zMExCueXA)_Afww#0Dne|JH{^3gO_Q81kA0zY(&}4t8!_=Q=iAS;Wpi--8bJ2E=<3C z`7(e4CA*0(TKt6T`p7YW*REwO7fV%@pn_w|FbqytN)-y))Lb0DXU08f-%IVgS+_Lx znZE?3BoW93Ua}qeSR#dF8;FdZL+@&aHS$LAXRw6GrF$s=L@3WiP!c?}jh)$hM`I%Z zigLP1?U4fIWFpkY+mF@n@m@CJ3uyLw)5onjS8`HNb4y{79=ad!=MP0<-fB0)rN^z? zl_7Vyu-4;jCm*@N7(%26C(u^|Br*o&(Bo{`@>Jr<*FbHN7SI@X>+cf>JA$%0OGU@^ ze1C3`;U=ih4Ic5;e$4WWNa!=O8%9K~(oeJ9xXssiMc z9pjIZ7>vF6yjk~TkhaLK?R$idb+n{HL{WTO%{t-~H24?y(d++ixY>feA0-KqI(I-_ z>>Do(X+o;=4p0KFfGB?n>h3+l1C#09Z>9b=QdnB6f&>c7!J+-1a zM%p2E6M=8r;NYRE<`EV&PLx}fu`T{jjP#s532Gf0NpNKGvE&N*s`1Rsp2$T4c}~y- z*N>9s#-)+p{;YA+S^*K~iJYQ#SD<_e^mEcrhwcj0?#|D=|HdJ=F-YtuyH1)!dnPeJM?qFZOw3N8*4d$sTkOpH`Rnt z0@m0l>cWN`O{|8n;)mKg&3$}!|n=Z zq~`9Q?XE19utF`N>g)9!G;xvw1CG2|H8?X8y0hTq<>j@v(j3J(Lu+NJG9CR$W=War zCatZlS)b4hTpCmv35;BXGMsBTXkw%xAN?XG{dY=(6Zid%i1I$4=j(2%0hY!$lB(4m zKMZSc?C&f(R@((Tdu zJq^2w`8T6G|0kun$4RjMz0V19&l8B|wu-BGwXfCBja@SbW?i4CdKQXOj+5qcfzs!< z;ueQLY$T*R274G0H4XL8v(Q-3YbOiVbA?}52QE)wFd>^uqwaBiFLIJCufjf~c=ZQZ z8h^XTS-Pzm!@7VgPT-iUZYI0a=}!BZWL4Qjqz;PHj|z-;wzRaIrqSJv%>)t7i@ojb z?Q=JB@2_VaQ}NzSTene4-FAEqHYIIgTFGScmxk3Z8VANE**N8mcq>5ZAm)7!U(Cx# z>}r-IScIiZFa9)ed2#>LY@}MbaY*8gxMQi?o`oy8SS$1kZ>RF7-`l#Fzmpm<8H(*) z{A{(ge^InaYsBPXkOu_8i6}UZ@`Zh_kO+a=2;dEfT!t~^YVBuc(z^kYiGZp4uV0HB zMA;Iy`!xF6>{@UnJ>9gPHxEttb+N0I4y(Y%G5eRU|HV@|9Th}o1^B-Ts%n#!Uux#b%bFFU@CpfP?RJmT@PL*Jh8DX zFJf{u0iPJM4ZghOJPPf@;n*x--3z>M(Bl?7(E>Ehf(z*+e;5Zas0(%3S6X4SVZ@_3MG?tjcu&SPZy#@7_r8pW?8C z-PP^`bE14fGyoCuIoRK8sNZ5_9pL+B_)%yyo85>=0T3SlU-SDL!k7T?aeTkp_C<*(_W;*e-8}Jvl2#r2#Z*LzKw71re=_sDItW2BJm9-9UFbPBv zB-q&4cCxav!fKhJ9mW^>S*nA>jz9pTZfnD^V=%js+EVz@6yFZwDx(Y2v%-kt;Qf_9 z-DN!o3<+69IKxmSYJ;+h`kW8t%i1~Nc7$uOWZ{>ypr3rHsp|*=8|t>(%*iEU<>jhI zqaC8eu1|qxeLT6Uyw{2PLKI#HhN#waT!xciiTqi*~Wb|$Ni=U+7YThR@4?GSOI?WLX74XM(GtH zg94JS+J#PWa zfUu83b|Xb^u9E_Q_)=MQPv*F~u<71GKy-G+<(t;6*F=_l6Se4)IO8?{e>UN!azX}w23 zhlhv9rSQtK;vtlg{rI0A;dp_8vFx0nUfmAQtZ&Xur<%>_W>6WI*@TEshrueH8?qvc zQcQAo**B+KLET-+gTpg4y1b{5g(NltWwY#r@>MK4HJqTyivL`jc3v zeCT6&RthXZ;#FCDf?5W39|vok>EXzINEW`MBue^W6`p))D*_(c%Jf2rptOsdw;~~H zynIXo6B)_wL3%yAPfr0eFWyN-FKOU9jz$0IroAs#G_dt%x)%eu|y-jMn!52#msoy^DUFGTAEE-hd$CFhpO{ZnIv^)r8l|c_mP!22|CSjFQrfBoN8pDA1O(Q$3*WHBQvv+Ecj7oRSF}%b$M2vNTjQ)i z43@jg&Nd*L=>eBO=+u6wmz6(=Xymw^^5O5Adl*XcW z_Flz_laTW~5C;5a!|1ux86devQrS8hk9)zq4Lp)T9-@J_7mb<~f=v&1kUr8U4vaM( zSpdCwWCFF}SO!#jC`Er$#TY=ci!oT=MUq4PP+({zPY~Cv#f8Mb^=2uj%VGc-U zLK>nqq^kNfX3?2EF8$~>5WmT;Loxaloog7HfJm$7zmZly?5#4xgZeHOdb^w(le$~k zWLhDIEb-t08_Mh~@qhjR)s7DkQIpu^hLguL zR^so7)si#gD&as#&L3XLE5vS+4j`V)i#z#XQ~)yOFQHdD?5&urF9|4Pbio? zn`dm7{nekX6VM_aiLZ@@y*K9f_xICQHogd-Gt=GdisdNHeE0ESnj(d~7=iwlJAH1D zZ&OPDZa%o^RmhA_K~R%yj_D4DSyI?!oz`$Oy?h|w6e7_yI(|_FTw3Gjd(9SHNw3I& zWs)_Iq0<^lzV~|Ca!%0$a8qFqJ|(ro8n@<+#)6vSPksFRekm)PnDyy#*i5gdTS4~X zpvJ-p`f3J?gBY7Emebxr2nVgMp0{^7Y0zQM4=xpVGm+=>Z$NbZBrop-djxr6IUO)| zF6W}iRo5YeJI&f!5mP^Z4)KCZZK+Blsuy@I(>gWhZ(Z5AU`WE`W{X8bWBaiEVE z>U2gFDoTLST0%zXBMD-0a8j_Jx(!Hr5@3;nP_!e^PLNzBa1VE7*HokzN}rchS!%&| zj8p8eREIw(yVaq(3)6OmVRtel|0SqtPr|Smm@WpUEe*qlxhH$Mgmz1SdrB-tV-S|l z6&M?0l7K6M>pSva1Ok|}O?w?4yZt!4b;uC`A>8uhZ^+ABh;xE-9lkusy-?47TeRYS z`>YPYNSO0^D5vNOK^UuDiMlniHl=qI^ejqI%uDBT-63y;H^aTvB}DuOjdF5% diff --git a/app/src/main/res/drawable-xxhdpi/ic_panorama.png b/app/src/main/res/drawable-xxhdpi/ic_panorama.png index 7dd982b25197626e2c3beff505f21cb049e8cd4b..17e7cde47f66d1b7d02af81212f2a097e7dbca29 100644 GIT binary patch literal 940 zcmV;d15^BoP)YN+qP}nT*bESWD|~U+qUgF**|pO zdG1r&(pRoqQP#Dm)77mQO4W4vgaCkZ~)!jQTwP_T=7B2C& z?v_gNPQkBnt81-3vwY|R>qiOM!1+EjOMO~fwXn0*Lfx9U+Nx0|R&})|>ei@$v*ri+ z&GEXOq5|yXb#vtReJmTd%4fc(tP>Sv9Z#7rpIalHt@Ey^h3%sXY_Emf=G!__d0#G* zT@_X2N|WXCVWhE<1+tB@V^oTK7wlG}oxx0)}P_ac?e&6isT`zC~yJk2H=$!)5QBAvVBv(&e?O$aMlnl;^H zntaZPW#be1E%d3w6T*s4v!9R5k>B%$3}yePZhbvq)BIt@rCHe(+Nj%?Q3z{jqdrSC zbDIq_!-`3>k`ujcg8KYy`ND_aeuad*7G8Floh|2Cib?amS?aggla`BOc)%j*W*SQ| zX;MsdL=?}V`YBR+n)xwEMy;`qll_~X)u4DbJ*(k|HTxl5hMlyhy0Wglt#J-5NQyQZjkOS zfxG8-pZho5^E|^ahcoBwz4nTCy=!fvo@pqNliVhOAc!2HEUyJYICIz+5g|Ae_@^-m zyb-%78@fYKAs+UHQv#{#K+s(XA^$|jCw*($*JsM6;re>i+7>>3;(?ebcSzeVzp2u# z_mw?T;muAQ$Dx+>9?`ml$=k@#x0xJ1;`dzSpa0?D87tn^rLvZg4gZn+RaUHaC{S~d zv$wHd%{C}_DvI1-f(wP}KMpV%HM##9RX>CZFss?=4{UNK1_S#4f5el>k6;{Izt;|9iT6;} z%2pE+HXbN)$3gg8<4U}=c^;BPWZ@H~X*(gVZ~M`h-N9<7_~M!crhmP*5sLKc zo>Fy6xW%T#_l;OtLO^u)tp|bwmedut(=iiQk|K$Sv{CH7fIW;7iioDhxa5nVerMb* zQ;|@zeMPn7dlB6o6Cq`z*pcRceX&T|1Su_A;a9Cr(&)e()ONC+li)kJ|4FZJ|W2dagd*M4y7D)S`Y+M|DeQjvDlp{6^E$V3jo{fplGAE>#4!9xy?)LIE(PCk zp3*X@TCKhCNOJHBDWs_4GB1~h?o@lA-x=fM9(y_Z=Hsi6<#I|Ck^dcWBHu%bJcs-R zJc-0+Gu|cntf<#&{+xyM#-HNlO^6cso}lJ3{#?ZSG&M^sz)34*K9;N6E{Skh!EQ3h z!%{W5d~#K8^XH__2Yi5Eyz^FhSy4@2O@tF8-xZH~S@iLv;EcIT+&8o>ih9rX!EHrc zmp4D3omnf^EFqVVE~GIZ7U0=)OYqzWrE!d*zrtzc=2IkggTAO0+cs4!LHB8s48K)8 zUsjf{6tKh)S&->{Mr&JF-VEm}A}CSG?`fF#gkMCxp;d%l+zpU)Q*J2_YP#WLID0wA z34bjhRlrN2(ejZ^L+9C`4e%Kf(Wx{Cd>&-)GX;apC8}yc0UH?qDStzMJS+oy;x8r6C z3_atx*TTR^l!aD9ys#-M+p_AWk%@qQwG-HA+)w5Iu7fWqq{9in_*-XP`w|CPUA^#5 z1ci|{wbc~dA-`L?05>fc?NHMkQtw`5#F2wv_~a@}YTMFr&y&J3HJ2l&=Ha|wZ;|^m zoK5L)_=#V8cg$NH176cXWmE-Y zWLu_Xzs280mLNnTXD@O*tK${rnCk5FNLA~coLl5|%p4ZZ9UoCnnH&d0qVuF?PS2roH4|MHkCX!DtVRF^e}1;wiA`a@%3HGFG;XD`M`Yi zY{H+rdWbp-4t8%6<n##Mh^?)1(GC2;;Fpu;*OyLkU6T7y0+mk$hqqy@w{lMdZ#Oq#mbsgr+rRO zkhx-GNR>?oGyepKyE!Ap6G%!`*7oaxJW4}9Oc2WIsi-&6s#;B5V#F_T$G3^4E}&^9 zo!dFHzU?J%6Z;Sr_Bs~wieN?@z|^VcN#_#JY&5i05)QisDK7yhiC(y#nqyvvt}EH=(K zGhhzMt6OAu&jxK`;jl1%MabB>UhUKtm|lE<41x{OhJ4BCX=ohlO^q4hN%n~C$ux(Q zzpA0ieo}TgYCnAsPTvw(6Nb-scQAy|?ZfCg3Szjzv}2%3#n0$6YeftYX8tK`shbSn zD_Xkcz5XAF>dK>t2~FX3C_-CNW1#x`#-<-9vjipdW^a&`9*T7?kJHFqYW z{BWR86+$9+Z{N-N?}h-HBR})jC2mL!=Sqqp9ZOX;eY*wzBOw{YqI?xEwA#<@5QEkN zH>AP!vDoKSPr5~b2gPHLFm<_rSh zcyy9@nGo*jPkfuc7JP`=xDidvZXO#Q{NLgMh_y;l1A-7UFqXm|mweJvDcsZ3eVF=9 zZWbI&R2OobDdxr9kT~ZUwK@cZiDKffBvUuL5G2t(fNAtY6o$DT41;QZ?x zwAMSofe5+H2Mr#)liLzpiO^FlWG4yl52#UW~1HZfpKL0yW>~NIEg`E>P+Tv7aThvvfwb+N*Y#xLX^~Kt1gHvSjJ%# zkn)EBlwMP&B9tc9qU^fE0BLcW<|us4b-wVG4jHl*jbtz~C4zi<#8JPLGMA2^KI&|9 zsN}7t?OwhexI)$M4ixf-iJ$Uh`os;ofc1W?x+aG(DnY1?5^i6KfcHOF8K43^E_bQl z?)A(V;Q|2&`VZH)T>7g%UbXXK_X00eq9<$npkQU2!2dx=AW|`kRszBZbp35Ed)vT> zVMB4;z|&*Eh2pJ?x|j4A5?-2-&1nq~F+-cS$&W;Z_N}0lX#Xb2LQKZj@#ba)q>6gVCJBy129*>)fcGLz`gw8E1_&-ZPMS&taO4mnr#XHJNBG}2f!5HRTaoFzrDZ7Rf({a& zwazD1rWd>6QY3x>?j>NXl{2gW3r)lG2^%JWAexq>-jBFo3NRT&Vu1iIOI=;vG?Mbpc0p0m_E>|z zcY9xkloUsT@}stE5zJng-<@ea2BfkRxrM&B=9`A_r=QCW%WRi=Go-4lf5qJ5P>f|Z zG%zwUGB7bQ`IwMEy-q%KIO9T&kNf6u#^NX!<)Lo0_-Q6&8w_Z`UgS1*Jc{fI_I&iD zKuXH``ug61fq`2dAf5RP{_TuGSstYeB!)pVD*| zvV0MU7ctttJh%AV($az%D}5o{{(&jQ)W|5+5F9Rp2<{KJrTq@y4Gs>@x3#sk;=YkR z=l-|j6|BkXdB_wc-vZ`*V`F`tLRVjZ$GpnPw71B#E_Ho z{4AMiX~v(x3a=fUO`SFzMlJ05JYuHs2J0@$Did%z*Bp9drlr-)$H*HAI@G{M>x-v+2JR($6!mxz2;HOQQtLQhU}!S%JzvY!*T{V2YvSbO z6r`xA=w)kb>vflks4HVuN{%{CF*~8JukUz!d;2&!IeA$rQ^muDh zsz87$w#s;L5-G`F#9=w*Lyh8bC^DJCFhwPT>zN)01^g;^7}~e(OE-iAS#*8Z&edQB zdWhdNI~!b)$ke2dTyxeQ2NMd~oofy>1~;$uSQ{+l)hiGOYWpjhMas*g&FTStz`VSt ziXTENV>lf4eo}x(29b-99AAHG;k?)$*MB;-BBL+kJX7Db2R`!f^70Du^Yd$}s=hc1 zpaEK&33M~{^5R6_d9t!_xv*+x;;4mG@Xz*4!{o#4+pu9(oKR*<7v<=QD{qj{R1=o1OI%5nNIGPTqBr zz#ff`mZzoABn^MsNGe$GGWM2$G^aOR!re+iLBR$%lE$f%An(HC*tE(8ADk+E%mp>jRVivuDq4 zlMzb9w>JCv`LP45_LTD49J@MQj1#Q8zPhL~Hl^h|d50Frk5%jxSzRH8eG>J7;HrrPv8r`V+yvcM{= z&bLP9&-$)p=xRRN`x$Y4IeRTFOXc5{Hxs#7!yj^u*xqvfU^bMa-hFk}9~?9jb4yr* zhmVh0@dcUld&TVeoSdB6idUmWb!$0kX5-baFY1OLvT+_G{04v#0U)%%B))*%ZY@YsuqQ8f=f2<%C(P^NJdFt%W$wh!n*6a@DX@HD5 z2ml}&O5Y?Slr!6OXNhZH?CtIKbZ)vl_7|HCIH1w6ar;1N-FL%Fq{?JU9B+)EsCwc3 zk4bQWdm@*5s%s4177IU+DX{&CwA9q~RB#v>8&86_32<-hIY|oEM`IJefBzmH7@*$T z+>8NX#OD!f95&eQwEOVUM}yzuVwT@FTYzt*3Nn(NgYkj4oTH#a8(Uk#A3uKJ0)xBN z8cEsDfA3yL7gz}a@ZJfAdS6II7!Ln2?H4S4`$L2nP?_zftBoczpM@yyV`Edwh#opS zygJU10~<*TIzv+;!lEx<*cWH~ccc#%q6KA|s%+4IOHOQeRz;?!r>BR(K}``U1vDh> z<*Qeeo3l+#uKk(PwFYCMKrf*}aeRCl^C3lET!^;0U@pTVa^>+bG=Go~|3EoBsIdWhDBmn~xG7 zcMvU$Its0++Er0YMb`80>>#@7`f?}uTs!OhkDcGnfuy3Ho!u*K?V-=WZ$*UOpkys7 zEPM?jzmrLo)AYP%OD*t;lYVKT8%SzT2giwW57@4%ki!Y}w zi*u<;n%eT*rq~M?46yu58GPE>{VVRy<8k8X0uU!Re}9%6uJhiRX>gjZ&EVB9DwwWv zHdpfW^aOxNO0wa{i3kW5um7Fyp|TY}bb%=EF|s*c)@|GK>4DQGKmw8EOrl-HLt{V@ z=QE_dozAztn=THuHKjc<>wZEOTS$6Uw?jQ)WAk0YIUN-1Z>KXq6Mk;)_Unq`z}Hj3 zS1ZA0vy;zSy^4)RZj*a^c~y#viHSLb8o+_nPJP){CwJCVnZpoQEk8@^$NSnp1e^Zt zKL9S;YZ!duS_X%mjm;84XtT%oj%RFDMa9Ee*LD_4X%Ok9($dm0q)q4fT~V38EA$xP zH@z+*7|F7F*vQHX1n}GS4Gb8o7h|O~8rSpk1?~fDLkv(8v-Pm{~3zVgIxi{^k zz_hONxMn4DvI>ksuaDv>(B@xl4CW@HAY4Bm%GJE1ucxPH2EtT}Q=uF%84BtB4vzlI zxf_oSrpLw@D{5KOOHyE4AS`_@=@o0HI_2z55}96q>Jk7z$n5t~^WaN{{r!E%GP^pg zkK7n3WXkegMlHP>Dfm7K{B3vT>q*JNqHguPygYcW8VczR;1->!TPJ5(jz)&0Fp#By zok%+fwoD8HCZ{4Fq?ngH5wS9vgA~qJpGgps+910MpG%~przhO5Kj_oGI?K8~GisX6 z;v${(Pf$kZfBpLPGr&sAg289qb(A1dd({=Gc>y*2akx=b=hU*4VjlFXBY{I{X=#bh zaB7WjW@w1^;;1e>RTHFw?3Iwd~O;KUSkusbP<=}~{Zfyk~q@I!8^t zry1Pb-T9f$B3kGB0Pf4celc|=)8A=QRj|S1H!o@KCKi=!y(JZ34C>@eQ4_yB9LkNm zC2ac?psq?jzqs=9a*;=1Sv9AFF1GRkpswb2biSkF*S^jk(L$c#`h!y)`O(IcO}v)L zsoL_Ny4bXbf|;3F6y1dq0MN>EEs zhBZ128+`$QBaw`C_MRnoVwJVQrrlnIb#Yuk$awu zScDUBL1(iUGberNAcph+==}Wt35TXNAAWxS z{(UXz-(GuFF@RUv;1PBJ&nkl1X}mvXya1tl1Q=R+liO0)Rz*cceemY}dk!EcCkto7 z6*nK0&yU6^Ev>9v>@=Lr_yP$X*Xw*R!-kE_fc;LpoyLppHmow&dTxwV{95dRON|43 zFPR0vOUA}%@$BZo8HK*C?gw?b{8XPCcHAx9)qJeCQ!T6qv3 z`>1KJ$=BM&HOr~pS|$H+%}h-N__V#J+cEXus<=L}dwemTQ)paO8QE&t9;CgH-7@bI z0IX(9^YP{3Hn{ECWmi|1fvc;l8PJ?$?K|#UY$=R#pZeR^dDhmW~5R#pzYdxngPiC(-tC}viysKVMDz=iP z2I!~Ez zP%w{Owh0F9i2*rTzCt!U;sqc^fh?Ix5%U7}p`?~b8Nl=t5Z!{00hHEI{ne6RR8(|a zHRJcHQ>=0CgWYW4$#jnVPSGX^m; z{GvZpwW9y`0NiRVt?$DMvXV!Cv=183dYv<+0#0|ItLzd8ft7d+(ucUfle$^cu6d%< zYP=g1VF2OuN`uIF1j2Y~^6EuPP}Adh6zUeR-IK}^{!YDPm6zqU@0#7@AkB|D_MX)7 zMYZdBr75Of(U*;VV4_ z;N3NFrHaphkKV_|Nne0sr_M{_j1aM=pPep3%QR(Gj`0^x`yOBaa{!q(Dk`84o1irP zTN2C)+HJn!4cqsfH)}c{F7|o^+)l8Az5Q4*{x-F`re^=6o%#d&^B01#+abyjhh>gt zR_5<$ZE@!9df*#b>%b3DS9@Fy9dB>%P2h88-GG@rW~GRvl{9?>k|l?z02wk=cJVd7 z5RDbqpKx+=X44!6fXx1N6OiGR4_J@a8{6Al0T1r7u&|V7{rk&pjCF(myGf<3#p&*R zwgxbqxAM|=B6oVNtbu3r@Pmw4U~``btn za3l&qCBKYNoC<&h;InHK8xOJ?U@BZKUD8C{QqtC-h85*nHSNi(o zrMc@Jx|8`?C}mFPqqlz z7hlcIN8Xu9`?eBV#Sg4&C-vbgnvwEgfI|*hN+^{mF(CFho!({^1Yv~tdH+$5aDRd7 zA9oz&;o*=b_oj4GVq#*+iRAw#sl+hbO}-_>KGAxk8+SXRm&1kK5qloEXDC^3@3#0`c8{TC=lfxRgh#j|a;@ssRcam6g z`RoCgFPR(I2!{H$qVg43>Tg|rQ_lg-;Pas&Qc_aGGz$)F#%K5?lb0q6w%HKN=6-lI zOODgS`kcugIAkzfQy_L>FqZH1Al`tyqKy;lSWOgLj$J`iO#k?8VMoVJD3A6 zz2%@GrZGYQcWJ#~V?8KgyP&OC=I)!f`XwYJ&cL&W>9AO|pEIoR zp~E1$;8ju0atyeRozp&}CGt*C^<(P(&@h)nsD~VfxwIBij%E7%IHd9avlR+eGLo`8&H-=u@=?I4 zi~5&LutYWhK6skfo-L>4Km8p4Vm4Pz$(Z9N$(d8b(MTs2Kc&che%4~E1#rd782}D) z{+}+ln~j~j9+J*+VfleinA`(^6Mw(1nm%qbcB-*KhRS_fTfGSg0talm^cS34+P4t; zRD|!8U<^1a_Sr>7NuUWCe$O}h2LwaX>i_L`rvcxr&z@C=MqB@_YCI|w4A?N9P5sod zqW&-^TYDuZ%_$E%P(eWf0Re5?Rxv}YRqFOG(JeCzD!=*V~+d}VianETk&A7H#B*!h`u_}c1E$(3|>k~_iw_FiEljJvR~ zuzOP26$VQH0(e?2LlY%ldw?XBI6v2fI6j+!kbaIO%Ut>BRlCA@sEEPDc9{&`}S}WWq&T)-3r++J1!B-=I%hCj-Cx~2+_I&DBO2LhMJCU5^ zojyTiQNSxYo&M@i5$RiJclp_s#Jd5A073O0khE(I=I(yY&5Z-lt z>iLL0ux_K*5*M3gD>l~FfA2-*E^JO#IZp!8DHFKg<)hN9hi)!{M8LadqKWkw-f#e( z`o-DVS)u!K4~mA2FtO5}ho8UKTt`R55oCk9*!jH!VMH!X%vr-gbN$V23rH3DFDTez z;b+tf#W>dKQtM7+>h`u%j(FVs|M1}SPLTIJmhB+LvK^cy&A*-lEcZ|v#2n3r{Vv`c ziD$k-_IEm(r>TH*lRz>zD71YTDKecD0+Hl2jF=V~lt32#6op0k*eHpzOLtW?dc?Z( z$YoB}PDx2gMTswz*aD%VsYwZl&eww=1N#CjeMX%qSVu!6_8RN?ya3kE2FDhiX_cB7P?i02SM7;(UI-)~J+Z0y$i9z-N1 zC&%iz2`0<1pau(5ftLOCJy>1>^homS$;yhOL-g{Ezs-atv43QO{&pnrgG|DUe`w&> z*-DnV8;Jcu>l^0R=iy~`{h3T;gu;I={J1aNoySTnkFX$4KQBL@B`|AXNzcd>^Q@XJ zqztC3Vx=0{`{&OekDZB%S38_3Ch$+sZr{x6U+M1Y=>Zvt+7d|Wxy=Ih+H8@NDoN>TX1@<7{IC2Q$S^ny_787~mcFzFPccM-j3DU{iy|_WpZq4E@F> z7R{>w!Tti^gdI>7{9^q2H14|EcK>guHpsq6 z!1Y>Q8Gtg~1FAGJ=~VZ69t_YhEw4ZNiNrmJwEv6n#{|Et**+9;Ty3R%?8w8z^AZIZ z_UdQ%{)mNtB9TEoDJ?E9_xOp$dy>GS+cP{z49@`l-YD&VTwYOG$>kU%NsYr7R~XyZ z*|}%#HEzSvbda%=?zZ?r?5Y)rbAKE_z`Pkxy!)t^+r>a9=RZfX`kiB0RK4ws39|~A zQkEKk$Qp?vT3SCU>n+~Z*3~Uy8EzdDlc|99@40XpVxcS#CB#%EaiIBoEr`Q z2Yd~6&6{QhwyLJwx_|uorP$6aYo@E4pXdus@&y$g`O^nTs!rIWs~aa!TE>7F<9LF+1a z>9p9-yXwiH_rW8dv^lEoFH$uEOG#g~gB(j81e40!bb&pyxK(9kWeqtwwxh}X#$Jtp zGN?P*93R56qu5OH7${K8*-7yANxr+gd!p+z`A66!<@(=2^rj5UC3g7_7|eX;SNyMs zl8YSxvxQA1FZrvc_G7|@nHlT75Ye10m9_DoOP0ji?|wv_mt%Vxnlb5E@&II08{=8n z&`L{$&+It@lKTw@P`?72RrJ^gl!0XL&Sk-Ex?%uFnNiSx3nX}~frkU!n~zwgnJ^5- zrtREOpfH66HNzmkx#8S+&?oglZ#4ADxS&H6Oz95gT7>RzAcUEP)8{xcmToEw8LFq$DNjlHHLB&;gY%o~XxTlAjIRll09bO7rr% zlBd@uCMTJ)g3i}goa^^~iH#JS@0=<;V)arUbdm_TJwe`1t&+n*LR!k42PlIJ0Al>@ zn%@#UHm>v9`k@S4=xC#B$gfS5$^V#x}o`e&w$PN~3?V9(^0| z;4A=!T><7RmcDrH`M9U#ga%H%Wov}4H^{5BAD<7zjWA1kbnJ0(DZ|?-x06s2ULs-y zF16?f3sze`fRrvB&es>aUKVRI1hMEOhDA#BG00BZ0gd0baY5bCkj<@`Az88VHO1_Q z!j64Do;Xk=P$PA|0JWH_Q-B`Kj4EF0CT7?Y30bosMZ4!oOJLpvC7QNUGz|6(zL!U% zl!X9CtAgs&Vu@v|8_-(!!k0D<+LyW6#>oPvMw8>?4h~}mbeK{DJ};2$rDB1_(oW!x zfAk&Sztl=6#J{*-CY2)uRzp^EpzQ<^ZTymr&6$R}gK!43u`&>GUw?k~&G&G1fMalI zNZa>Y=+=?CQrzu_UHfbHytvhcg@tRwz||}@U0*brW3$!~5JmHald|sIA7;SBW(~Vc z5^QGujomgAk3b}HfpVRGlVmV(B12dvn;`T__wCck82(gG^vgRgz)-|QMMtnx>K$!7 zu1En1_jJ-`Ke6!`_nHE>h$i+SgwtI>i1)K;QDdXb{@9DS*Ptl1XxlVvZvN~URTrqn zsxQ@)iVlmhNH>B2umtG1Qfo=cagI6Q-@g|YPG9bK3pVW~X8p6?WAUCUt!-?~B+#2F zHO-+01+mxV)#l6gPpeG;YVG3n9i@ zkP!$1TFI6BFqZWl2q=zbfY}%Xrf)f#U)<>TN!VYyb3lpec%_n5_bd7U^fHV9|NDxk z2qXm(fKAK<75qn2MUfC%7I=^_27aURRZw#Ze3-!}*GAl#eb-^FRSo_l2|K8YROCz8R8Vkt$O>Fr^#stiRO|dS% zyD!+=7y@0mNb59??RY<+Mps~f!%asc#?I=XFg^^b0nq~0b8qtiIDerB$|z$X?fY-| zVa`*~2@!-fXW;r?)eTpqzXRnhX^+)sM|ryWBQj@y6PW-95E=nOP!(PpCYhQ_jo z6X_fUYVkXf#XXR8j24^ERt8<3R|5WEJLz!3AvYu0yPLl%-3x#M4c`0r?}OkdpnQx& zqGu0^G=BSl#k?K?d0D3V4o*8rfxLm+bO#RM5)^BzF0mE;Ml7v*M=%oYK0M=8Mc^WD zdy|ZL_&pu35j~&5?!>p}*)wPVRvw!luW1I?x=mHP0;FTZp%laTV8TI(omCx7>IzgZ z|NZlBJYbpR$AB7X0svR3VDUF6f7o<40+jJ$l()FvtpxC+4~O0>^C(TLNU-W({+WH1 zhps_BdeHms^WMcJkDwr>IttEt@;6aaKmx#-U%j9RJO~Dm=Vxp#sRACfZt7!`7Ki~H zy+3e!li2o!Ex?^jR(NeqoMX9GENDGC99v((8#B&Dr@)2{O_je?KM0BD%;0qw!V|j3 zp%|mwbU3Km-3QVcSAa3ou`MI%pnoOE^Qz#BswnR%*Y<~ijpzJ+o(>v#nCMg@+hnUn57{C=`GtO!*b0<(t9g?6G6TqWCEgt$)PqhIe~*9{RY@RlSy5A7XRQ z!W5d{c_aYbw4hPBJvE29k9?KMADsL+Vnd&V^-YJGuKjq9yHZh? z6A0Ryb5fJS+ir}glMa!xF?%%1JV)kiF>&izTn~{rD7RyqwqjK$96YHpvWHn-Ma9M5 zTWvSQW4&tX^FL1l`5$+Q>=Qc1IoQoP8!asm7$C)P#d%Vk79#4vuma=@O*{_g27K5; zI2|HE!&ZAsx$v&HN$~Ws3N+e1r3pDkf^Y7Kbm9dv*VAA;+TQX%*aB9@1-iZn#Kaa> z1^EtWb>m=7Z50sG{s&IL+jl07r+IPuiWnr=44`?-LLw*Qjb^!0PW0yu-}@oPHn^X1 zm`iRB^%^#+-O3r63Wj>JbZgUekX zg2uRD&K&|5wL#JR=#UdI{PcMK{f<@reKSZ^t74b{WBkdBP~%f>WwhUekd2=>ocda0ARY_P}!*6A2?Aa0ixDP>`&V()|wznrLA|JK-0XgGo@ec8IYS%Mj zkmG*?4OnZ(K7)38-NefSEy?sAO z)s|o;sFaf!^i%Q;`DAymKP`}l(&nbYpP@OnUTm9B*f5brwjq!p^!>+kt;k^ogAb65 zRsJIx7F_85Z!U+FVTCaqoB;WT9;6Q>yYKi>KG=gAbLrV#(DkaSmI`wDF6mpo^>=^@ zb4QogU5AbL3(norFQEGx;n6@e7x!Mp$oYRgr2L?x_k|vV6$Ae6tkhkHIBW}Ow`0PM z{(sW+pl4OItMw9rbGO;Z2AA=Y3ZtaYttXEs`^7PSEhs#QXfB&nbpqzzj|&O;4DYY{ zHnqz^!9OHXdJYBe2t%6Jl8Mdxy&EKNgO1oXSYcT$5on6EMHMQMS;w|Gd*X;PB>&;~ zZi4JzFoH0M1*92u)xHch$K2v1$50Lpdd zXL?%A4->P6+_23+6Xr)lP+DF>dG9)V`dfbt-q7@gYc)C~DI5yvEm!f=*Gd}>7boDD zdlS{o$7f#&L|TH9wwfFWp~B#e@~?Ta+#<&d8P!!a;vcFe;(iCQrqiQ1NO2(BenF*b z3aXQk8^yY|&Mujt1v4aEG#aP#KPpTpL-JXaGaBs?{R#)-W&U{BSj{PR4}bS}IfA4s zOo-(N1U9swDPb%nwN$wath>K|S{oHT1WgwZdd$i7&s@9^E^93-%4{IpMzIx|^WsOE zC9hq?JYf%^&DORh@%wZtMlk2Zf=uordnAOf_Jmt8PA$tm=L=5tv=b^hk&#{TRTOQK zM2KI#0UbFe!wcc3nI4x(h3{ge;CIJnVU|9m&I4h@?kCMn#+Kkyh;-wm12zG{eygB@ z`jx40#rOPREJ&TZL!8l<%}_cYPua9vL(hmRj3~MUnJu@R+g1Xmi=i4uoIjg7Q5RRl zbPf$%xPJVq3t@iO^Hef(65ynp95vigZF9tf?ADNn$vw|Qm2q*!Ypjr|HrqE=qA$RG z*?5Gv>J7mSZY$b!jtV%SR#QkY61QQmsZIhD-&4E1^yn^#5n#Cdf-`0ujb^Ym+GLL+ zn)~CBf*QHSb>G63A94}tg$HIb6$tz!1%HU@K78L7Pi(n;1Fs}e0FmED9eQ65%GFcL zi8^yZaj`%a4EZ*xuc;dEKZT4JOL|7oj-VYLVv(?Zv#ZXAJ9gU?&NQjirG~%@(LL@8 zbFLZ=_aVn|1oFE9`#{~!fLrp*46*Z$HkJ?Yzxib+&v~9Q%D#N4;%96-NzEq<85h@_ zy!bwriGTN@kxfnpCFrJ40ox&>y8~!{+H4aKWsu3jD}c(`p5LMedp{QAd-7IkN|hL8 z-G17%c&7}9hd`BSk_ZXpd(bfv!dr+01KU!>?%`0?8I(bwknh`+8D*`)Y$(D%4@7*R z!W`2k>hQXUS$+nt-6fI^&S4%)UrvoXmT3h)33Io3%Loy^`hc!L`hol1!EP)uu$2Vu z?3qGC0}vrQpTk!obL=LRLM2cg*)Z)iaEfoc4w|WHx%&9X%(C&BUoNeV)p;ZxlX@cTw%; z5h7G=oHUy)!A73^ls^K(G+bdg&Jy>)#W>*NIdCz3iiA#`q818G_Np5vo?Qyoz%Ps& zAxDkb{(avasr9)h$P(JF&|c1T&K(Z7uqU!Ou^&x{U^%l&qnQ(>M&Z%vsjUA18=D}o zA;}c3t&M{kNh*jZocgS8`=`!~>)kvqeu)$dl6X-ICEW_8ZB2XOw*?^Zhk=V@Hc8B6l%5zfjJye*?gjO4zW3FvX; zuXm$&N}}JP`Qa<4Kbl54z;-arT(y+~GDMA4K8;0%7b4%flF`%HgjDMtbe!`IZG=)V z`uZhK#3HFNs86cxW7&!jL6jOID@lj%Eu(Uh28xA**M?rDC6p0|gQsjR+n6iN@IM0B zs3q$Dil^0|4F`N77;VcDygii;(N$T=jHwV+HR5t;>M;xSVbuP8TKyk-4awEXH@F~; zOQs&zbNodYY(c|8#DwgfSiwo>(zsbI?*YIbUnU z$jH>Pdpr&l2Q+Aunh)7Em<hnIL zD?vxVA=5{*`O?Vxt#=dSkrh$30eb=*)*COPXL~KQBUr7Vqg94hZ=kF-u)=R{onrEoYHn8RJgGr_#%@epF^42Ze>S#9KK^T6rueg-mqGiPuR5g zX2pqz^2*u$|_|}!e zbcowS7Zy63tXptt)Jd0`pm#^ugE<3yp(!49TX_>sVV=I^Tl@!^RZZ1u9bTO=E@DSl zVuft;JSH)71Z*h6JFV7=oq>^0F=p%5^jZ}g%Ele-8>_5<=h$xje!_px~s{Pmv_nEj1?i zZoymdNM`2MOHciscBfLKTjD&pjEwdF_1M=u8?;B9NxEf8+@t-?CUJ4W$3^>P8a~t} z-O%JMYpXMPkG4GK@# Rfj#y!LP0~m=&8lq{{uG(W(5EM diff --git a/app/src/main/res/drawable-xxhdpi/ic_pause.png b/app/src/main/res/drawable-xxhdpi/ic_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..fb63ddc5a73821ef47ef5e19330999245e2b79dd GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^IUvl$3?x5s?2iLdoB=)|u0Z-f7!+45O$Kt9N`m}? z85(A5`$+(K#-1*YAr*|t3*;qO7dIG+aL5Soq#W47#Ub^eM^VLG3jy0Bk6+~NX$oXu YSTvzopr06vo_HUIzs literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_play.png b/app/src/main/res/drawable-xxhdpi/ic_play.png new file mode 100644 index 0000000000000000000000000000000000000000..b568f7387c5ef838f455c4c224679379de42717c GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz0wh)Q=esd5FtU5PIEGX(zPT#M!;~Pw_Hf#= z!go)nSwESx`}v&ezMaoAZ>{@#@7t%^YWeAlZ-<0J!P$eESvRIj@9s=I-TnE@hNtK1 z(j@lmJi`+$CzIB8uwDB$P-61qGX{rPjwJr${4l?siRBijK!&=*g1HQhWrR7;<}l1G zW=c87Il)rh0nRabbA6xe6$YLI1_F=ITZ#Bp-j-OFlO5cj#LHj!p7rhIQ|<*EW%je& znA^+~gQWlf literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/img_pause_outline_big.png b/app/src/main/res/drawable-xxhdpi/img_pause_outline_big.png deleted file mode 100644 index 4aa3cd3ccb5ca4fa3d69a21a28add2bd2d69e61a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7171 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 xmuTBuf^h!sE_Zb}duIjmKk|sLTR#8* diff --git a/app/src/main/res/drawable-xxhdpi/img_play_outline_big.png b/app/src/main/res/drawable-xxhdpi/img_play_outline_big.png deleted file mode 100644 index 8e32fbd54f19cb84dbc1b9353e3d0f4e92750256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10332 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

8(C{Ve`$BL z>*hlzRgQ%h8b$qJHq*R$^I>8~dg%YzhPa~_O}8Af=DVJgy^_UHcyx}^GrdgG!AAW* D_8klJ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_panorama.png b/app/src/main/res/drawable-xxxhdpi/ic_panorama.png index bc62927694040f09838967dd37d7f1340403c46f..deaad2e1cebfc6b3dc6de84a935946270cdc489a 100644 GIT binary patch literal 1190 zcmV;X1X=ruP)9)A88oM1*~$GVWbj!A{Bl32L-Ds{7qj{ihYoh!5qeJjxg8;naIj2BC)G4 ztR{}z$6bfrdEM_5`fxN?M-Y}RjF&+iEf>T|gpcsi5%taw; z+&thI`&q&m`qPkl#puU2Zlm1|vWotw&Rf)TbCLx#A*tw$J@W z%n4>ulUQOfVpEe@oIpVhg@K|UW}wCadXdpc8%QgZtSfYkPMB?Aq%?a0V`{M%1v4S@_yL@4dJK_E)&H1_nv z#X5>>38a4_V$hkp1ZJc}9is`<8Tu06Pap#m5llta^MOEZ5`D0ez(um3rbP1-NcTh( zWGW9)V-+Ey4}zGEI`7#{U-A(gSRn0*2&M$Hxro9aK>tLj_lk;Q4C3=M#u{sQpnpjr#vzDyJh4+E)OgK6g2iaWW+9Pw zNkpJNGnaT`7BaKT9*GD8fhIw4D=oM2q&Sdh7{gIT$EaVi5NgwHJETswY z#c7B`RVMH&j}83IwdP4LNJwy-DL-Y_mL=VwJ^q?o``3V33000004lW=jTw5k2SO5S307*qoM6N<$ EfuLn#uO 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

;KVfzDRhI4H7ZBDxfN37l9+Err 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 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pause.png b/app/src/main/res/drawable-xxxhdpi/ic_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea7e03e5dc315fcca0178a146ad2eb1b013c15a GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^6F`^|NHCnYy)O!+m`Z~Df*BafCZDwc^3*+D978G? wlNIE9ngS2}|Nozzqcc7u1OYp847l7F8Cs>jNuFVdQ&MBb@0ISd)(EtDd literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_play.png b/app/src/main/res/drawable-xxxhdpi/ic_play.png new file mode 100644 index 0000000000000000000000000000000000000000..0bdaa8d04702b4920ec69b1e1a9606ad705831a2 GIT binary patch literal 361 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 L2l*ZL4cGn$ay0zA diff --git a/app/src/main/res/drawable-xxxhdpi/img_play_outline_big.png b/app/src/main/res/drawable-xxxhdpi/img_play_outline_big.png deleted file mode 100644 index b8d6cff39ea077fb38fb8f0de73a6059ea816a5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6171 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 diff --git a/app/src/main/res/drawable/circle_black_background_with_inset.xml b/app/src/main/res/drawable/circle_black_background_with_inset.xml new file mode 100644 index 000000000..6bab48721 --- /dev/null +++ b/app/src/main/res/drawable/circle_black_background_with_inset.xml @@ -0,0 +1,7 @@ + + diff --git a/app/src/main/res/layout/pager_photo_item.xml b/app/src/main/res/layout/pager_photo_item.xml index 3a9b587bc..8d35ed318 100644 --- a/app/src/main/res/layout/pager_photo_item.xml +++ b/app/src/main/res/layout/pager_photo_item.xml @@ -23,8 +23,8 @@ android:layout_width="@dimen/play_outline_size_big" android:layout_height="@dimen/play_outline_size_big" android:layout_centerInParent="true" - android:background="@android:color/transparent" - android:padding="@dimen/big_margin" + android:background="@drawable/circle_black_background_with_inset" + android:padding="28dp" android:src="@drawable/ic_panorama" android:visibility="gone"/> diff --git a/app/src/main/res/layout/pager_video_item.xml b/app/src/main/res/layout/pager_video_item.xml index 3845d13e4..26fdf7b1e 100644 --- a/app/src/main/res/layout/pager_video_item.xml +++ b/app/src/main/res/layout/pager_video_item.xml @@ -41,9 +41,9 @@ android:layout_width="@dimen/play_outline_size_big" android:layout_height="@dimen/play_outline_size_big" android:layout_centerInParent="true" - android:background="@android:color/transparent" - android:padding="@dimen/big_margin" - android:src="@drawable/img_play_outline_big"/> + android:background="@drawable/circle_black_background_with_inset" + android:padding="26dp" + android:src="@drawable/ic_play"/> 120dp 30dp 38dp - 200dp 60dp diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 78adecbeb..3524f5ac0 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -5,7 +5,7 @@ 20dp 22dp 26dp - 130dp + 96dp 60dp 60dp 30dp From bb8acad55ec2014bbfd3dcb0d286e43616f54500 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 6 Jul 2018 13:00:45 +0200 Subject: [PATCH 15/90] adding some null checks at deleting files/folders --- .../gallery/adapters/DirectoryAdapter.kt | 20 ++++++++++--------- .../gallery/adapters/MediaAdapter.kt | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt index e41fec139..13025e2bc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -380,17 +380,19 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList Date: Fri, 6 Jul 2018 19:53:52 +0200 Subject: [PATCH 16/90] update commons to 4.3.31 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 93eefa930..71b0263ce 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.3.27' + implementation 'com.simplemobiletools:commons:4.3.31' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.android.support:multidex:1.0.3' implementation 'it.sephiroth.android.exif:library:1.0.1' From e5487049ba3e039245906ac09d7e40fbb9abd034 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 6 Jul 2018 19:59:50 +0200 Subject: [PATCH 17/90] update version to 4.3.3 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 71b0263ce..980f5e500 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "com.simplemobiletools.gallery" minSdkVersion 16 targetSdkVersion 27 - versionCode 184 - versionName "4.3.2" + versionCode 185 + versionName "4.3.3" multiDexEnabled true setProperty("archivesBaseName", "gallery") } From 1b53e2f7f2d9527c944258633b61fa5826e42bdf Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 6 Jul 2018 19:59:56 +0200 Subject: [PATCH 18/90] updating changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71859cfcc..c2afc5207 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Changelog ========== +Version 4.3.3 *(2018-07-06)* +---------------------------- + + * Couple stability improvements and glitch fixes + Version 4.3.2 *(2018-07-04)* ---------------------------- From d8ebe8a7f20fb3d261b20d3ea0fc18ceef1366ee Mon Sep 17 00:00:00 2001 From: Can Date: Fri, 6 Jul 2018 22:53:46 -0500 Subject: [PATCH 19/90] Translate missing strings in german Translated: ``` force_portrait force_landscape use_default_orientation ``` --- app/src/main/res/values-de/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 449f6819f..00ac48fcc 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -25,9 +25,9 @@ Bildschirmausrichtung sperren Bildschirmausrichtung entsperren Change orientation - Force portrait - Force landscape - Use default orientation + Hochkant erzwingen + Breitbild erzwingen + Standard Ausrichtung benutzen Filter From 1ef29846d0388dc662e9718673cfd991425c7aae Mon Sep 17 00:00:00 2001 From: Roberto Bellingeri Date: Mon, 9 Jul 2018 09:02:10 +0200 Subject: [PATCH 20/90] fixing --- app/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 8a0ed22f9..e475fd153 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -27,7 +27,7 @@ Cambia orientamento Forza verticale Forza orizzontale - Usa l'orientamento predefinito + Usa l\'orientamento predefinito Filtra i media From 8222fea9409a74e0af568648cd2d55b6e702bc8d Mon Sep 17 00:00:00 2001 From: petitdream <41042219+petitdream@users.noreply.github.com> Date: Tue, 10 Jul 2018 16:30:30 +0900 Subject: [PATCH 21/90] Add files via upload --- app/src/main/res/values-ja/strings.xml | 100 ++++++++++++------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 682cc47fa..d657e4c86 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1,4 +1,4 @@ - + シンプル ギャラリー ギャラリー @@ -13,7 +13,7 @@ すべてのフォルダ フォルダを選択する その他のフォルダ - 地図で表示 + 地図上で表示 位置情報がありません 列数を増やす 列数を減らす @@ -23,40 +23,40 @@ 音量 明るさ 画面の向きを固定する - 向きの固定を解除する - Change orientation - Force portrait - Force landscape - Use default orientation + 固定を解除する + 向きを固定する + 縦で固定 + 横で固定 + デフォルト仕様 - 表示するメディアの種類 + 表示する形式 画像 ビデオ GIF - RAW images - 絞り込み条件に該当するメディアがありません。 + RAW + 条件に該当するメディアがありません。 絞り込み条件を変更 - 対象のフォルダに「.nomedia」というファイルを作成し、フォルダを非表示にします。そのフォルダ以下のすべてのサブフォルダも、同様に非表示となります。非表示となったフォルダを見るには、「設定」の中にある「非表示のフォルダを表示」オプションを切り替えてください。このフォルダを非表示にしますか? + 対象のフォルダに「.nomedia」ファイルを作成し、フォルダを非表示にします。そのフォルダの中にあるすべてのサブフォルダも非表示となります。非表示のフォルダを見るには、「設定」の中にある「非表示のフォルダを表示」で切り替えてください。このフォルダを非表示にしますか? 除外する 除外フォルダ - 除外フォルダを管理 - 選択したフォルダとそのサブフォルダを、Simple Galleyの一覧から除外します。除外したフォルダは「設定」で管理できます。 + 除外フォルダの管理 + 選択したフォルダとそのサブフォルダを、Simple Galleyの一覧から除外します。除外したフォルダは「設定」で確認できます。 親フォルダを選択して除外することもできます。 フォルダを除外すると、サブフォルダも含めSimple Galleyの一覧から除外します。他のアプリでは引き続き表示されます。\\n\\n他のアプリでも非表示にしたい場合は、「非表示」機能を使用してください。 すべて解除 除外するフォルダの登録をすべて解除しますか? フォルダ自体は削除されません。 非表示フォルダ - 非表示フォルダを管理する - \".nomedia\"ファイルで隠されたフォルダはありません。 + 非表示フォルダの管理 + \".nomedia\"で隠されたフォルダはありません。 追加フォルダ - 追加フォルダを管理 + 追加フォルダの管理 フォルダを追加 - メディアを含んでいるフォルダがアプリから認識されていない場合は、手動で追加できます。 + メディア入りのフォルダがアプリで認識されない場合は手動で追加します。 リサイズ @@ -67,7 +67,7 @@ 解像度を正しく入力してください - エディター + 画像編集 保存 回転 パス @@ -79,7 +79,7 @@ 元のファイルを上書きできません 左に回転 右に回転 - 180º回転 + 180o回転 反転 水平方向に反転 垂直方向に反転 @@ -115,55 +115,55 @@ 表示形式の変更 グリッド リスト - Group direct subfolders + サブフォルダでグループ化 - Group by - Do not group files - Folder - Last modified - Date taken - File type - Extension + グループ分け + 何もしない + フォルダ + 最終更新 + 撮影日時 + ファイル形式 + 拡張子 ビデオを自動再生する ファイル名の表示を切り替え - ビデオをリピート再生する - GIF画像のサムネイルをアニメーション表示する + ビデオを繰り返し再生する + アニメーションGIFのサムネイルを動かす メディア再生時に明るさを最大にする サムネイルを正方形に切り取る メディア再生時のフルスクリーン表示切り替え システム設定に従う 端末の向きに従う メディアの縦横比に従う - フルスクリーン表示の背景色とステータスバーの背景色を黒にする + 表示の背景色とステータスバーの背景色を黒にする サムネイル画面を横方向にスクロール フルスクリーン時にシステムUIを非表示にする - メディアの削除後にフォルダが空になった場合、そのフォルダを削除する - 垂直のジェスチャーで写真の明るさを制御できるようにする - ビデオ再生中に、音量と明るさを縦方向のジェスチャーで変更する - フォルダの中にあるメディアの数をメイン画面に表示する - フルスクリーンメニューの「共有」を「回転」に置き換える - フルスクリーン画面に詳細を重ねて表示する + フォルダが空になったらフォルダも削除する + 垂直のジェスチャーで写真の明るさを制御する + 音量と明るさを縦のジェスチャーで変更する + フォルダ内のメディアの数を表示する + フルスクリーン時の「共有」を「回転」に置き換える + フルスクリーンに詳細を重ねて表示する 詳細表示を管理する - フルスクリーン表示のメディアを指ひとつでズームできるようにする - 画面の端を押してメディアをすぐに変更できるようにする - ズーム可能な画像をより高画質なものに置き換える - ステータスバーが非表示の時は詳細を表示しない - 無効なファイルを表示しないための調査を行います - Show some action buttons at the bottom of the screen + メディアを指ひとつでズーム可能にする + 画面の端を押してメディアをスライドする + ズームが可能な画像を高画質な物にする + ステータスバーが非表示の時は詳細を隠す + 無効なファイルを見せない調整を行う + 画面下部にアクションボタンを表示 - サムネイル - メディアのみ + サムネイル設定 + メディア設定 詳細も表示する - Bottom actions + 画面下部のアクション - Manage visible bottom actions - Toggle favorite - Toggle file visibility + 表示するアクションの選択 + お気に入り + 表示/非表示の切替 How can I make Simple Gallery the default device gallery? @@ -173,8 +173,8 @@ You can solve it in 2 ways. You can either reinstall the app, or find the app in your device settings and select \"Clear data\". It will reset all your settings, it will not remove any media files. 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. + 動画を早送りするにはどうすればよいですか? + シークバーの隣にある経過時間または最大時間の表示を押すごとに早送り、または巻き戻しが作動します。 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? From fd79d8d3ec10aa39f2269cf8221c182dcb2a4d6d Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 10 Jul 2018 20:20:26 +0200 Subject: [PATCH 22/90] adding some crashfixes --- app/build.gradle | 2 +- .../simplemobiletools/gallery/adapters/DirectoryAdapter.kt | 4 ++++ .../com/simplemobiletools/gallery/fragments/VideoFragment.kt | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 980f5e500..2fc857262 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.3.31' + implementation 'com.simplemobiletools:commons:4.4.1' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.android.support:multidex:1.0.3' implementation 'it.sephiroth.android.exif:library:1.0.1' diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt index 13025e2bc..5bfbca020 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -72,6 +72,10 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList Date: Thu, 12 Jul 2018 10:13:28 +0200 Subject: [PATCH 23/90] PL translation update [2018.07.12] --- app/src/main/res/values-pl/strings.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 12ef62006..d6ecc8826 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1,6 +1,6 @@ - Prosta Galeria + Prosta galeria    Galeria Edytuj Uruchom aplikację aparatu @@ -24,10 +24,10 @@ Jasność Zablokuj orientację ekranu Odblokuj orientację ekranu - Change orientation - Force portrait - Force landscape - Use default orientation + Zmień orientację ekranu + Wymuś pionową + Wymuś poziomą + Używaj systemowej Filtruj multimedia @@ -158,12 +158,12 @@    Miniatury    Widok pełnoekranowy    Dodatkowe szczegóły - Bottom actions + Przyciski na dolnym pasku - Manage visible bottom actions - Toggle favorite - Toggle file visibility + Zarządzaj przyciskami na dolnym pasku + Ulubione + Widoczność plików    Jak mogę ustawić tą aplikację jako domyślną aplikację galerii? From 75219668b456903cf8067e4ea1c8d96d0ba7751e Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 12 Jul 2018 14:31:47 +0200 Subject: [PATCH 24/90] use the un/hide icons from Commons library --- app/build.gradle | 2 +- .../gallery/adapters/DirectoryAdapter.kt | 2 +- .../gallery/extensions/Activity.kt | 5 +++++ .../gallery/fragments/VideoFragment.kt | 1 - app/src/main/res/drawable-hdpi/ic_hide.png | Bin 877 -> 0 bytes app/src/main/res/drawable-hdpi/ic_unhide.png | Bin 682 -> 0 bytes app/src/main/res/drawable-xhdpi/ic_hide.png | Bin 917 -> 0 bytes app/src/main/res/drawable-xhdpi/ic_unhide.png | Bin 810 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_hide.png | Bin 1852 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_unhide.png | Bin 1649 -> 0 bytes app/src/main/res/drawable-xxxhdpi/ic_hide.png | Bin 1266 -> 0 bytes app/src/main/res/drawable-xxxhdpi/ic_unhide.png | Bin 1186 -> 0 bytes build.gradle | 2 +- 13 files changed, 8 insertions(+), 4 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/ic_hide.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_unhide.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_hide.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_unhide.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_hide.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_unhide.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_hide.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_unhide.png diff --git a/app/build.gradle b/app/build.gradle index 2fc857262..c0261b3ff 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.4.1' + implementation 'com.simplemobiletools:commons:4.4.10' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.android.support:multidex:1.0.3' implementation 'it.sephiroth.android.exif:library:1.0.1' diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt index 5bfbca020..761a06cce 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -99,9 +99,9 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList renameDir() R.id.cab_pin -> pinFolders(true) R.id.cab_unpin -> pinFolders(false) - R.id.cab_hide -> toggleFoldersVisibility(true) R.id.cab_empty_recycle_bin -> emptyRecycleBin() R.id.cab_empty_disable_recycle_bin -> emptyAndDisableRecycleBin() + R.id.cab_hide -> toggleFoldersVisibility(true) R.id.cab_unhide -> toggleFoldersVisibility(false) R.id.cab_exclude -> tryExcludeFolder() R.id.cab_copy_to -> copyMoveTo(true) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt index 224067c83..ff28bb642 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt @@ -151,6 +151,11 @@ fun BaseSimpleActivity.removeNoMedia(path: String, callback: (() -> Unit)? = nul fun BaseSimpleActivity.toggleFileVisibility(oldPath: String, hide: Boolean, callback: ((newPath: String) -> Unit)? = null) { val path = oldPath.getParentPath() var filename = oldPath.getFilenameFromPath() + if ((hide && filename.startsWith('.')) || (!hide && !filename.startsWith('.'))) { + callback?.invoke(oldPath) + return + } + filename = if (hide) { ".${filename.trimStart('.')}" } else { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt index eeb6de4d9..f932ec7d0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -406,7 +406,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mView?.video_play_outline?.setImageResource(R.drawable.ic_play) mView?.video_play_outline?.alpha = PLAY_PAUSE_VISIBLE_ALPHA activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - } private fun videoEnded() = mExoPlayer!!.currentPosition >= mExoPlayer!!.duration diff --git a/app/src/main/res/drawable-hdpi/ic_hide.png b/app/src/main/res/drawable-hdpi/ic_hide.png deleted file mode 100644 index b46cb212a8f2283974c2fb0db867f8c023be5833..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 877 zcmV-z1CsoSP)(FAS8SV$qZ zm>4Xqjqwi{YpqQ*u~9S>Vntz$jY09NSBSETCPvW250LDAEM^vFFZb@7U zB;_PUlKx2gCh3!z%`KY_Xaz=D(DQisfL`D(Fa}Hmvp@tCfEhpb&d)guwA2FXbpTZo zKHv=Slgjl4xW24?2{b1_wFb|7fFD&r0sI0k1M8Ox)#aTOH6K2}JXA3>SAeU)0Pr3c zz9bcZN5J-KVcLQ51c&kPtxK@o0Q3WsWmanpXs;Az50Ee8tR#G8{A|S~NR;Ad0_ezc z(gM6G15;E<_5lsR1>gv-9E4DxGyYt9y#sES`9~2jmF5gMjoauCfu>;mJn4HX0&bXe5X!mkvt5m)`w6an3Fm>e*Y0d&vL-2%J_#^c#nggPAfAIR|i z6lj#BI&X7SQfK<^k|e#ABs2Rc>3%TYDd_>wY-X6*kfd{x_6BptGkhPE)Fnx4{6Lgp zAeEkbh1jzLl7@jEGs~OVAkYvzrvm?V^BnvUs+tZlO|`o?;Es!HxOTK!&BUN;cg4cBCw;&jT(>ywUs%BH ztyw=dhU+BzaQ)S@0BX_2Ayn!fssL`S7Op{!-q&wQQ*zg!zroxsl7{4}x#X@`-DdW6 zsqbI5SX|?38@?q%h4;P>R9c7r1Jp3EZ>3pQRTKRK&uFr{KNq%Q00000NkvXXu0mjf D(6@%Z diff --git a/app/src/main/res/drawable-hdpi/ic_unhide.png b/app/src/main/res/drawable-hdpi/ic_unhide.png deleted file mode 100644 index 4791d9f7d6f29effc3f86317d84c4eb3d58ef77f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 682 zcmV;b0#*HqP)NyjB+T=!o|+me0+K~Nt$5O7k`4cE>~I_6+ToTcud{z$4yT9&jN z1i`N)a27}bcmQlMxVBtuVLw2|fqTGi0+4R)0(XINYs}a!1I|c#DCv@@(z>LI zq?+rSmNX}+V8pzVR1Sim=J`JsW)`R!v;7Gy027|r31HEA;`9|b+b_&HVBJXeo<7b4 zFa=bBR!p8XV76D19Pqiv$`m60QJ@6ecC7@Ac0p|z`91+T3+Rb4qb9Hr@g4=1fJVgA zaD9^zU)ja_)B+yG!CW(70KVhSj9Zx{!}|iaQa~11HM}k0YBx*Oe8#f7T=STOcE~ujWOC*VR(=n$Al)Yth_e#S~t02$lv?o=q~cN)mh~K?stp>_ZgHbRjOg@A09J{E~2}s QbpQYW07*qoM6N<$f?_~1p#T5? diff --git a/app/src/main/res/drawable-xhdpi/ic_hide.png b/app/src/main/res/drawable-xhdpi/ic_hide.png deleted file mode 100644 index 62db2751092b69f42d3a5cada2f669bca7d79f37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 zcmV;G18V$tw z7){WZ(3SD>1SH}@6W>62o0s{8!s zd{f<3r%NiSq>@TnbOLICUSRt|*AlF__@@}XS#l6SAGuo85Rp9)7uzSPCTn<1(*7ul zp1Dkb^^*2WYL?U_X{)4ll2%H}NSc&1F6p(T5lMrRdZH-$P&5)70vPj|3E&ElAzT^Y z0dNYaTrdb=4KP#yK(@XB7l1XzhG?8e2!Kz(NnqBaJzo%m)_pStg7g3ziv_R`cA14n>Oz%rm5sE^0GfoV^O_dxSpi*E-eQj!EOu|O?w!xLfxXfL$*gP#9ZLHh)7 z8u;zuKLxagn(qR>d;UvvfjHyo{}pKRHLV6-1{9wN0aO8ZF)P$rpu&;wrl+pZEyYdy^=4k}xMQn(R4uKfPnhD^#XU-X*C8_u_U^D>W zSR7XfM5lG_Xh7a!V3`Zxcz_AO=B(HTX20}l5ChiumcZN{E`Wi&VYymv#k-#4B#67# zSb1RX{=c!=Q<0fPl`eZ4aokfYDd)>BilQ%)4tvC=smxWxr9czAS9zRpp9|uv=RPIrA<{o+vUL-yQFHh;0`EK_ zhT`091r?uVw%3s~Nz<5a_9&)3Cb9j7DB&jGTV8B{QEt2*~+9|1C(t4T0 z-7-l(WDa*ZFR3qzqVYJsLDC)NHg%~7%8O3Gwzk5(u r@q}U>^vPV`+1<|n<(clz z%#KKc1PKx(NN|XeibDiAE+V}m(jy|LMIy3FCufPRO)LS z{*eGQ0fWG6U>ASv8tx#__%DOE0FQyq2%-1GrqOJvW$+Ym2lyUia2wx%+dwRjb~t<+ zFjvFiHs*k~xWbYh72J!7V%~pM(pT5s@Viku%oy zxChs6Yim_PK}23Te*tnFY#3cu@Cy9>{`d@|7b=zqyikg51ML%3$(@(K2$^sxCN}&F!(xfleo84tU{WBN5Dpm z!8d@1Ky%H4I|^wa*o2xV`qtvS(a??W4#c&&drU-f5^U~v%b(5Nqo&E01e?2`B-q@2 oBf;kGdK~@<5+q2FAi<%ce;&MQZ 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 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_unhide.png b/app/src/main/res/drawable-xxxhdpi/ic_unhide.png deleted file mode 100644 index 8382da2ea7cd5644eecad835b2ec6cc86c7440f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1186 zcmV;T1YP@yP)#qQHqLiSedj z3xyDG+R%6)n5GR)SQ9m}Sh|HM1ZZjL%yjzk{Jt|~e*fuAOUU~?QXmir1OkCTAP@)y zo&ppwj~Whff);LYn?7R1=;JmwXyF8hs9_!jdeShN#T?->F)U(S;#;bitck}I)^Uai z>4FFrv5B%!X<{)kY}zQ09Xb4r z)kcj0o3T1Yj;yG~szFIn#vYpKAxe}UnyIB!NpTXZowDIwV%Ypkp%PF^BXRuV9H&?b zDB> zlRWvc8aIXVpa&OS@}LMeAIpz6+=S#o6c-VB5XMcb{Aj~XNFGFS5s?RB+_cJ%)wn5? z2R*pxk_Sb&St&pA=*C64JZQ#6lRT)v#VvA`h|h7cTprZoVy8S={LSC7YcSalJS58D~xaYooCAHwuv^^H>DdH%s_lM=9!K1TC^ zY9(MRR@a%L)R<2cn>$QZ0%lRqFn+@vW2O=?jeFQcsFV#~V%4amC}9^(bP*v!7ftM> zSV?gjs~xf;hf`Q>(ipH6s}tnNjsn`SiBY9Av6NwKS_sPx)47SwAXQ2OOBuxGIxou| zWprQ@W3wEwm0@gdQmphan@+4wQY0g$aT==*N|ip!_!FzUY$2=^2(yiQSp7k%#)g+T zhg}bQDAp(_VIRHNo#jQ19bt~*BF=dZP)!9zgb7nb1uHm6J0rOGfsitV^$aqe2KYpo z#oJtAyj-SSnMXeR7$Vyqv6nn$3vci%+4KvqE8F;hcCz6-?`wRJ!xGMtNoQF?j>Z?2 z9HpPJ>gPu)HBp$%TACOl9YZv+mPwj;Okxp-xj+<)2p2faLY~!=h7gr(ppJUZagAQ? z6D7)hdb!3q>ZxNrm4p-s1OkCTAP@)y0)eN%|Cfq*J=XK$7XSbN07*qoM6N<$f|%0{ AtpET3 diff --git a/build.gradle b/build.gradle index ce1386288..82672aab8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.2.50' + ext.kotlin_version = '1.2.51' repositories { jcenter() From a2aced3cd6625bfa7371edb9d1f4a59d8372e241 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 12 Jul 2018 14:37:09 +0200 Subject: [PATCH 25/90] updating the default splash activity in manifest --- app/src/main/AndroidManifest.xml | 33 +++++++++++++------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4cf7f3e97..d6c4a88c9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,13 +25,7 @@ - - - - - - + android:theme="@style/SplashTheme"/> - - - - - - - - + + + + + + + Date: Sun, 15 Jul 2018 10:15:41 +0200 Subject: [PATCH 26/90] always use proper action menu title text color --- app/build.gradle | 2 +- .../com/simplemobiletools/gallery/activities/MediaActivity.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c0261b3ff..8cdf1875b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.4.10' + implementation 'com.simplemobiletools:commons:4.4.17' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.android.support:multidex:1.0.3' implementation 'it.sephiroth.android.exif:library:1.0.1' diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt index 11d2f36ad..2532c05ed 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt @@ -317,7 +317,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { mPath.startsWith(OTG_PATH) -> mPath.trimEnd('/').substringAfterLast('/') else -> getHumanizedFilename(mPath) } - supportActionBar?.title = if (mShowAll) resources.getString(R.string.all_folders) else dirName + updateActionBarTitle(if (mShowAll) resources.getString(R.string.all_folders) else dirName) getMedia() setupLayoutManager() } else { From 274a50013e34e68267654e33ee44d2921e95769e Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Jul 2018 10:42:30 +0200 Subject: [PATCH 27/90] reinitialize exoplayer on becoming visible, if needed --- .../gallery/fragments/VideoFragment.kt | 45 ++++++++++++------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt index f932ec7d0..0cfc7faa5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -56,7 +56,8 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S private var mIsDragged = false private var mIsFullscreen = false private var mIsFragmentVisible = false - private var mWasInit = false + private var mWasFragmentInit = false + private var mIsExoPlayerInitialized = false private var mCurrTime = 0 private var mDuration = 0 @@ -94,7 +95,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } checkFullscreen() - mWasInit = true + mWasFragmentInit = true mView!!.apply { brightnessSideScroll = video_brightness_controller @@ -120,6 +121,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) {} override fun onPlayerError(error: ExoPlaybackException?) { + mIsExoPlayerInitialized = false activity?.showErrorToast(error.toString()) } @@ -134,6 +136,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) {} override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { + mIsExoPlayerInitialized = playbackState == Player.STATE_READY || playbackState == Player.STATE_ENDED when (playbackState) { Player.STATE_READY -> videoPrepared() Player.STATE_ENDED -> videoCompleted() @@ -151,20 +154,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S override fun onRenderedFirstFrame() {} }) - val isContentUri = medium.path.startsWith("content://") - val uri = if (isContentUri) Uri.parse(medium.path) else Uri.fromFile(File(medium.path)) - val dataSpec = DataSpec(uri) - val fileDataSource = if (isContentUri) ContentDataSource(context) else FileDataSource() - try { - fileDataSource.open(dataSpec) - } catch (e: Exception) { - activity?.showErrorToast(e) - } - - val factory = DataSource.Factory { fileDataSource } - val audioSource = ExtractorMediaSource(fileDataSource.uri, factory, DefaultExtractorsFactory(), null, null) - mExoPlayer!!.audioStreamType = AudioManager.STREAM_MUSIC - mExoPlayer!!.prepare(audioSource) + initExoPlayer() medium.path.getVideoResolution()?.apply { mVideoSize.x = x mVideoSize.y = y @@ -237,6 +227,23 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S checkExtendedDetails() } + private fun initExoPlayer() { + val isContentUri = medium.path.startsWith("content://") + val uri = if (isContentUri) Uri.parse(medium.path) else Uri.fromFile(File(medium.path)) + val dataSpec = DataSpec(uri) + val fileDataSource = if (isContentUri) ContentDataSource(context) else FileDataSource() + try { + fileDataSource.open(dataSpec) + } catch (e: Exception) { + activity?.showErrorToast(e) + } + + val factory = DataSource.Factory { fileDataSource } + val audioSource = ExtractorMediaSource(fileDataSource.uri, factory, DefaultExtractorsFactory(), null, null) + mExoPlayer!!.audioStreamType = AudioManager.STREAM_MUSIC + mExoPlayer!!.prepare(audioSource) + } + override fun setMenuVisibility(menuVisible: Boolean) { super.setMenuVisibility(menuVisible) if (mIsFragmentVisible && !menuVisible) { @@ -244,7 +251,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } mIsFragmentVisible = menuVisible - if (menuVisible && mWasInit) { + if (menuVisible && mWasFragmentInit) { + if (!mIsExoPlayerInitialized) { + initExoPlayer() + } + if (context?.config?.autoplayVideos == true) { playVideo() } From 5b040a699b6224dd642bcd0d28e202d89a710390 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Jul 2018 11:17:21 +0200 Subject: [PATCH 28/90] do not show an error at exoplayer setup fail, just try reinitializing later --- .../gallery/activities/ViewPagerActivity.kt | 5 +---- .../simplemobiletools/gallery/fragments/VideoFragment.kt | 7 ++----- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt index 87e029a27..084ddc475 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -230,6 +230,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } refreshViewPager() + view_pager.offscreenPageLimit = 2 if (config.blackBackground) { view_pager.background = ColorDrawable(Color.BLACK) @@ -1104,10 +1105,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} override fun onPageSelected(position: Int) { - if (view_pager.offscreenPageLimit == 1) { - view_pager.offscreenPageLimit = 2 - } - if (mPos != position) { mPos = position updateActionbarTitle() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt index 0cfc7faa5..d081fd120 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -122,7 +122,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S override fun onPlayerError(error: ExoPlaybackException?) { mIsExoPlayerInitialized = false - activity?.showErrorToast(error.toString()) } override fun onLoadingChanged(isLoading: Boolean) {} @@ -472,11 +471,9 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S }.start() } - override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture?, width: Int, height: Int) { - } + override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture?, width: Int, height: Int) {} - override fun onSurfaceTextureUpdated(surface: SurfaceTexture?) { - } + override fun onSurfaceTextureUpdated(surface: SurfaceTexture?) {} override fun onSurfaceTextureDestroyed(surface: SurfaceTexture?): Boolean { releaseExoPlayer() From a8b1f1935ad749bb315075d1112920404da009d3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Jul 2018 16:23:56 +0200 Subject: [PATCH 29/90] fix #841, avoid blank screen at toggling temporarily show hidden --- .../gallery/activities/MainActivity.kt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt index 22c5853e7..1360fe14a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -58,6 +58,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private var mLoadedInitialPhotos = false private var mIsPasswordProtectionPending = false private var mWasProtectionHandled = false + private var mShouldStopFetching = false private var mLatestMediaId = 0L private var mLatestMediaDateId = 0L private var mLastMediaHandler = Handler() @@ -323,6 +324,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { return } + mShouldStopFetching = true mIsGettingDirs = true val getImagesOnly = mIsPickImageIntent || mIsGetImageContentIntent val getVideosOnly = mIsPickVideoIntent || mIsGetVideoContentIntent @@ -347,7 +349,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private fun showFilterMediaDialog() { FilterMediaDialog(this) { - mLoadedInitialPhotos = false + mShouldStopFetching = true directories_refresh_layout.isRefreshing = true directories_grid.adapter = null getDirectories() @@ -662,6 +664,8 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private fun gotDirectories(newDirs: ArrayList) { // if hidden item showing is disabled but all Favorite items are hidden, hide the Favorites folder + mIsGettingDirs = false + mShouldStopFetching = false if (!config.shouldShowHidden) { val favoritesFolder = newDirs.firstOrNull { it.areFavorites() } if (favoritesFolder != null && favoritesFolder.tmb.getFilenameFromPath().startsWith('.')) { @@ -696,6 +700,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { try { for (directory in dirs) { + if (mShouldStopFetching) { + return + } + val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, favoritePaths) val newDir = if (curMedia.isEmpty()) { directory @@ -748,6 +756,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { // check the remaining folders which were not cached at all yet for (folder in foldersToScan) { + if (mShouldStopFetching) { + return + } + val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, favoritePaths) if (newMedia.isEmpty()) { continue @@ -771,7 +783,6 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } } - mIsGettingDirs = false mLoadedInitialPhotos = true checkLastMediaChanged() From ece7872f8d4fc49888ff42dfba1f7cc3e325bed5 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Jul 2018 16:27:16 +0200 Subject: [PATCH 30/90] fix #844, recognize another image panorama declaration --- .../com/simplemobiletools/gallery/fragments/PhotoFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt index 13abaf0b5..baea1b753 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -349,7 +349,7 @@ class PhotoFragment : ViewPagerFragment() { 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()) - imageParser.contains("GPano:UsePanoramaViewer=\"True\"", true) + imageParser.contains("GPano:UsePanoramaViewer=\"True\"", true) || imageParser.contains("True", true) } catch (e: Exception) { false } From 2862141418b911c4422e7d99ca857d9d548ddca1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Jul 2018 20:06:45 +0200 Subject: [PATCH 31/90] clear the favorites or recycle bin at deleting its folder --- .../gallery/adapters/DirectoryAdapter.kt | 41 +++++++++++++++---- .../gallery/interfaces/MediumDao.kt | 3 ++ 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt index 761a06cce..912ef06ac 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -99,7 +99,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList renameDir() R.id.cab_pin -> pinFolders(true) R.id.cab_unpin -> pinFolders(false) - R.id.cab_empty_recycle_bin -> emptyRecycleBin() + R.id.cab_empty_recycle_bin -> tryEmptyRecycleBin(true) R.id.cab_empty_disable_recycle_bin -> emptyAndDisableRecycleBin() R.id.cab_hide -> toggleFoldersVisibility(true) R.id.cab_unhide -> toggleFoldersVisibility(false) @@ -218,11 +218,19 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList Date: Sun, 15 Jul 2018 20:54:33 +0200 Subject: [PATCH 32/90] update commons to 4.4.19 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 8cdf1875b..85843e624 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.4.17' + implementation 'com.simplemobiletools:commons:4.4.19' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.android.support:multidex:1.0.3' implementation 'it.sephiroth.android.exif:library:1.0.1' From 3186d27d124608d9a0bb7fc62658d0a9e5c3112c Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Jul 2018 21:17:13 +0200 Subject: [PATCH 33/90] add "Set as" as an available bottom action at the fullscreen view --- .../gallery/activities/PhotoVideoActivity.kt | 29 +++++++++++------- .../gallery/activities/ViewPagerActivity.kt | 6 ++++ .../dialogs/ManageBottomActionsDialog.kt | 3 ++ .../gallery/helpers/Constants.kt | 1 + app/src/main/res/drawable-hdpi/ic_set_as.png | Bin 0 -> 301 bytes app/src/main/res/drawable-xhdpi/ic_set_as.png | Bin 0 -> 413 bytes .../main/res/drawable-xxhdpi/ic_set_as.png | Bin 0 -> 509 bytes .../main/res/drawable-xxxhdpi/ic_set_as.png | Bin 0 -> 670 bytes app/src/main/res/layout/bottom_actions.xml | 13 +++++++- .../layout/dialog_manage_bottom_actions.xml | 8 +++++ app/src/main/res/menu/menu_viewpager.xml | 9 +++--- app/src/main/res/menu/photo_video_menu.xml | 3 +- 12 files changed, 55 insertions(+), 17 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_set_as.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_set_as.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_set_as.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_set_as.png diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt index 10c636fea..a3657295d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt @@ -48,8 +48,6 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList finish() } } - - initBottomActions() } override fun onResume() { @@ -88,14 +86,15 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList showSystemUI(true) val bundle = Bundle() val file = File(mUri.toString()) + val filename = getFilenameFromUri(mUri!!) val type = when { - file.isImageFast() -> TYPE_IMAGES - file.isVideoFast() -> TYPE_VIDEOS - file.isGif() -> TYPE_GIFS + filename.isImageFast() -> TYPE_IMAGES + filename.isVideoFast() -> TYPE_VIDEOS + filename.isGif() -> TYPE_GIFS else -> TYPE_RAWS } - mMedium = Medium(null, getFilenameFromUri(mUri!!), mUri.toString(), mUri!!.path.getParentPath(), 0, 0, file.length(), type, false, 0L) + mMedium = Medium(null, filename, mUri.toString(), mUri!!.path.getParentPath(), 0, 0, file.length(), type, false, 0L) supportActionBar?.title = mMedium!!.name bundle.putSerializable(MEDIUM, mMedium) @@ -114,6 +113,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList val isFullscreen = visibility and View.SYSTEM_UI_FLAG_FULLSCREEN != 0 mFragment?.fullscreenToggled(isFullscreen) } + + initBottomActions() } override fun onConfigurationChanged(newConfig: Configuration?) { @@ -132,12 +133,13 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.photo_video_menu, menu) + val visibleBottomActions = if (config.bottomActions) config.visibleBottomActions else 0 menu.apply { - findItem(R.id.menu_set_as).isVisible = mMedium?.isImage() == true - findItem(R.id.menu_edit).isVisible = mMedium?.isImage() == true && mUri?.scheme == "file" && !config.bottomActions - findItem(R.id.menu_properties).isVisible = mUri?.scheme == "file" - findItem(R.id.menu_share).isVisible = !config.bottomActions + findItem(R.id.menu_set_as).isVisible = mMedium?.isImage() == true && visibleBottomActions and BOTTOM_ACTION_SET_AS == 0 + findItem(R.id.menu_edit).isVisible = mMedium?.isImage() == true && mUri?.scheme == "file" && visibleBottomActions and BOTTOM_ACTION_EDIT == 0 + findItem(R.id.menu_properties).isVisible = mUri?.scheme == "file" && visibleBottomActions and BOTTOM_ACTION_PROPERTIES == 0 + findItem(R.id.menu_share).isVisible = visibleBottomActions and BOTTOM_ACTION_SHARE == 0 } return true @@ -183,7 +185,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList } val visibleBottomActions = if (config.bottomActions) config.visibleBottomActions else 0 - bottom_edit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0) + bottom_edit.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_EDIT != 0 && mMedium?.isImage() == true) bottom_edit.setOnClickListener { if (mUri != null && bottom_actions.alpha == 1f) { openEditor(mUri!!.toString()) @@ -196,6 +198,11 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList sharePath(mUri!!.toString()) } } + + bottom_set_as.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SET_AS != 0 && mMedium?.isImage() == true) + bottom_set_as.setOnClickListener { + setAs(mUri!!.toString()) + } } override fun fragmentClicked() { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt index 084ddc475..5a88de033 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -296,6 +296,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View findItem(R.id.menu_edit).isVisible = visibleBottomActions and BOTTOM_ACTION_EDIT == 0 findItem(R.id.menu_rename).isVisible = visibleBottomActions and BOTTOM_ACTION_RENAME == 0 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_save_as).isVisible = mRotationDegrees != 0 findItem(R.id.menu_hide).isVisible = !currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 findItem(R.id.menu_unhide).isVisible = currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 @@ -842,6 +843,11 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View bottom_rename.setOnClickListener { renameFile() } + + bottom_set_as.beVisibleIf(visibleBottomActions and BOTTOM_ACTION_SET_AS != 0) + bottom_set_as.setOnClickListener { + setAs(getCurrentPath()) + } } private fun updateBottomActionIcons(medium: Medium?) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ManageBottomActionsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ManageBottomActionsDialog.kt index a9ef79936..920c3c404 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ManageBottomActionsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ManageBottomActionsDialog.kt @@ -25,6 +25,7 @@ class ManageBottomActionsDialog(val activity: BaseSimpleActivity, val callback: manage_bottom_actions_show_on_map.isChecked = actions and BOTTOM_ACTION_SHOW_ON_MAP != 0 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 } AlertDialog.Builder(activity) @@ -60,6 +61,8 @@ class ManageBottomActionsDialog(val activity: BaseSimpleActivity, val callback: result += BOTTOM_ACTION_TOGGLE_VISIBILITY if (manage_bottom_actions_rename.isChecked) result += BOTTOM_ACTION_RENAME + if (manage_bottom_actions_set_as.isChecked) + result += BOTTOM_ACTION_SET_AS } activity.config.visibleBottomActions = result diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt index a33adcec3..53e17f4f2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt @@ -144,5 +144,6 @@ const val BOTTOM_ACTION_SLIDESHOW = 128 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 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/res/drawable-hdpi/ic_set_as.png b/app/src/main/res/drawable-hdpi/ic_set_as.png new file mode 100644 index 0000000000000000000000000000000000000000..d4de4c2b57dfa7cac7ff29f4ad74e43cddbf681e GIT binary patch literal 301 zcmV+|0n+}7P)pR%`-hRF_WBeA4j4;bA z)7XgrJ+q8skIa+tJ1Cb^oO`F~zo<`I{)>A3zk?g*JF!Tiq{=muj>V;<<}}m_;7XCp z0gi2HXat-n&(}^gGzrcWg>DSIXs8byDGIs7y&VlT;Mkc*2G%u{z%{x-qhl1^6LlI& z<^I1Y8`ghOU3~l(RnHMjr~jhr!ip;TFKW!_ zG{pmYk*0W{!pJmrgJv|v4W;I4%P)@NB{!`MHGk#F_ZyD0TmFS0tiBgk!AoSq6D&57K3RR!zv9V zJ3&(0y{=dP4?6%jk9B8EuulfrJJVu}4;Dj-pr$oo6ZmA=0%M)db~GRdK#Nrih!ic_yU>6#gb}0( zs;U7E_#sl!d*Dq2-uYeHz9U0eFB(wcZ<&ZaJZZosv=eLt;hkx~9%>sJkVI|9w0K0T z&bS6FfNvtN6C@O1kRoa|jfhe3O$>0N6U0r4S+3El5;rZT*yV~E0I%G#MS_w}NHH8i zjQS=jZiupPA{If!d=q6iM8!8T8bJ)ZAgY8{azVr+h#}v^y&IxNc<1*2NQ4tK&HNHa zX0C`jon`4US25l}Wa%{_fspqC(EtE)%3g>Go`F;PtgHG06Zz6r>lN2600000NkvXX Hu0mjfn(~|& literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_set_as.png b/app/src/main/res/drawable-xxhdpi/ic_set_as.png new file mode 100644 index 0000000000000000000000000000000000000000..60f34eb2015ec8be55cb74fa10c86b5fdfdc313b GIT binary patch literal 509 zcmV|z}Y7)DLfCk&++Be+6*y<<0xNES4xCH`HcRlq1Z5UP_@u||TC_DJhVYmKy% z6hV@@6S}1$)<~_bksgyHSW&n&E0E^vaLNPlAuQ4`{CYzg z4bTAiL5h=*F%G|KYk=1Cvroju_>ZP*fNsJcq^9B%z432v?3`o(exwLEa65KT4)~AM z#+Tz?+E_vPh_5zLav)2rpwz@)=cqW4Sz?VB{-lUFDC|U>$E)5Eb1q5ju^7Bb5piIn z2B;Z&_0xF_enP74E4(HME+gMLJ-NL|NWjBMk>rB$Bh+8Yv4Gt&s|I#TqFW zXRVPkF`rM?R$O^bpw&XriTWJJt2bPah@=%I>A_ac@__H%XEzh5Lpm~ZLV=`N;w3rK zVQZv}!IK=xksQg99LbToStDH*u|+y3VvE#C#1d(u=%qlKBtb_;_Tkk~Nr*`2LFz4f zDUdpgUJ9f(qLl*alLAL0(lDQgoTIk5l185a;qb$sq~JPT00000NkvXXu0mjfdy3>L literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_set_as.png b/app/src/main/res/drawable-xxxhdpi/ic_set_as.png new file mode 100644 index 0000000000000000000000000000000000000000..303e1780f9ac93893d1e92c46efbb36c649dd2ac GIT binary patch literal 670 zcmV;P0%84$P)m4M66A3Tzq&Y-z z8X>!fgqtMRo$!o2x)Z#pqC3Gw7UvOO;Yp8(hqOb>qg-SL;;)P3);6)@^KvMuwLMK_kArL0)R&o&tzy`s^-*Xd6 z4p0ETBNP_72NmQ1-T1yY6c%_3y2=3-g9U=U`7limuoWy2?9GQAa)4uCfne`n4435q z*WovWycSMF4glQccfBI-Kbj90R#VI4=j-4i*UZ=EHW;&!`20z4!SV!K5toLHVLg{{0{{=%$1FONN_~hS!UXvY z;s0j{9rY*laR#A}lL&@j2!>z?hF}PWU + + diff --git a/app/src/main/res/layout/dialog_manage_bottom_actions.xml b/app/src/main/res/layout/dialog_manage_bottom_actions.xml index 0e4bd1dcf..6e58322e4 100644 --- a/app/src/main/res/layout/dialog_manage_bottom_actions.xml +++ b/app/src/main/res/layout/dialog_manage_bottom_actions.xml @@ -102,5 +102,13 @@ android:paddingTop="@dimen/activity_margin" android:text="@string/rename"/> + + diff --git a/app/src/main/res/menu/menu_viewpager.xml b/app/src/main/res/menu/menu_viewpager.xml index 85cd15500..282910e8a 100644 --- a/app/src/main/res/menu/menu_viewpager.xml +++ b/app/src/main/res/menu/menu_viewpager.xml @@ -73,10 +73,6 @@ android:id="@+id/menu_move_to" android:title="@string/move_to" app:showAsAction="never"/> - + + app:showAsAction="ifRoom"/> Date: Sun, 15 Jul 2018 21:25:28 +0200 Subject: [PATCH 34/90] adding a Purchase Thank You button in the app settings --- .../gallery/activities/SettingsActivity.kt | 8 +++++++ app/src/main/res/layout/activity_settings.xml | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt index db12b773a..177f1a904 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt @@ -38,6 +38,7 @@ class SettingsActivity : SimpleActivity() { override fun onResume() { super.onResume() + setupPurchaseThankYou() setupCustomizeColors() setupUseEnglish() setupAvoidWhatsNew() @@ -87,6 +88,13 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupPurchaseThankYou() { + settings_purchase_thank_you_holder.beVisibleIf(!isThankYouInstalled()) + settings_purchase_thank_you_holder.setOnClickListener { + launchPurchaseThankYouIntent() + } + } + private fun setupCustomizeColors() { settings_customize_colors_holder.setOnClickListener { startCustomizationActivity() diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index e9ef6cb2e..6c70a99df 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -11,6 +11,28 @@ android:layout_height="wrap_content" android:orientation="vertical"> + + + + + + Date: Sun, 15 Jul 2018 21:25:40 +0200 Subject: [PATCH 35/90] update version to 4.3.4 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 85843e624..af8ccdc2d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "com.simplemobiletools.gallery" minSdkVersion 16 targetSdkVersion 27 - versionCode 185 - versionName "4.3.3" + versionCode 186 + versionName "4.3.4" multiDexEnabled true setProperty("archivesBaseName", "gallery") } From dd11f99382f69ff943bab99c64ce45dfe4ccfd9d Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Jul 2018 21:25:46 +0200 Subject: [PATCH 36/90] updating changelog --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2afc5207..e13f7fac1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ Changelog ========== +Version 4.3.4 *(2018-07-15)* +---------------------------- + + * Fixed disappearing launcher icon after changing its color on some devices + * Fixed some video related errors + * Added "Set as" as an available action at the fullscreen bottom actions + * Do the appropriate actions at trying to delete the Recycle Bin or Favorites folders + * Fixed a glitch with some panorama images not recognized properly + * Avoid blank screen at toggling "Temporarily show hidden" + Version 4.3.3 *(2018-07-06)* ---------------------------- From 642e3e4c5032ec61f9b25305e34ef56de6664577 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 16 Jul 2018 15:00:07 +0200 Subject: [PATCH 37/90] always pass an arraylist clone to adapters, so the actual items arent updated --- .../simplemobiletools/gallery/activities/MainActivity.kt | 7 +++---- .../simplemobiletools/gallery/activities/MediaActivity.kt | 5 +++-- .../simplemobiletools/gallery/adapters/DirectoryAdapter.kt | 7 ++++--- .../com/simplemobiletools/gallery/adapters/MediaAdapter.kt | 7 ++++--- .../gallery/dialogs/PickDirectoryDialog.kt | 2 +- .../simplemobiletools/gallery/dialogs/PickMediumDialog.kt | 2 +- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt index 1360fe14a..d2bb50de1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -809,7 +809,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { } private fun showSortedDirs(dirs: ArrayList) { - var sortedDirs = getSortedDirectories(dirs).clone() as ArrayList + var sortedDirs = getSortedDirectories(dirs) sortedDirs = sortedDirs.distinctBy { it.path.getDistinctPath() } as ArrayList runOnUiThread { @@ -847,11 +847,10 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { private fun setupAdapter(dirs: ArrayList) { val currAdapter = directories_grid.adapter - val directories = dirs.clone() as ArrayList if (currAdapter == null) { initZoomListener() val fastscroller = if (config.scrollHorizontally) directories_horizontal_fastscroller else directories_vertical_fastscroller - DirectoryAdapter(this, directories, this, directories_grid, isPickIntent(intent) || isGetAnyContentIntent(intent), fastscroller) { + DirectoryAdapter(this, dirs.clone() as ArrayList, this, directories_grid, isPickIntent(intent) || isGetAnyContentIntent(intent), fastscroller) { val path = (it as Directory).path if (path != config.tempFolderPath) { itemClicked(path) @@ -861,7 +860,7 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { directories_grid.adapter = this } } else { - (currAdapter as DirectoryAdapter).updateDirs(directories) + (currAdapter as DirectoryAdapter).updateDirs(dirs) } getRecyclerAdapter()?.dirs?.apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt index 2532c05ed..8f86aaa43 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt @@ -338,7 +338,8 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { if (currAdapter == null) { initZoomListener() val fastscroller = if (config.scrollHorizontally) media_horizontal_fastscroller else media_vertical_fastscroller - MediaAdapter(this, mMedia, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent, mAllowPickingMultiple, media_grid, fastscroller) { + MediaAdapter(this, mMedia.clone() as ArrayList, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent, + mAllowPickingMultiple, media_grid, fastscroller) { if (it is Medium) { itemClicked(it.path) } @@ -806,7 +807,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { mLatestMediaId = getLatestMediaId() mLatestMediaDateId = getLatestMediaByDateId() if (!isFromCache) { - val mediaToInsert = (mMedia.clone() as ArrayList).filter { it is Medium && it.deletedTS == 0L }.map { it as Medium } + val mediaToInsert = (mMedia).filter { it is Medium && it.deletedTS == 0L }.map { it as Medium } galleryDB.MediumDao().insertAll(mediaToInsert) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt index 912ef06ac..fa5bf7dc2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -474,9 +474,10 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList) { - if (newDirs.hashCode() != currentDirectoriesHash) { - currentDirectoriesHash = newDirs.hashCode() - dirs = newDirs + val directories = newDirs.clone() as ArrayList + if (directories.hashCode() != currentDirectoriesHash) { + currentDirectoriesHash = directories.hashCode() + dirs = directories notifyDataSetChanged() finishActMode() } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt index 9438fc4b3..01928ec04 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt @@ -342,10 +342,11 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList fun updateMedia(newMedia: ArrayList) { - if (newMedia.hashCode() != currentMediaHash) { - currentMediaHash = newMedia.hashCode() + val thumbnailItems = newMedia.clone() as ArrayList + if (thumbnailItems.hashCode() != currentMediaHash) { + currentMediaHash = thumbnailItems.hashCode() Handler().postDelayed({ - media = newMedia + media = thumbnailItems enableInstantLoad() notifyDataSetChanged() finishActMode() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickDirectoryDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickDirectoryDialog.kt index 80a0a53f7..653041574 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickDirectoryDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickDirectoryDialog.kt @@ -61,7 +61,7 @@ class PickDirectoryDialog(val activity: BaseSimpleActivity, val sourcePath: Stri return shownDirectories = dirs - val adapter = DirectoryAdapter(activity, dirs, null, view.directories_grid, true) { + val adapter = DirectoryAdapter(activity, dirs.clone() as ArrayList, null, view.directories_grid, true) { if ((it as Directory).path.trimEnd('/') == sourcePath) { activity.toast(R.string.source_and_destination_same) return@DirectoryAdapter diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickMediumDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickMediumDialog.kt index 65cb91e25..1ccef0923 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickMediumDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/PickMediumDialog.kt @@ -64,7 +64,7 @@ class PickMediumDialog(val activity: BaseSimpleActivity, val path: String, val c return shownMedia = media - val adapter = MediaAdapter(activity, shownMedia, null, true, false, view.media_grid, null) { + val adapter = MediaAdapter(activity, shownMedia.clone() as ArrayList, null, true, false, view.media_grid, null) { if (it is Medium) { callback(it.path) dialog.dismiss() From b47868a049d95c7e22c0ae870006b5f5c91d4971 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 16 Jul 2018 20:10:26 +0200 Subject: [PATCH 38/90] do not initially show the "Purchase Simple Thank You" settings button --- app/build.gradle | 2 +- .../simplemobiletools/gallery/activities/SettingsActivity.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index af8ccdc2d..51940dcf9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.4.19' + implementation 'com.simplemobiletools:commons:4.4.21' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.android.support:multidex:1.0.3' implementation 'it.sephiroth.android.exif:library:1.0.1' diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt index 177f1a904..17f13cf52 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt @@ -89,7 +89,7 @@ class SettingsActivity : SimpleActivity() { } private fun setupPurchaseThankYou() { - settings_purchase_thank_you_holder.beVisibleIf(!isThankYouInstalled()) + settings_purchase_thank_you_holder.beVisibleIf(config.appRunCount > 10 && !isThankYouInstalled()) settings_purchase_thank_you_holder.setOnClickListener { launchPurchaseThankYouIntent() } From bcae7cfd7680088f24867215136e2a3104905389 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 16 Jul 2018 20:15:03 +0200 Subject: [PATCH 39/90] do not try setting up exoplayer if it is still null --- .../com/simplemobiletools/gallery/fragments/VideoFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt index d081fd120..de84618b9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -251,7 +251,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mIsFragmentVisible = menuVisible if (menuVisible && mWasFragmentInit) { - if (!mIsExoPlayerInitialized) { + if (!mIsExoPlayerInitialized && mExoPlayer != null) { initExoPlayer() } From fa2eb4f7edeec9b935a7657086dfd7b755a8b940 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 17 Jul 2018 10:26:29 +0200 Subject: [PATCH 40/90] adding some default folders to scan --- app/build.gradle | 2 +- .../com/simplemobiletools/gallery/helpers/Config.kt | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 51940dcf9..8722da5bc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.4.21' + implementation 'com.simplemobiletools:commons:4.4.24' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.android.support:multidex:1.0.3' implementation 'it.sephiroth.android.exif:library:1.0.1' diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt index cf0b1aa63..93d0608df 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.gallery.helpers import android.content.Context import android.content.res.Configuration +import android.os.Environment import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.simplemobiletools.commons.helpers.BaseConfig @@ -367,6 +368,12 @@ class Config(context: Context) : BaseConfig(context) { // if a user hides a folder, then enables temporary hidden folder displaying, make sure we show it properly var everShownFolders: Set - get() = prefs.getStringSet(EVER_SHOWN_FOLDERS, HashSet()) + get() = prefs.getStringSet(EVER_SHOWN_FOLDERS, getEverShownFolders()) set(everShownFolders) = prefs.edit().putStringSet(EVER_SHOWN_FOLDERS, everShownFolders).apply() + + fun getEverShownFolders() = hashSetOf( + internalStoragePath, + Environment.DIRECTORY_DCIM, + Environment.DIRECTORY_PICTURES + ) } From 26d5fef4fdd98423efae7437cd1a6d542308e8db Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 17 Jul 2018 13:56:22 +0200 Subject: [PATCH 41/90] make sure copyRecursively works at moving paths in recycle bin --- app/build.gradle | 2 +- .../com/simplemobiletools/gallery/extensions/Activity.kt | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8722da5bc..f0d83d742 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.4.24' + implementation 'com.simplemobiletools:commons:4.4.27' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.android.support:multidex:1.0.3' implementation 'it.sephiroth.android.exif:library:1.0.1' diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt index ff28bb642..ade2a494c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt @@ -201,14 +201,16 @@ fun BaseSimpleActivity.tryDeleteFileDirItem(fileDirItem: FileDirItem, allowDelet fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList, callback: ((wasSuccess: Boolean) -> Unit)?) { Thread { + val mediumDao = galleryDB.MediumDao() var pathsCnt = paths.size paths.forEach { val file = File(it) val internalFile = File(filesDir, it) try { - file.copyRecursively(internalFile, true) - galleryDB.MediumDao().updateDeleted(it, System.currentTimeMillis()) - pathsCnt-- + if (file.copyRecursively(internalFile, true)) { + mediumDao.updateDeleted(it, System.currentTimeMillis()) + pathsCnt-- + } } catch (ignored: Exception) { } } From 7689da0d439559638cefee84a8a5823d2cef4d51 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 17 Jul 2018 14:10:55 +0200 Subject: [PATCH 42/90] make sure we retrieve the absolute path when working with recycle bin --- .../com/simplemobiletools/gallery/activities/MediaActivity.kt | 2 +- .../simplemobiletools/gallery/activities/ViewPagerActivity.kt | 4 ++-- .../com/simplemobiletools/gallery/adapters/MediaAdapter.kt | 4 ++-- .../com/simplemobiletools/gallery/extensions/Activity.kt | 2 +- .../com/simplemobiletools/gallery/extensions/Context.kt | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt index 8f86aaa43..abf1ae8fd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt @@ -817,7 +817,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { val deletingItems = resources.getQuantityString(R.plurals.deleting_items, filtered.size, filtered.size) toast(deletingItems) - if (config.useRecycleBin && !filtered.first().path.startsWith(filesDir.toString())) { + if (config.useRecycleBin && !filtered.first().path.startsWith(filesDir.absolutePath)) { movePathsInRecycleBin(filtered.map { it.path } as ArrayList) { if (it) { deleteFilteredFiles(filtered) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt index 5a88de033..866d6271e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -302,7 +302,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View findItem(R.id.menu_unhide).isVisible = currentMedium.isHidden() && visibleBottomActions and BOTTOM_ACTION_TOGGLE_VISIBILITY == 0 findItem(R.id.menu_add_to_favorites).isVisible = !currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 findItem(R.id.menu_remove_from_favorites).isVisible = currentMedium.isFavorite && visibleBottomActions and BOTTOM_ACTION_TOGGLE_FAVORITE == 0 - findItem(R.id.menu_restore_file).isVisible = currentMedium.path.startsWith(filesDir.toString()) + findItem(R.id.menu_restore_file).isVisible = currentMedium.path.startsWith(filesDir.absolutePath) findItem(R.id.menu_change_orientation).isVisible = mRotationDegrees == 0 && visibleBottomActions and BOTTOM_ACTION_CHANGE_ORIENTATION == 0 findItem(R.id.menu_change_orientation).icon = resources.getDrawable(getChangeOrientationIcon()) findItem(R.id.menu_rotate).setShowAsAction( @@ -587,7 +587,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } } - val tmpPath = "$filesDir/.tmp_${newPath.getFilenameFromPath()}" + val tmpPath = "${filesDir.absolutePath}/.tmp_${newPath.getFilenameFromPath()}" val tmpFileDirItem = FileDirItem(tmpPath, tmpPath.getFilenameFromPath()) try { getFileOutputStream(tmpFileDirItem) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt index 01928ec04..94b93fb71 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt @@ -109,7 +109,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList 0 - findItem(R.id.cab_restore_recycle_bin_files).isVisible = getSelectedPaths().all { it.startsWith(activity.filesDir.toString()) } + findItem(R.id.cab_restore_recycle_bin_files).isVisible = getSelectedPaths().all { it.startsWith(activity.filesDir.absolutePath) } checkHideBtnVisibility(this) checkFavoriteBtnVisibility(this) @@ -289,7 +289,7 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, callback val mediumDao = galleryDB.MediumDao() paths.forEach { val source = it - val destination = it.removePrefix(filesDir.toString()) + val destination = it.removePrefix(filesDir.absolutePath) var inputStream: InputStream? = null var out: OutputStream? = null diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt index ced21949a..74c98a74a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt @@ -365,7 +365,7 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag val grouped = mediaFetcher.groupMedia(media, pathToUse) callback(grouped.clone() as ArrayList) - val recycleBinPath = filesDir.toString() + val recycleBinPath = filesDir.absolutePath media.filter { !getDoesFilePathExist(it.path) }.forEach { if (it.path.startsWith(recycleBinPath)) { mediumDao.deleteMediumPath(it.path.removePrefix(recycleBinPath)) From fb64c73dbd0d09aacf91f7f24e6765344a3c5b2b Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 17 Jul 2018 15:42:52 +0200 Subject: [PATCH 43/90] update version to 4.3.5 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f0d83d742..e0110f33b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "com.simplemobiletools.gallery" minSdkVersion 16 targetSdkVersion 27 - versionCode 186 - versionName "4.3.4" + versionCode 187 + versionName "4.3.5" multiDexEnabled true setProperty("archivesBaseName", "gallery") } From b0dfba405a63e2653bcb658c223b94dcd8a5f5d0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 17 Jul 2018 15:42:57 +0200 Subject: [PATCH 44/90] updating changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e13f7fac1..c72acc511 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changelog ========== +Version 4.3.5 *(2018-07-17)* +---------------------------- + + * Fixed some Recycle bin related issues + * A few more UX and stability improvements + Version 4.3.4 *(2018-07-15)* ---------------------------- From e90d5334c4d11f08c7368cb3305e51656e9c13bd Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 10:37:44 +0200 Subject: [PATCH 45/90] update commons to 4.5.1 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e0110f33b..49f38c36c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.4.27' + implementation 'com.simplemobiletools:commons:4.5.1' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.android.support:multidex:1.0.3' implementation 'it.sephiroth.android.exif:library:1.0.1' From c71593e90f62f0edce0b3b2d503d5b00c355f622 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 10:50:30 +0200 Subject: [PATCH 46/90] adding a search related crashfix --- .../com/simplemobiletools/gallery/activities/MediaActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt index abf1ae8fd..e16f0bfc6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt @@ -261,7 +261,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener { private fun setupSearch(menu: Menu) { val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager mSearchMenuItem = menu.findItem(R.id.search) - (mSearchMenuItem!!.actionView as SearchView).apply { + (mSearchMenuItem?.actionView as? SearchView)?.apply { setSearchableInfo(searchManager.getSearchableInfo(componentName)) isSubmitButtonEnabled = false setOnQueryTextListener(object : SearchView.OnQueryTextListener { From ec20d67fffc9f462f69063b98052bc14e3b5fdef Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 12:11:05 +0200 Subject: [PATCH 47/90] init exoplayer only if play is pressed --- .../gallery/fragments/VideoFragment.kt | 143 ++++++++++-------- app/src/main/res/layout/pager_video_item.xml | 5 + 2 files changed, 89 insertions(+), 59 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt index de84618b9..e3e7c5a2d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -5,6 +5,7 @@ import android.content.res.Configuration import android.graphics.Point import android.graphics.SurfaceTexture import android.media.AudioManager +import android.media.MediaMetadataRetriever import android.net.Uri import android.os.Build import android.os.Bundle @@ -14,6 +15,7 @@ import android.view.* import android.view.animation.AnimationUtils import android.widget.SeekBar import android.widget.TextView +import com.bumptech.glide.Glide import com.google.android.exoplayer2.* import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory import com.google.android.exoplayer2.source.ExtractorMediaSource @@ -110,56 +112,26 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S video_curr_time.setOnClickListener { skip(false) } video_duration.setOnClickListener { skip(true) } + Glide.with(context!!).load(medium.path).into(video_preview) } mExoPlayer = ExoPlayerFactory.newSimpleInstance(context, DefaultTrackSelector()) - mExoPlayer!!.addListener(object : Player.EventListener { - override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters?) {} + initExoPlayerListeners() - override fun onSeekProcessed() {} - - override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) {} - - override fun onPlayerError(error: ExoPlaybackException?) { - mIsExoPlayerInitialized = false - } - - override fun onLoadingChanged(isLoading: Boolean) {} - - override fun onPositionDiscontinuity(reason: Int) {} - - override fun onRepeatModeChanged(repeatMode: Int) {} - - override fun onShuffleModeEnabledChanged(shuffleModeEnabled: Boolean) {} - - override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) {} - - override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { - mIsExoPlayerInitialized = playbackState == Player.STATE_READY || playbackState == Player.STATE_ENDED - when (playbackState) { - Player.STATE_READY -> videoPrepared() - Player.STATE_ENDED -> videoCompleted() - } - } - }) - - mExoPlayer!!.addVideoListener(object : VideoListener { - override fun onVideoSizeChanged(width: Int, height: Int, unappliedRotationDegrees: Int, pixelWidthHeightRatio: Float) { - mVideoSize.x = width - mVideoSize.y = height - setVideoSize() - } - - override fun onRenderedFirstFrame() {} - }) - - initExoPlayer() medium.path.getVideoResolution()?.apply { mVideoSize.x = x mVideoSize.y = y setVideoSize() } + setupVideoDuration() + + mView!!.video_surface.onGlobalLayout { + if (mIsFragmentVisible && context?.config?.autoplayVideos == true) { + playVideo() + } + } + return mView } @@ -202,6 +174,25 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S } } + override fun setMenuVisibility(menuVisible: Boolean) { + super.setMenuVisibility(menuVisible) + if (mIsFragmentVisible && !menuVisible) { + pauseVideo() + } + + mIsFragmentVisible = menuVisible + if (mWasFragmentInit && menuVisible && context?.config?.autoplayVideos == true) { + playVideo() + } + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + setVideoSize() + initTimeHolder() + checkExtendedDetails() + } + private fun storeStateVariables() { context!!.config.apply { mStoredShowExtendedDetails = showExtendedDetails @@ -243,29 +234,46 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mExoPlayer!!.prepare(audioSource) } - override fun setMenuVisibility(menuVisible: Boolean) { - super.setMenuVisibility(menuVisible) - if (mIsFragmentVisible && !menuVisible) { - pauseVideo() - } + private fun initExoPlayerListeners() { + mExoPlayer!!.addListener(object : Player.EventListener { + override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters?) {} - mIsFragmentVisible = menuVisible - if (menuVisible && mWasFragmentInit) { - if (!mIsExoPlayerInitialized && mExoPlayer != null) { - initExoPlayer() + override fun onSeekProcessed() {} + + override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) {} + + override fun onPlayerError(error: ExoPlaybackException?) { + mIsExoPlayerInitialized = false } - if (context?.config?.autoplayVideos == true) { - playVideo() - } - } - } + override fun onLoadingChanged(isLoading: Boolean) {} - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - setVideoSize() - initTimeHolder() - checkExtendedDetails() + override fun onPositionDiscontinuity(reason: Int) {} + + override fun onRepeatModeChanged(repeatMode: Int) {} + + override fun onShuffleModeEnabledChanged(shuffleModeEnabled: Boolean) {} + + override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) {} + + override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { + mIsExoPlayerInitialized = playbackState == Player.STATE_READY || playbackState == Player.STATE_ENDED + when (playbackState) { + Player.STATE_READY -> videoPrepared() + Player.STATE_ENDED -> videoCompleted() + } + } + }) + + mExoPlayer!!.addVideoListener(object : VideoListener { + override fun onVideoSizeChanged(width: Int, height: Int, unappliedRotationDegrees: Int, pixelWidthHeightRatio: Float) { + mVideoSize.x = width + mVideoSize.y = height + setVideoSize() + } + + override fun onRenderedFirstFrame() {} + }) } private fun toggleFullscreen() { @@ -390,6 +398,11 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S return } + if (mView!!.video_preview.isVisible()) { + mView!!.video_preview.beGone() + initExoPlayer() + } + if (videoEnded()) { setProgress(0) } @@ -426,6 +439,18 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S mCurrTimeView!!.text = seconds.getFormattedDuration() } + private fun setupVideoDuration() { + try { + val retriever = MediaMetadataRetriever() + retriever.setDataSource(medium.path) + mDuration = Math.round(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION).toInt() / 1000f) + } catch (ignored: Exception) { + } + + setupTimeHolder() + setProgress(0) + } + private fun videoPrepared() { if (mDuration == 0) { mDuration = (mExoPlayer!!.duration / 1000).toInt() diff --git a/app/src/main/res/layout/pager_video_item.xml b/app/src/main/res/layout/pager_video_item.xml index 26fdf7b1e..435f4ce1a 100644 --- a/app/src/main/res/layout/pager_video_item.xml +++ b/app/src/main/res/layout/pager_video_item.xml @@ -6,6 +6,11 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + Date: Wed, 18 Jul 2018 13:24:37 +0200 Subject: [PATCH 48/90] use filesDir absolutePath instead of path in some places --- .../kotlin/com/simplemobiletools/gallery/extensions/Activity.kt | 2 +- .../kotlin/com/simplemobiletools/gallery/extensions/Context.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt index 3408cfbd1..6da9f30e3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Activity.kt @@ -205,7 +205,7 @@ fun BaseSimpleActivity.movePathsInRecycleBin(paths: ArrayList, callback: var pathsCnt = paths.size paths.forEach { val file = File(it) - val internalFile = File(filesDir, it) + val internalFile = File(filesDir.absolutePath, it) try { if (file.copyRecursively(internalFile, true)) { mediumDao.updateDeleted(it, System.currentTimeMillis()) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt index 74c98a74a..beae8a757 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt @@ -402,7 +402,7 @@ fun Context.getFavoritePaths() = galleryDB.MediumDao().getFavoritePaths() as Arr fun Context.getUpdatedDeletedMedia(mediumDao: MediumDao): ArrayList { val media = mediumDao.getDeletedMedia() as ArrayList media.forEach { - it.path = File(filesDir, it.path).toString() + it.path = File(filesDir.absolutePath, it.path).toString() } return media } From 92718e5666276a507f7faeba618cf35be0111863 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 14:34:37 +0200 Subject: [PATCH 49/90] make sure only media files get deleted from the viewpager activity --- .../simplemobiletools/gallery/activities/ViewPagerActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt index 866d6271e..f6756927b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -922,7 +922,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private fun deleteConfirmed() { val path = getCurrentMedia().getOrNull(mPos)?.path ?: return - if (getIsPathDirectory(path)) { + if (getIsPathDirectory(path) || !path.isImageVideoGif()) { return } From 3831800715cfd53bb146cd1c6a84f9e9c568fb1b Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 14:44:52 +0200 Subject: [PATCH 50/90] adding some null checks at handling video end --- .../com/simplemobiletools/gallery/fragments/VideoFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt index e3e7c5a2d..27342d095 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -431,7 +431,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } - private fun videoEnded() = mExoPlayer!!.currentPosition >= mExoPlayer!!.duration + private fun videoEnded() = mExoPlayer?.currentPosition ?: 0 >= mExoPlayer?.duration ?: 0 private fun setProgress(seconds: Int) { mExoPlayer!!.seekTo(seconds * 1000L) From b18af5e94e356f01d15cccbf1649c00230009ed7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 15:02:56 +0200 Subject: [PATCH 51/90] do not show Recycle Bin and Favorites content at "Show all folders" --- .../simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt index e4b0aa1d8..26004f645 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt @@ -5,7 +5,9 @@ import android.os.AsyncTask import com.simplemobiletools.commons.helpers.SORT_BY_DATE_TAKEN import com.simplemobiletools.gallery.extensions.config import com.simplemobiletools.gallery.extensions.getFavoritePaths +import com.simplemobiletools.gallery.helpers.FAVORITES import com.simplemobiletools.gallery.helpers.MediaFetcher +import com.simplemobiletools.gallery.helpers.RECYCLE_BIN import com.simplemobiletools.gallery.helpers.SHOW_ALL import com.simplemobiletools.gallery.models.Medium import com.simplemobiletools.gallery.models.ThumbnailItem @@ -21,7 +23,7 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage val getProperDateTaken = context.config.getFileSorting(pathToUse) and SORT_BY_DATE_TAKEN != 0 val favoritePaths = context.getFavoritePaths() val media = if (showAll) { - val foldersToScan = mediaFetcher.getFoldersToScan() + val foldersToScan = mediaFetcher.getFoldersToScan().filter { it != RECYCLE_BIN && it != FAVORITES } val media = ArrayList() foldersToScan.forEach { val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, favoritePaths) From 2091c8bf4b826b6028263c54184099cb844f0fe6 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 16:47:09 +0200 Subject: [PATCH 52/90] update commons to 4.5.2 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 49f38c36c..3b21595ad 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.5.1' + implementation 'com.simplemobiletools:commons:4.5.2' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.android.support:multidex:1.0.3' implementation 'it.sephiroth.android.exif:library:1.0.1' From addae2045e9770a926bf6a2940403b0b99f6b8f7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 17:26:37 +0200 Subject: [PATCH 53/90] delay loading the zoomable image at fullscreen mode to avoid laggy swipes --- .../gallery/fragments/PhotoFragment.kt | 100 ++++++++++-------- 1 file changed, 57 insertions(+), 43 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt index baea1b753..b181e4ebc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -47,7 +47,9 @@ import java.io.File import java.io.FileOutputStream class PhotoFragment : ViewPagerFragment() { - private var DEFAULT_DOUBLE_TAP_ZOOM = 2f + private val DEFAULT_DOUBLE_TAP_ZOOM = 2f + private val ZOOMABLE_VIEW_LOAD_DELAY = 1500L + private var isFragmentVisible = false private var isFullscreen = false private var wasInit = false @@ -55,6 +57,7 @@ class PhotoFragment : ViewPagerFragment() { private var isPanorama = false private var imageOrientation = -1 private var gifDrawable: GifDrawable? = null + private var loadZoomableViewHandler = Handler() private var storedShowExtendedDetails = false private var storedHideExtendedDetails = false @@ -184,7 +187,9 @@ class PhotoFragment : ViewPagerFragment() { private fun photoFragmentVisibilityChanged(isVisible: Boolean) { if (isVisible) { - addZoomableView() + scheduleZoomableView() + } else { + loadZoomableViewHandler.removeCallbacksAndMessages(null) } } @@ -276,8 +281,9 @@ class PhotoFragment : ViewPagerFragment() { } override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { - if (isFragmentVisible) - addZoomableView() + if (isFragmentVisible) { + scheduleZoomableView() + } return false } }).into(view.photo_view) @@ -302,46 +308,53 @@ class PhotoFragment : ViewPagerFragment() { } } - private fun addZoomableView() { - if (!context!!.config.replaceZoomableImages && medium.isImage() && isFragmentVisible && view.subsampling_view.isGone()) { - ViewPagerActivity.wasDecodedByGlide = false - view.subsampling_view.apply { - maxScale = 10f - beVisible() - isQuickScaleEnabled = context.config.oneFingerZoom - setResetScaleOnSizeChange(context.config.screenRotation != ROTATE_BY_ASPECT_RATIO) - setImage(ImageSource.uri(getPathToLoad(medium))) - orientation = if (imageOrientation == -1) SubsamplingScaleImageView.ORIENTATION_USE_EXIF else degreesForRotation(imageOrientation) - setEagerLoadingEnabled(false) - setExecutor(AsyncTask.SERIAL_EXECUTOR) - setOnImageEventListener(object : SubsamplingScaleImageView.OnImageEventListener { - override fun onImageLoaded() { - } - - 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 - setDoubleTapZoomScale(getDoubleTapZoomScale(useWidth, useHeight)) - } - - override fun onTileLoadError(e: Exception?) { - } - - override fun onPreviewReleased() { - } - - override fun onImageLoadError(e: Exception) { - background = ColorDrawable(Color.TRANSPARENT) - beGone() - } - - override fun onPreviewLoadError(e: Exception?) { - background = ColorDrawable(Color.TRANSPARENT) - beGone() - } - }) + private fun scheduleZoomableView() { + loadZoomableViewHandler.removeCallbacksAndMessages(null) + loadZoomableViewHandler.postDelayed({ + if (isFragmentVisible && !context!!.config.replaceZoomableImages && medium.isImage() && view.subsampling_view.isGone()) { + addZoomableView() } + }, ZOOMABLE_VIEW_LOAD_DELAY) + } + + private fun addZoomableView() { + ViewPagerActivity.wasDecodedByGlide = false + view.subsampling_view.apply { + maxScale = 10f + beVisible() + isQuickScaleEnabled = context.config.oneFingerZoom + setResetScaleOnSizeChange(context.config.screenRotation != ROTATE_BY_ASPECT_RATIO) + setImage(ImageSource.uri(getPathToLoad(medium))) + orientation = if (imageOrientation == -1) SubsamplingScaleImageView.ORIENTATION_USE_EXIF else degreesForRotation(imageOrientation) + setEagerLoadingEnabled(false) + setExecutor(AsyncTask.SERIAL_EXECUTOR) + setOnImageEventListener(object : SubsamplingScaleImageView.OnImageEventListener { + override fun onImageLoaded() { + } + + 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 + setDoubleTapZoomScale(getDoubleTapZoomScale(useWidth, useHeight)) + } + + override fun onTileLoadError(e: Exception?) { + } + + override fun onPreviewReleased() { + } + + override fun onImageLoadError(e: Exception) { + background = ColorDrawable(Color.TRANSPARENT) + beGone() + } + + override fun onPreviewLoadError(e: Exception?) { + background = ColorDrawable(Color.TRANSPARENT) + beGone() + } + }) } } @@ -431,6 +444,7 @@ class PhotoFragment : ViewPagerFragment() { Glide.with(context!!).clear(view.photo_view) view.subsampling_view.recycle() } + loadZoomableViewHandler.removeCallbacksAndMessages(null) } override fun onConfigurationChanged(newConfig: Configuration) { From 012007a239225c021366cb2688745e7a1d107a24 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 17:35:11 +0200 Subject: [PATCH 54/90] adding a new string for toggling Recycle Bin visibility at the folders screen --- app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-ca/strings.xml | 1 + app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fi/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-gl/strings.xml | 1 + app/src/main/res/values-hr/strings.xml | 1 + app/src/main/res/values-hu/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ko-rKR/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-nb/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 28 files changed, 28 insertions(+) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 6b8eb5270..b8341aea3 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -157,6 +157,7 @@ إخفاء التفاصيل الموسعة عند إخفاء شريط الحالة قم بإجراء فحص إضافي لتجنب إظهار الملفات التالفة Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen المصغرات diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index b19730f21..1f3a40349 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -153,6 +153,7 @@ Amaga els detalls estesos quan la barra d\'estat està amagada Fer una verificació addicional per evitar que es mostrin fitxers no vàlids Mostra alguns botons d\'acció a la part inferior de la pantalla + Show the Recycle Bin at the folders screen Miniatures diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index af08849c9..839ba5747 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -153,6 +153,7 @@ Hide extended details when status bar is hidden Do an extra check to avoid showing invalid files Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Thumbnails diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 08e7235f5..b484fa566 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -153,6 +153,7 @@ Skjul udvidede oplysninger når statuslinjen er skjult Tjek en ekstra gang for at undgå visning af ugyldige filer Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Thumbnails diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 00ac48fcc..eeac88135 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -153,6 +153,7 @@ Erweiterte Details nicht anzeigen, wenn die Systemleiste versteckt ist Zusätzliche Überprüfung, um ungültige Dateien nicht anzuzeigen Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Thumbnails diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index b09ca6de0..896b60f55 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -154,6 +154,7 @@ Απόκρυψη λεπτομερειών όταν η μπάρα κατάστασης είναι κρυμμένη Επιπλέον έλεγχος για την αποφυγή εμφάνισης λανθασμένων αρχείων Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Εικονίδια diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 224c1d635..0b7055948 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -153,6 +153,7 @@ Ocultar detalles ampliados cuando la barra de estado está oculta Hacer una comprobación adicional para evitar mostrar archivos inválidos Mostrar algunos botones de acción en la parte inferior de la pantalla + Show the Recycle Bin at the folders screen Miniaturas diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 468837a8f..458998f34 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -153,6 +153,7 @@ Piilota yksityiskohtaiset tiedot kun tilapalkki on piilotettu Tee ylimääräinen tarkistus rikkinäisten tiedostojen varalta Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Esikatselukuvat diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 20d618b80..09f03d474 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -153,6 +153,7 @@ Masquer les détails supplémentaires lorsque la barre d\'état est masquée Faire une vérification supplémentaire pour éviter de montrer des fichiers invalides Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Vignettes diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index bbb7d82f0..af5896b71 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -153,6 +153,7 @@ Agochar detalles extendidos cando a barra de estado está oculta Facer unha comprobación extra para evitar mostrar ficheiros non válidos Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Iconas diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 42ee13699..053c8d7e9 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -153,6 +153,7 @@ Sakrij proširene pojedinosti kada je traka statusa skrivena Napravite dodatnu provjeru da biste izbjegli prikazivanje nevažećih datoteka Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Sličice diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index a4e6f657e..1e1af0626 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -153,6 +153,7 @@ Hide extended details when status bar is hidden Do an extra check to avoid showing invalid files Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Thumbnails diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index e475fd153..f1b94bca9 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -153,6 +153,7 @@ Nascondi i dettagli estesi quando la barra di stato è nascosta Fai un controllo ulteriore per evitare di mostrare file non validi Mostra alcuni pulsanti azione in fondo allo schermo + Show the Recycle Bin at the folders screen Miniature diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index d657e4c86..2b5353f6b 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -153,6 +153,7 @@ ステータスバーが非表示の時は詳細を隠す 無効なファイルを見せない調整を行う 画面下部にアクションボタンを表示 + Show the Recycle Bin at the folders screen サムネイル設定 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index bb8b91f2f..1269fb089 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -153,6 +153,7 @@ 상태 표시 줄이 숨겨져있을 때 확장 된 세부 정보 숨김 잘못된 파일 표시를 방지하기 위해 추가 검사 수행 Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen 섬네일 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 9cf84aecb..7832548fb 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -153,6 +153,7 @@ Slėpti išsamią informaciją, kai būsenos juosta yra paslėpta Atlikti papildomą patikrinimą, kad nebūtų rodomos sugadintos bylos Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Miniatiūros diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index a2b6161b8..8f34a3c0c 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -153,6 +153,7 @@ Skjul utvidede detaljer når statuslinjen er skjult Gjør en ekstra sjekk for å unngå visning av ugyldige filer Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Minibilder diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 8a209901b..015f01f18 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -153,6 +153,7 @@ Uitgebreide informatie niet tonen als de statusbalk is verborgen Ongeldige bestanden verbergen Enkele actieknoppen onderaan het scherm tonen + Show the Recycle Bin at the folders screen Miniatuurvoorbeelden diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index d6ecc8826..24612502b 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -153,6 +153,7 @@    Ukrywaj dodatkowe szczegóły gdy pasek stanu jest ukryty    Dodatkowe sprawdzenie w celu uniknięcia pokazywania niewłaściwych plików Pokazuj niektóre przyciski akcji na dole ekranu + Show the Recycle Bin at the folders screen    Miniatury diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 423b02944..f65b83a7e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -153,6 +153,7 @@ Ocultar detalhes extendidos quando a barra de status estiver oculta Realizar verificação extra para evitar mostrar arquivos inválidos Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Miniaturas diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 5d1f9047e..eb73d1ced 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -153,6 +153,7 @@ Ocultar detalhes extra se a barra de estado estiver oculta Efetuar uma dupla verificação para evitar mostrar os ficheiros inválidos Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Miniaturas diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2c44256e2..41e327105 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -153,6 +153,7 @@ Не показывать подробности при скрытой строке состояния Делать дополнительную проверку, чтобы избежать показа неподдерживаемых файлов Показывать кнопки действий в нижней части экрана + Show the Recycle Bin at the folders screen Миниатюры diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index f286ca9cd..e6182ff57 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -153,6 +153,7 @@ Skryť rozšírené vlastnosti ak je skrytá stavová lišta Predísť zobrazovaniu neplatných súborov dodatočnou kontrolou Zobraziť niektoré akčné tlačidlá na spodku obrazovky + Zobraziť odpadkový kôš na obrazovke s priečinkami Náhľady diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 40467de14..3391e6c72 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -153,6 +153,7 @@ Dölj utökad information när statusfältet är dolt Gör en extra kontroll för att hindra ogiltiga filer från att visas Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Miniatyrer diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 8b852948b..32b92f5fa 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -153,6 +153,7 @@ Hide extended details when status bar is hidden Do an extra check to avoid showing invalid files Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Thumbnails diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5ba841b11..d36cf3f1b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -153,6 +153,7 @@ 当状态栏隐藏时隐藏扩展详情 额外检查以避免显示无效的文件 在屏幕底部显示一些操作按钮 + Show the Recycle Bin at the folders screen 缩略图 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 6270468b8..38f656c18 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -153,6 +153,7 @@ 狀態欄隱藏時,同時隱藏詳細資訊 進行額外檢查,避免顯示無效的檔案 在螢幕底部顯示一些操作按鈕 + Show the Recycle Bin at the folders screen 縮圖 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 970180e22..e92a1d1da 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -153,6 +153,7 @@ Hide extended details when status bar is hidden Do an extra check to avoid showing invalid files Show some action buttons at the bottom of the screen + Show the Recycle Bin at the folders screen Thumbnails From 3358dfa2014f58f8f6e5e63c73ebc73782492989 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 17:54:23 +0200 Subject: [PATCH 55/90] show recycle bin at the main folders screen only when appropriate --- .../gallery/activities/MainActivity.kt | 7 +++++- .../gallery/activities/SettingsActivity.kt | 10 ++++++++ .../gallery/extensions/Context.kt | 5 ++++ .../gallery/helpers/Config.kt | 4 ++++ .../gallery/helpers/Constants.kt | 1 + app/src/main/res/layout/activity_settings.xml | 23 +++++++++++++++++++ 6 files changed, 49 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt index d2bb50de1..b4434fc41 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -749,7 +749,12 @@ class MainActivity : SimpleActivity(), DirectoryOperationsListener { val foldersToScan = mediaFetcher.getFoldersToScan() foldersToScan.add(FAVORITES) - foldersToScan.add(RECYCLE_BIN) + if (config.showRecycleBinAtFolders) { + foldersToScan.add(RECYCLE_BIN) + } else { + foldersToScan.remove(RECYCLE_BIN) + } + dirs.forEach { foldersToScan.remove(it.path) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt index 17f13cf52..13a79370e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt @@ -75,6 +75,7 @@ class SettingsActivity : SimpleActivity() { setupSkipDeleteConfirmation() setupManageBottomActions() setupUseRecycleBin() + setupShowRecycleBin() setupEmptyRecycleBin() updateTextColors(settings_holder) setupSectionColors() @@ -441,6 +442,7 @@ class SettingsActivity : SimpleActivity() { private fun setupUseRecycleBin() { settings_empty_recycle_bin_holder.beVisibleIf(config.useRecycleBin) + settings_show_recycle_bin_holder.beVisibleIf(config.useRecycleBin) settings_use_recycle_bin.isChecked = config.useRecycleBin settings_use_recycle_bin_holder.setOnClickListener { settings_use_recycle_bin.toggle() @@ -449,6 +451,14 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupShowRecycleBin() { + settings_show_recycle_bin.isChecked = config.showRecycleBinAtFolders + settings_show_recycle_bin_holder.setOnClickListener { + settings_show_recycle_bin.toggle() + config.showRecycleBinAtFolders = settings_show_recycle_bin.isChecked + } + } + private fun setupEmptyRecycleBin() { Thread { mRecycleBinContentSize = galleryDB.MediumDao().getDeletedMedia().sumByLong { it.size } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt index beae8a757..5fc78e20e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt @@ -288,6 +288,11 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: } catch (e: SQLiteException) { ArrayList() } + + if (!config.showRecycleBinAtFolders) { + directories.removeAll { it.isRecycleBin() } + } + val shouldShowHidden = config.shouldShowHidden val excludedPaths = config.excludedFolders val includedPaths = config.includedFolders diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt index 93d0608df..ff80bbe58 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt @@ -376,4 +376,8 @@ class Config(context: Context) : BaseConfig(context) { Environment.DIRECTORY_DCIM, Environment.DIRECTORY_PICTURES ) + + var showRecycleBinAtFolders: Boolean + get() = prefs.getBoolean(SHOW_RECYCLE_BIN_AT_FOLDERS, true) + set(showRecycleBinAtFolders) = prefs.edit().putBoolean(SHOW_RECYCLE_BIN_AT_FOLDERS, showRecycleBinAtFolders).apply() } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt index 53e17f4f2..0a74ddbd3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt @@ -58,6 +58,7 @@ const val WAS_RECYCLE_BIN_PINNED = "was_recycle_bin_pinned" const val USE_RECYCLE_BIN = "use_recycle_bin" const val GROUP_BY = "group_by" const val EVER_SHOWN_FOLDERS = "ever_shown_folders" +const val SHOW_RECYCLE_BIN_AT_FOLDERS = "show_recycle_bin_at_folders" // slideshow const val SLIDESHOW_INTERVAL = "slideshow_interval" diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 6c70a99df..822fc4989 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -1045,6 +1045,29 @@ + + + + + + Date: Wed, 18 Jul 2018 18:31:16 +0200 Subject: [PATCH 56/90] Update strings.xml --- app/src/main/res/values-ca/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 1f3a40349..956049450 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -153,7 +153,7 @@ Amaga els detalls estesos quan la barra d\'estat està amagada Fer una verificació addicional per evitar que es mostrin fitxers no vàlids Mostra alguns botons d\'acció a la part inferior de la pantalla - Show the Recycle Bin at the folders screen + Mostra la paperera de reciclatge a la pantalla de carpetes Miniatures From de94bf4fe398063738fa22346cf584388554d3eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Wed, 18 Jul 2018 18:32:06 +0200 Subject: [PATCH 57/90] Update strings.xml --- app/src/main/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 0b7055948..c248517d9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -153,7 +153,7 @@ Ocultar detalles ampliados cuando la barra de estado está oculta Hacer una comprobación adicional para evitar mostrar archivos inválidos Mostrar algunos botones de acción en la parte inferior de la pantalla - Show the Recycle Bin at the folders screen + Muestra la papelera de reciclaje en la pantalla de carpetas Miniaturas From 868b654107675083a77a9a1e3afc3330dc49883b Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 19:33:41 +0200 Subject: [PATCH 58/90] move some Editor actions at the bottom of the screen --- .../gallery/activities/EditActivity.kt | 21 ++++++--- .../activities/SetWallpaperActivity.kt | 4 +- app/src/main/res/layout/activity_edit.xml | 20 +++++++++ ...p_image.xml => activity_set_wallpaper.xml} | 0 .../main/res/layout/bottom_editor_actions.xml | 45 +++++++++++++++++++ app/src/main/res/menu/menu_editor.xml | 10 ----- 6 files changed, 83 insertions(+), 17 deletions(-) create mode 100644 app/src/main/res/layout/activity_edit.xml rename app/src/main/res/layout/{view_crop_image.xml => activity_set_wallpaper.xml} (100%) create mode 100644 app/src/main/res/layout/bottom_editor_actions.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 79ea0700e..b342019df 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -20,7 +20,8 @@ import com.simplemobiletools.gallery.dialogs.ResizeDialog import com.simplemobiletools.gallery.dialogs.SaveAsDialog import com.simplemobiletools.gallery.extensions.openEditor import com.theartofdev.edmodo.cropper.CropImageView -import kotlinx.android.synthetic.main.view_crop_image.* +import kotlinx.android.synthetic.main.activity_edit.* +import kotlinx.android.synthetic.main.bottom_editor_actions.* import java.io.* class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener { @@ -37,7 +38,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.view_crop_image) + setContentView(R.layout.activity_edit) handlePermission(PERMISSION_WRITE_STORAGE) { if (it) { @@ -90,6 +91,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener if (isCropIntent && shouldCropSquare()) setFixedAspectRatio(true) } + + setupBottomActions() } override fun onResume() { @@ -106,15 +109,12 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_editor, menu) - menu.findItem(R.id.resize).isVisible = !isCropIntent return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.save_as -> crop_image_view.getCroppedImageAsync() - R.id.rotate -> crop_image_view.rotateImage(90) - R.id.resize -> resizeImage() R.id.flip_horizontally -> flipImage(true) R.id.flip_vertically -> flipImage(false) R.id.edit -> editWith() @@ -123,6 +123,17 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener return true } + private fun setupBottomActions() { + bottom_rotate.setOnClickListener { + crop_image_view.rotateImage(90) + } + + bottom_resize.beGoneIf(isCropIntent) + bottom_resize.setOnClickListener { + resizeImage() + } + } + private fun resizeImage() { val point = getAreaSize() if (point == null) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SetWallpaperActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SetWallpaperActivity.kt index 763ec25c8..25070a812 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SetWallpaperActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SetWallpaperActivity.kt @@ -16,7 +16,7 @@ import com.simplemobiletools.commons.helpers.isNougatPlus import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.gallery.R import com.theartofdev.edmodo.cropper.CropImageView -import kotlinx.android.synthetic.main.view_crop_image.* +import kotlinx.android.synthetic.main.activity_edit.* class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener { private val PICK_IMAGE = 1 @@ -28,7 +28,7 @@ class SetWallpaperActivity : SimpleActivity(), CropImageView.OnCropImageComplete override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.view_crop_image) + setContentView(R.layout.activity_set_wallpaper) if (intent.data == null) { val pickIntent = Intent(applicationContext, MainActivity::class.java) diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml new file mode 100644 index 000000000..f922d6ad9 --- /dev/null +++ b/app/src/main/res/layout/activity_edit.xml @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/app/src/main/res/layout/view_crop_image.xml b/app/src/main/res/layout/activity_set_wallpaper.xml similarity index 100% rename from app/src/main/res/layout/view_crop_image.xml rename to app/src/main/res/layout/activity_set_wallpaper.xml diff --git a/app/src/main/res/layout/bottom_editor_actions.xml b/app/src/main/res/layout/bottom_editor_actions.xml new file mode 100644 index 000000000..901fb5cc2 --- /dev/null +++ b/app/src/main/res/layout/bottom_editor_actions.xml @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/app/src/main/res/menu/menu_editor.xml b/app/src/main/res/menu/menu_editor.xml index 01aad0437..b0e2ad6c9 100644 --- a/app/src/main/res/menu/menu_editor.xml +++ b/app/src/main/res/menu/menu_editor.xml @@ -6,16 +6,6 @@ android:icon="@drawable/ic_check" android:title="@string/save_as" app:showAsAction="always"/> - - Date: Wed, 18 Jul 2018 20:07:47 +0200 Subject: [PATCH 59/90] replace the editors Flip menu items with bottom actions --- .../gallery/activities/EditActivity.kt | 18 ++++++++--------- .../{ic_flip.png => ic_flip_horizontally.png} | Bin .../res/drawable-hdpi/ic_flip_vertically.png | Bin 0 -> 344 bytes .../{ic_flip.png => ic_flip_horizontally.png} | Bin .../res/drawable-xhdpi/ic_flip_vertically.png | Bin 0 -> 297 bytes .../{ic_flip.png => ic_flip_horizontally.png} | Bin .../drawable-xxhdpi/ic_flip_vertically.png | Bin 0 -> 442 bytes .../{ic_flip.png => ic_flip_horizontally.png} | Bin .../drawable-xxxhdpi/ic_flip_vertically.png | Bin 0 -> 684 bytes .../main/res/layout/bottom_editor_actions.xml | 19 ++++++++++++++---- app/src/main/res/menu/menu_editor.xml | 19 +++--------------- 11 files changed, 26 insertions(+), 30 deletions(-) rename app/src/main/res/drawable-hdpi/{ic_flip.png => ic_flip_horizontally.png} (100%) create mode 100644 app/src/main/res/drawable-hdpi/ic_flip_vertically.png rename app/src/main/res/drawable-xhdpi/{ic_flip.png => ic_flip_horizontally.png} (100%) create mode 100644 app/src/main/res/drawable-xhdpi/ic_flip_vertically.png rename app/src/main/res/drawable-xxhdpi/{ic_flip.png => ic_flip_horizontally.png} (100%) create mode 100644 app/src/main/res/drawable-xxhdpi/ic_flip_vertically.png rename app/src/main/res/drawable-xxxhdpi/{ic_flip.png => ic_flip_horizontally.png} (100%) create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_flip_vertically.png diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index b342019df..3eb5c1fdb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -115,8 +115,6 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.save_as -> crop_image_view.getCroppedImageAsync() - R.id.flip_horizontally -> flipImage(true) - R.id.flip_vertically -> flipImage(false) R.id.edit -> editWith() else -> return super.onOptionsItemSelected(item) } @@ -132,6 +130,14 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener bottom_resize.setOnClickListener { resizeImage() } + + bottom_flip_horizontally.setOnClickListener { + crop_image_view.flipImageHorizontally() + } + + bottom_flip_vertically.setOnClickListener { + crop_image_view.flipImageVertically() + } } private fun resizeImage() { @@ -258,14 +264,6 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener out.close() } - private fun flipImage(horizontally: Boolean) { - if (horizontally) { - crop_image_view.flipImageHorizontally() - } else { - crop_image_view.flipImageVertically() - } - } - private fun editWith() { openEditor(uri.toString()) isEditingWithThirdParty = true diff --git a/app/src/main/res/drawable-hdpi/ic_flip.png b/app/src/main/res/drawable-hdpi/ic_flip_horizontally.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_flip.png rename to app/src/main/res/drawable-hdpi/ic_flip_horizontally.png diff --git a/app/src/main/res/drawable-hdpi/ic_flip_vertically.png b/app/src/main/res/drawable-hdpi/ic_flip_vertically.png new file mode 100644 index 0000000000000000000000000000000000000000..eff105482434518e0d87acd05bd73ce1f10013b1 GIT binary patch literal 344 zcmV-e0jK_nP)e6Mc;M!@0k4lB1^T zn~qZC@_RiLfT!fWsG(ebZ_29TRY-f{QjDGdpCfS8`L$3H(OnM(4m-aVI@u}HnkFJz z+rZzT{mXLsCpTryP>#tN@|yZHi9@==6e9H8)obWIiEraG7H`=Tokej>R^Fm`YL%V? qH^Al4GIaQ2TbY-$R_R9LhkOID`V9W&W#+K}0000X3_mwG}IsJ*h zqvMR&$)*(FO_C?7jGpkG?0WKT_NVDRtihi@uTb=Or=~SyQuxAoVv-A3H@q@4*}Q#E z`Gqr;*=er>!Y9^??e17C9+|iDc)U-rx;(Ff(!O2QuP;bHoU?Zxw|%|%B?hHO-uIdB znKYR5KJaC(h<4k==J4J5>d)$hysR5VEmAa$!Zvun@r+@xV7l=n<4dDm4t*YN>?;bkT8GhBwlx9 z&-9tDRv-UIw@FpRnw0pvF#*lKwdwB0+T`E&zNI+ktrLBwzU}w6^*QCAwBwrI*4{qs zC3Z*6e#74B@s&+)*S!r~%AGe!-eTwEZAOZo(;JF@={6oj9AIFnrT^c)16d> zH~rOG`TO<5pl5dfua~XYvDaPt=FDkkh7FRNj{gZdo|Sv+%>2C?|Dr`i7A#<3W!2zd zXz2a=Ha6wr^v3^BURz6j2a9SrI5KiEF(f2^jMX_{3+8bJ1T-`;!L&hya@32HJ$KvJ z$9#UDaoI;>ck{exo}ksseKevk#CAJoO^piv_P(!g$-X6r&4fc!R91$2&2&9@g->hg z9#5;OCOMW7ymG2@Q%+5sW^vR@Q-4y`q;+36&OX+AEV_5*5_Zq+lltthgM!H9JKq+i V?&+>({GC7^gQu&X%Q~loCIEV$u^9jW literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_flip.png b/app/src/main/res/drawable-xxxhdpi/ic_flip_horizontally.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_flip.png rename to app/src/main/res/drawable-xxxhdpi/ic_flip_horizontally.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_flip_vertically.png b/app/src/main/res/drawable-xxxhdpi/ic_flip_vertically.png new file mode 100644 index 0000000000000000000000000000000000000000..0053524c44b32de8f1d50cd2cf7b7f5fad36fe39 GIT binary patch literal 684 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9F5M?jcysy3fA0|Qf> zr;B4q#hkZy9kYZBCE7l!D+T#KXBKiq}j?-Uh=IoLb zzd0k*=h=VLx3|yO*uPlzW%kT-hnE4*CO@$Lz_i2i!Sn00=HA-%(Er$5#`6vC zd!NpUN~;%Ld%L9bx%C6l4=gkCXGm|`)X4a);roHNil^VKUsO7~Ea9K&6G*}xH2q+ zVAjRUUpRN2y{8j13}Gsu!8-Ln`V~XfPKkx666{?F+Nm{3RtEcM|?;zLJ>3us`C@!CK#kiO=Kr*(sdSeux~w d$c}rX|6+M{6o2x{zrf_j;OXk;vd$@?2>|OMDDwaS literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/bottom_editor_actions.xml b/app/src/main/res/layout/bottom_editor_actions.xml index 901fb5cc2..7ffe42837 100644 --- a/app/src/main/res/layout/bottom_editor_actions.xml +++ b/app/src/main/res/layout/bottom_editor_actions.xml @@ -27,19 +27,30 @@ android:layout_height="wrap_content" android:padding="@dimen/medium_margin" android:src="@drawable/ic_minimize" - app:layout_constraintEnd_toStartOf="@+id/bottom_flip" + app:layout_constraintEnd_toStartOf="@+id/bottom_flip_horizontally" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/bottom_rotate"/> + + diff --git a/app/src/main/res/menu/menu_editor.xml b/app/src/main/res/menu/menu_editor.xml index b0e2ad6c9..b72316342 100644 --- a/app/src/main/res/menu/menu_editor.xml +++ b/app/src/main/res/menu/menu_editor.xml @@ -5,23 +5,10 @@ android:id="@+id/save_as" android:icon="@drawable/ic_check" android:title="@string/save_as" - app:showAsAction="always"/> - -

- - - - + app:showAsAction="ifRoom"/> + app:showAsAction="ifRoom"/> From c0bef96f806fd0464ad7ace0d6bdfea12fda759e Mon Sep 17 00:00:00 2001 From: Guillaume Date: Wed, 18 Jul 2018 20:22:06 +0200 Subject: [PATCH 60/90] Dutch --- app/src/main/res/values-nl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 015f01f18..2a9746a01 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -153,7 +153,7 @@ Uitgebreide informatie niet tonen als de statusbalk is verborgen Ongeldige bestanden verbergen Enkele actieknoppen onderaan het scherm tonen - Show the Recycle Bin at the folders screen + Prullenbak weergeven in de mapweergave Miniatuurvoorbeelden From a633330c8ec559129df158e9434c01a8d6eaea56 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 21:14:03 +0200 Subject: [PATCH 61/90] add an aspect ratio selector to the Editor activity --- .../gallery/activities/EditActivity.kt | 11 ++++++++++- .../main/res/drawable-hdpi/ic_aspect_ratio.png | Bin 0 -> 198 bytes .../main/res/drawable-xhdpi/ic_aspect_ratio.png | Bin 0 -> 174 bytes .../main/res/drawable-xxhdpi/ic_aspect_ratio.png | Bin 0 -> 221 bytes .../res/drawable-xxxhdpi/ic_aspect_ratio.png | Bin 0 -> 289 bytes .../main/res/layout/bottom_editor_actions.xml | 15 +++++++++++++-- 6 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_aspect_ratio.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_aspect_ratio.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_aspect_ratio.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_aspect_ratio.png diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 3eb5c1fdb..fafa777a2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -29,12 +29,18 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener private val ASPECT_Y = "aspectY" private val CROP = "crop" + private val ASPECT_RATIO_ANY = 0 + private val ASPECT_RATIO_ONE_ONE = 1 + private val ASPECT_RATIO_FOUR_THREE = 2 + private val ASPECT_RATIO_SIXTEEN_NINE = 3 + private lateinit var uri: Uri private lateinit var saveUri: Uri private var resizeWidth = 0 private var resizeHeight = 0 private var isCropIntent = false private var isEditingWithThirdParty = false + private var currentAspectRatio = ASPECT_RATIO_ANY override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -88,8 +94,11 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener setOnCropImageCompleteListener(this@EditActivity) setImageUriAsync(uri) - if (isCropIntent && shouldCropSquare()) + if (isCropIntent && shouldCropSquare()) { + currentAspectRatio = ASPECT_RATIO_ONE_ONE setFixedAspectRatio(true) + bottom_aspect_ratio.beGone() + } } setupBottomActions() diff --git a/app/src/main/res/drawable-hdpi/ic_aspect_ratio.png b/app/src/main/res/drawable-hdpi/ic_aspect_ratio.png new file mode 100644 index 0000000000000000000000000000000000000000..81c7958d6259166b615863f9a33025da5a0e1e93 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBdOcknLn;{GUf;;updjFuXm&Yj zE{C+(g(JN;-b6O3#kpGe{L^39DxT4IVG@S{qoBv!FqUQOXK>qJw@y2HKaBmY$j--; zQ@i%^d5LJ2B+U7}SRrBCx;x4mi5&i1r<`qP3NBD!wUk+-zvatv@gIEVEN>kI?Y#i>c|sp*S)U3?vLm!5Lqf59txgJG{O^K^lS zj}H81FqiqEF2HZ`pdsf1BfDI~lLiZg2M4+jFul-~zxTbZDQaP#%keXfrw)3Erzxpl X&`rN9s%O9sbO3{=tDnm{r-UW|RFppm literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_aspect_ratio.png b/app/src/main/res/drawable-xxhdpi/ic_aspect_ratio.png new file mode 100644 index 0000000000000000000000000000000000000000..cc07c4c257229df4d15f34d33236543406922c67 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhawmUy~2hEy=Vy}6OMDL{hZAv>?} ziHazrcNr--zdK_$_V>1iOzma7ve5xz@)k%=R>N z%NmQ|;`FdBPYX@Hq^ww8$rCYQscWa=Z1xD5Wklt2oYSbhZQgBjmavi>*6 z_ot_1i7_4yx&MB*Q1ZNN2Ej#%v$LCo7Nti1<;d`ij&nV}IU>PgQu&X%Q~loCIDylW>x?I literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/bottom_editor_actions.xml b/app/src/main/res/layout/bottom_editor_actions.xml index 7ffe42837..7dcbb0a9d 100644 --- a/app/src/main/res/layout/bottom_editor_actions.xml +++ b/app/src/main/res/layout/bottom_editor_actions.xml @@ -27,10 +27,21 @@ android:layout_height="wrap_content" android:padding="@dimen/medium_margin" android:src="@drawable/ic_minimize" - app:layout_constraintEnd_toStartOf="@+id/bottom_flip_horizontally" + app:layout_constraintEnd_toStartOf="@+id/bottom_aspect_ratio" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/bottom_rotate"/> + + + app:layout_constraintStart_toEndOf="@+id/bottom_aspect_ratio"/> Date: Wed, 18 Jul 2018 21:28:03 +0200 Subject: [PATCH 62/90] toggle bottom edit action buttons on press --- .../gallery/activities/EditActivity.kt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index fafa777a2..32f21b09d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.content.Intent import android.graphics.Bitmap import android.graphics.Bitmap.CompressFormat +import android.graphics.Color import android.graphics.Point import android.net.Uri import android.os.Bundle @@ -18,6 +19,7 @@ import com.simplemobiletools.commons.models.FileDirItem import com.simplemobiletools.gallery.R import com.simplemobiletools.gallery.dialogs.ResizeDialog import com.simplemobiletools.gallery.dialogs.SaveAsDialog +import com.simplemobiletools.gallery.extensions.config import com.simplemobiletools.gallery.extensions.openEditor import com.theartofdev.edmodo.cropper.CropImageView import kotlinx.android.synthetic.main.activity_edit.* @@ -34,10 +36,15 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener private val ASPECT_RATIO_FOUR_THREE = 2 private val ASPECT_RATIO_SIXTEEN_NINE = 3 + // constants for bottom primary action groups + private val PRIMARY_NONE = 0 + private val PRIMARY_ASPECT_RATIO = 1 + private lateinit var uri: Uri private lateinit var saveUri: Uri private var resizeWidth = 0 private var resizeHeight = 0 + private var currPrimaryAction = 0 private var isCropIntent = false private var isEditingWithThirdParty = false private var currentAspectRatio = ASPECT_RATIO_ANY @@ -147,6 +154,25 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener bottom_flip_vertically.setOnClickListener { crop_image_view.flipImageVertically() } + + bottom_aspect_ratio.setOnClickListener { + currPrimaryAction = if (currPrimaryAction == PRIMARY_ASPECT_RATIO) 0 else PRIMARY_ASPECT_RATIO + updatePrimaryActions() + } + } + + private fun updatePrimaryActions() { + val primaryColor = config.primaryColor + arrayOf(bottom_aspect_ratio).forEach { + it.applyColorFilter(Color.WHITE) + } + + val primaryActionView = when (currPrimaryAction) { + PRIMARY_ASPECT_RATIO -> bottom_aspect_ratio + else -> null + } + + primaryActionView?.applyColorFilter(primaryColor) } private fun resizeImage() { From 17e02d568afadd5ae07b1bde96ebdfbd7066a6c3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 22:13:05 +0200 Subject: [PATCH 63/90] adding editor buttons for aspect ratios --- .../gallery/activities/EditActivity.kt | 21 +++++++ app/src/main/res/layout/activity_edit.xml | 8 +++ .../layout/bottom_actions_aspect_ratio.xml | 63 +++++++++++++++++++ .../main/res/layout/bottom_editor_actions.xml | 33 ++++++---- app/src/main/res/values-ar/strings.xml | 3 +- app/src/main/res/values-ca/strings.xml | 1 + app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fi/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-gl/strings.xml | 1 + app/src/main/res/values-hr/strings.xml | 1 + app/src/main/res/values-hu/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ko-rKR/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-nb/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/dimens.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 33 files changed, 143 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/layout/bottom_actions_aspect_ratio.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 32f21b09d..f05b2bc8f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -23,6 +23,7 @@ import com.simplemobiletools.gallery.extensions.config import com.simplemobiletools.gallery.extensions.openEditor import com.theartofdev.edmodo.cropper.CropImageView import kotlinx.android.synthetic.main.activity_edit.* +import kotlinx.android.synthetic.main.bottom_actions_aspect_ratio.* import kotlinx.android.synthetic.main.bottom_editor_actions.* import java.io.* @@ -159,6 +160,26 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener currPrimaryAction = if (currPrimaryAction == PRIMARY_ASPECT_RATIO) 0 else PRIMARY_ASPECT_RATIO updatePrimaryActions() } + + setupAspectRatios() + } + + private fun setupAspectRatios() { + bottom_aspect_ratio_free.setOnClickListener { + + } + + bottom_aspect_ratio_one_one.setOnClickListener { + + } + + bottom_aspect_ratio_four_three.setOnClickListener { + + } + + bottom_aspect_ratio_sixteen_nine.setOnClickListener { + + } } private fun updatePrimaryActions() { diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml index f922d6ad9..b5e0b67da 100644 --- a/app/src/main/res/layout/activity_edit.xml +++ b/app/src/main/res/layout/activity_edit.xml @@ -13,6 +13,14 @@ app:cropBackgroundColor="@color/crop_image_view_background" app:cropInitialCropWindowPaddingRatio="0"/> + + diff --git a/app/src/main/res/layout/bottom_actions_aspect_ratio.xml b/app/src/main/res/layout/bottom_actions_aspect_ratio.xml new file mode 100644 index 000000000..e2ccf6e00 --- /dev/null +++ b/app/src/main/res/layout/bottom_actions_aspect_ratio.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/bottom_editor_actions.xml b/app/src/main/res/layout/bottom_editor_actions.xml index 7dcbb0a9d..04a19515d 100644 --- a/app/src/main/res/layout/bottom_editor_actions.xml +++ b/app/src/main/res/layout/bottom_editor_actions.xml @@ -6,62 +6,71 @@ android:layout_width="match_parent" android:layout_height="@dimen/bottom_actions_height" android:layout_alignParentBottom="true" - android:background="@drawable/gradient_background_lighter" - android:paddingTop="@dimen/medium_margin"> + android:background="@drawable/gradient_background_lighter"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintStart_toEndOf="@+id/bottom_rotate" + app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintStart_toEndOf="@+id/bottom_resize" + app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintStart_toEndOf="@+id/bottom_aspect_ratio" + app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintStart_toEndOf="@+id/bottom_flip_horizontally" + app:layout_constraintTop_toTopOf="parent"/> diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index b8341aea3..ebc0e090f 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -88,13 +88,14 @@ قلب أفقيا قلب عموديا تعديل باستخدام + Free خلفية بسيطة تعيين كخلفية الشاشة فشل الإعداد كخلفية تعيين كخلفية بواسطة: - ... جار تعيين الخلفية ... + … جار تعيين الخلفية ... تم تعيبن الخلفية بنجاح صورة نسبة العرض إلى الارتفاع نسبة العرض إلى الارتفاع في المناظر الطبيعية diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 956049450..1ae2b8b27 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -84,6 +84,7 @@ Horizontalment Verticalment Editar amb + Free Fons de pantalla de Simple Gallery diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 839ba5747..f6d433af3 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -84,6 +84,7 @@ Překlopit vodorovně Překlopit svisle Edit with + Free Jednoduchá tapeta diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index b484fa566..0615f60e3 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -84,6 +84,7 @@ Spejlvend vandret Spejlvend lodret Rediger med + Free Simple Wallpaper diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index eeac88135..04c5d88e5 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -84,6 +84,7 @@ Horizontal spiegeln Vertikal spiegeln Bearbeiten mit + Free Schlichter Hintergrund diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 896b60f55..43e7d8ef8 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -84,6 +84,7 @@ Οριζόντιο αναποδογύρισμα Κατακόρυφο αναποδογύρισμα Επεξεργασία με + Free Simple Wallpaper diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c248517d9..f32765509 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -84,6 +84,7 @@ Horizontalmente Verticalmente Editar con + Free Fondos de pantalla Simple Gallery diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 458998f34..b9c3fd0ce 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -84,6 +84,7 @@ Pyöräytä vaakasuoraan Pyöräytä pystysuoraan Muokkaa sovelluksella + Free Simple Wallpaper diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 09f03d474..f846d815c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -84,6 +84,7 @@ Retourner horizontalement Retourner verticalement Éditer avec + Free Simple fond d\'écran diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index af5896b71..fb3ea2570 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -84,6 +84,7 @@ Voltear horizontalmente Voltear verticalmente Editar con + Free Fondo de pantalla diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 053c8d7e9..922a3ce86 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -84,6 +84,7 @@ Okreni horizontalno Okreni vertikalno Uredi pomoću + Free Jednostavna pozadina diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 1e1af0626..fb4eb29db 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -84,6 +84,7 @@ Flip horizontally Flip vertically Edit with + Free Simple Wallpaper diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f1b94bca9..df170a074 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -84,6 +84,7 @@ Capovolgi orizzontalmente Capovolgi verticalmente Modifica con + Free Sfondo semplice diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 2b5353f6b..a68a1a0e7 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -84,6 +84,7 @@ 水平方向に反転 垂直方向に反転 他のアプリで編集 + Free シンプル壁紙 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 1269fb089..9d4cc89fe 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -84,6 +84,7 @@ 가로 반전 세로 반전 이미지편집 프로그램 연결 + Free Simple Wallpaper diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 7832548fb..44d6f6ac0 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -84,6 +84,7 @@ Apversti horizontaliai Apversti vertikaliai Redaguoti su + Free Paprastas darbalaukio fonas diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 8f34a3c0c..2d21ba305 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -84,6 +84,7 @@ Speilvend horisontalt Speilvend vertikalt Rediger med + Free Bakgrunnsbilde diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 2a9746a01..3641d591a 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -84,6 +84,7 @@ Horizontaal kantelen Verticaal kantelen Bewerken met + Free Achtergrond diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 24612502b..a32fd452b 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -84,6 +84,7 @@ Przewróć w poziomie Przewróć w pionie Edytuj w: + Free Tapeta diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index f65b83a7e..fee389a29 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -84,6 +84,7 @@ Horizontalmente Verticalmente Editar com + Free Simple Wallpaper diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index eb73d1ced..539afb935 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -84,6 +84,7 @@ Horizontalmente Verticalmente Editar com + Free Simple Wallpaper diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 41e327105..015011c1e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -84,6 +84,7 @@ По горизонтали По вертикали Редактировать в… + Free Простые обои diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index e6182ff57..8a599c80a 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -84,6 +84,7 @@ Preklopiť vodorovne Preklopiť zvisle Upraviť s + Voľný Jednoduchá tapeta diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 3391e6c72..47c17d58e 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -84,6 +84,7 @@ Vänd horisontellt Vänd vertikalt Redigera med + Free Bakgrund diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 32b92f5fa..ea4a9b010 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -84,6 +84,7 @@ Yatay Dikey Edit with + Free Basit Duvar Kağıdı diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d36cf3f1b..fcc89dda8 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -84,6 +84,7 @@ 水平翻转 垂直翻转 编辑方式 + Free 简约壁纸 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 38f656c18..f46e200a7 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -84,6 +84,7 @@ 水平翻轉 垂直翻轉 用其他程式編輯 + Free 簡易桌布 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 3524f5ac0..81fefce87 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -10,5 +10,5 @@ 60dp 30dp 72dp - 60dp + 64dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e92a1d1da..6ea4fa6b4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -84,6 +84,7 @@ Flip horizontally Flip vertically Edit with + Free Simple Wallpaper From 1275d54f1d45f31dd44189bfecdfeec13f3f1615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Wed, 18 Jul 2018 23:05:17 +0200 Subject: [PATCH 64/90] Update strings.xml --- app/src/main/res/values-ca/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 1ae2b8b27..4bc9dd3ae 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -84,7 +84,7 @@ Horizontalment Verticalment Editar amb - Free + Lliure Fons de pantalla de Simple Gallery From ec284b2be0283d9c7410744b5640636028eca8ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Wed, 18 Jul 2018 23:05:53 +0200 Subject: [PATCH 65/90] Update strings.xml --- app/src/main/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f32765509..31f612e1f 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -84,7 +84,7 @@ Horizontalmente Verticalmente Editar con - Free + Libre Fondos de pantalla Simple Gallery From 010a9573618e69031fa22244b8b37752d282b975 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Jul 2018 23:09:34 +0200 Subject: [PATCH 66/90] implement the functionality of aspect ratio toggling --- .../gallery/activities/EditActivity.kt | 69 +++++++++++++++---- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index f05b2bc8f..7792fac04 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -32,7 +32,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener private val ASPECT_Y = "aspectY" private val CROP = "crop" - private val ASPECT_RATIO_ANY = 0 + private val ASPECT_RATIO_FREE = 0 private val ASPECT_RATIO_ONE_ONE = 1 private val ASPECT_RATIO_FOUR_THREE = 2 private val ASPECT_RATIO_SIXTEEN_NINE = 3 @@ -48,7 +48,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener private var currPrimaryAction = 0 private var isCropIntent = false private var isEditingWithThirdParty = false - private var currentAspectRatio = ASPECT_RATIO_ANY + private var currentAspectRatio = ASPECT_RATIO_FREE override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -139,6 +139,11 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } private fun setupBottomActions() { + setupPrimaryActionButtons() + setupAspectRatioButtons() + } + + private fun setupPrimaryActionButtons() { bottom_rotate.setOnClickListener { crop_image_view.rotateImage(90) } @@ -157,33 +162,71 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } bottom_aspect_ratio.setOnClickListener { - currPrimaryAction = if (currPrimaryAction == PRIMARY_ASPECT_RATIO) 0 else PRIMARY_ASPECT_RATIO - updatePrimaryActions() + currPrimaryAction = if (currPrimaryAction == PRIMARY_ASPECT_RATIO) { + bottom_aspect_ratios.beGone() + PRIMARY_NONE + } else { + bottom_aspect_ratios.beVisible() + PRIMARY_ASPECT_RATIO + } + updatePrimaryActionButtons() } - - setupAspectRatios() } - private fun setupAspectRatios() { + private fun setupAspectRatioButtons() { bottom_aspect_ratio_free.setOnClickListener { - + updateAspectRatio(ASPECT_RATIO_FREE) } bottom_aspect_ratio_one_one.setOnClickListener { - + updateAspectRatio(ASPECT_RATIO_ONE_ONE) } bottom_aspect_ratio_four_three.setOnClickListener { - + updateAspectRatio(ASPECT_RATIO_FOUR_THREE) } bottom_aspect_ratio_sixteen_nine.setOnClickListener { + updateAspectRatio(ASPECT_RATIO_SIXTEEN_NINE) + } + updateAspectRatioButtons() + } + private fun updateAspectRatio(aspectRatio: Int) { + currentAspectRatio = aspectRatio + updateAspectRatioButtons() + + crop_image_view.apply { + if (aspectRatio == ASPECT_RATIO_FREE) { + setFixedAspectRatio(false) + } else { + val newAspectRatio = when (aspectRatio) { + ASPECT_RATIO_ONE_ONE -> Pair(1, 1) + ASPECT_RATIO_FOUR_THREE -> Pair(4, 3) + else -> Pair(16, 9) + } + + setAspectRatio(newAspectRatio.first, newAspectRatio.second) + } } } - private fun updatePrimaryActions() { - val primaryColor = config.primaryColor + private fun updateAspectRatioButtons() { + arrayOf(bottom_aspect_ratio_free, bottom_aspect_ratio_one_one, bottom_aspect_ratio_four_three, bottom_aspect_ratio_sixteen_nine).forEach { + it.setTextColor(Color.WHITE) + } + + val currentAspectRatioButton = when (currentAspectRatio) { + ASPECT_RATIO_FREE -> bottom_aspect_ratio_free + ASPECT_RATIO_ONE_ONE -> bottom_aspect_ratio_one_one + ASPECT_RATIO_FOUR_THREE -> bottom_aspect_ratio_four_three + else -> bottom_aspect_ratio_sixteen_nine + } + + currentAspectRatioButton.setTextColor(config.primaryColor) + } + + private fun updatePrimaryActionButtons() { arrayOf(bottom_aspect_ratio).forEach { it.applyColorFilter(Color.WHITE) } @@ -193,7 +236,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener else -> null } - primaryActionView?.applyColorFilter(primaryColor) + primaryActionView?.applyColorFilter(config.primaryColor) } private fun resizeImage() { From d77b2e1890e15ed6d60e249b2b74eb50d85f9f31 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 19 Jul 2018 00:04:02 +0200 Subject: [PATCH 67/90] avoid excluding the Recycle bin and Favorites folders --- .../com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt index fa5bf7dc2..37de4495f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -297,7 +297,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList Date: Thu, 19 Jul 2018 11:24:46 +0200 Subject: [PATCH 68/90] enable edit cropper by default, with visible grid --- .../com/simplemobiletools/gallery/activities/EditActivity.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 7792fac04..95519903c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -45,7 +45,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener private lateinit var saveUri: Uri private var resizeWidth = 0 private var resizeHeight = 0 - private var currPrimaryAction = 0 + private var currPrimaryAction = PRIMARY_NONE private var isCropIntent = false private var isEditingWithThirdParty = false private var currentAspectRatio = ASPECT_RATIO_FREE @@ -101,6 +101,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener crop_image_view.apply { setOnCropImageCompleteListener(this@EditActivity) setImageUriAsync(uri) + guidelines = CropImageView.Guidelines.ON if (isCropIntent && shouldCropSquare()) { currentAspectRatio = ASPECT_RATIO_ONE_ONE @@ -110,6 +111,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } setupBottomActions() + bottom_aspect_ratio.performClick() } override fun onResume() { From c8d75a3eca0525b7f839107f0a9d8d69adf1b2df Mon Sep 17 00:00:00 2001 From: Guillaume Date: Thu, 19 Jul 2018 11:47:19 +0200 Subject: [PATCH 69/90] Dutch --- app/src/main/res/values-nl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 3641d591a..e40ab7a52 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -84,7 +84,7 @@ Horizontaal kantelen Verticaal kantelen Bewerken met - Free + Origineel Achtergrond From f6ec97db545abbc2f1622cde5fec682234ed3b14 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Thu, 19 Jul 2018 11:48:24 +0200 Subject: [PATCH 70/90] Dutch --- app/src/main/res/values-nl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index e40ab7a52..cad80158a 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -84,7 +84,7 @@ Horizontaal kantelen Verticaal kantelen Bewerken met - Origineel + Vrij Achtergrond From 588754d999ba72f658f9d89b630f9ad6c8b58680 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 19 Jul 2018 12:01:46 +0200 Subject: [PATCH 71/90] toggle cropper guidelines visibility depending on the primary action --- .../com/simplemobiletools/gallery/activities/EditActivity.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 95519903c..0d38df221 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -165,9 +165,11 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener bottom_aspect_ratio.setOnClickListener { currPrimaryAction = if (currPrimaryAction == PRIMARY_ASPECT_RATIO) { + crop_image_view.guidelines = CropImageView.Guidelines.OFF bottom_aspect_ratios.beGone() PRIMARY_NONE } else { + crop_image_view.guidelines = CropImageView.Guidelines.ON bottom_aspect_ratios.beVisible() PRIMARY_ASPECT_RATIO } From 8f8baecc5fa2e76e2cce3c24d3dce576e55f6111 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 19 Jul 2018 19:29:07 +0200 Subject: [PATCH 72/90] add some side padding to the editor image --- app/src/main/res/layout/activity_edit.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml index b5e0b67da..2c55b5509 100644 --- a/app/src/main/res/layout/activity_edit.xml +++ b/app/src/main/res/layout/activity_edit.xml @@ -10,6 +10,7 @@ android:id="@+id/crop_image_view" android:layout_width="match_parent" android:layout_height="match_parent" + android:layout_margin="@dimen/activity_margin" app:cropBackgroundColor="@color/crop_image_view_background" app:cropInitialCropWindowPaddingRatio="0"/> From baec75dc62056b9b904b1a823dde92401e1498f8 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 19 Jul 2018 20:12:03 +0200 Subject: [PATCH 73/90] add some more buttons at the bottom of the Editor --- .../gallery/activities/EditActivity.kt | 79 ++++++++++++++---- .../res/drawable-hdpi/ic_photo_filter.png | Bin 0 -> 292 bytes .../res/drawable-xhdpi/ic_photo_filter.png | Bin 0 -> 324 bytes .../res/drawable-xxhdpi/ic_photo_filter.png | Bin 0 -> 473 bytes .../res/drawable-xxxhdpi/ic_photo_filter.png | Bin 0 -> 585 bytes app/src/main/res/layout/activity_edit.xml | 14 +++- ... => bottom_editor_crop_rotate_actions.xml} | 3 +- .../layout/bottom_editor_primary_actions.xml | 37 ++++++++ 8 files changed, 112 insertions(+), 21 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_photo_filter.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_photo_filter.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_photo_filter.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_photo_filter.png rename app/src/main/res/layout/{bottom_editor_actions.xml => bottom_editor_crop_rotate_actions.xml} (96%) create mode 100644 app/src/main/res/layout/bottom_editor_primary_actions.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 0d38df221..d8e53214b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -24,7 +24,8 @@ import com.simplemobiletools.gallery.extensions.openEditor import com.theartofdev.edmodo.cropper.CropImageView import kotlinx.android.synthetic.main.activity_edit.* import kotlinx.android.synthetic.main.bottom_actions_aspect_ratio.* -import kotlinx.android.synthetic.main.bottom_editor_actions.* +import kotlinx.android.synthetic.main.bottom_editor_crop_rotate_actions.* +import kotlinx.android.synthetic.main.bottom_editor_primary_actions.* import java.io.* class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener { @@ -38,17 +39,22 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener private val ASPECT_RATIO_SIXTEEN_NINE = 3 // constants for bottom primary action groups - private val PRIMARY_NONE = 0 - private val PRIMARY_ASPECT_RATIO = 1 + private val PRIMARY_ACTION_NONE = 0 + private val PRIMARY_ACTION_FILTER = 1 + private val PRIMARY_ACTION_CROP_ROTATE = 2 + + private val CROP_ROTATE_NONE = 0 + private val CROP_ROTATE_ASPECT_RATIO = 1 private lateinit var uri: Uri private lateinit var saveUri: Uri private var resizeWidth = 0 private var resizeHeight = 0 - private var currPrimaryAction = PRIMARY_NONE + private var currPrimaryAction = PRIMARY_ACTION_NONE + private var currCropRotateAction = CROP_ROTATE_NONE + private var currAspectRatio = ASPECT_RATIO_FREE private var isCropIntent = false private var isEditingWithThirdParty = false - private var currentAspectRatio = ASPECT_RATIO_FREE override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -104,14 +110,13 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener guidelines = CropImageView.Guidelines.ON if (isCropIntent && shouldCropSquare()) { - currentAspectRatio = ASPECT_RATIO_ONE_ONE + currAspectRatio = ASPECT_RATIO_ONE_ONE setFixedAspectRatio(true) bottom_aspect_ratio.beGone() } } setupBottomActions() - bottom_aspect_ratio.performClick() } override fun onResume() { @@ -142,10 +147,31 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener private fun setupBottomActions() { setupPrimaryActionButtons() + setupCropRotateActionButtons() setupAspectRatioButtons() } private fun setupPrimaryActionButtons() { + bottom_primary_filter.setOnClickListener { + currPrimaryAction = if (currPrimaryAction == PRIMARY_ACTION_FILTER) { + PRIMARY_ACTION_NONE + } else { + PRIMARY_ACTION_FILTER + } + updatePrimaryActionButtons() + } + + bottom_primary_crop_rotate.setOnClickListener { + currPrimaryAction = if (currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) { + PRIMARY_ACTION_NONE + } else { + PRIMARY_ACTION_CROP_ROTATE + } + updatePrimaryActionButtons() + } + } + + private fun setupCropRotateActionButtons() { bottom_rotate.setOnClickListener { crop_image_view.rotateImage(90) } @@ -164,16 +190,16 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } bottom_aspect_ratio.setOnClickListener { - currPrimaryAction = if (currPrimaryAction == PRIMARY_ASPECT_RATIO) { + currCropRotateAction = if (currCropRotateAction == CROP_ROTATE_ASPECT_RATIO) { crop_image_view.guidelines = CropImageView.Guidelines.OFF bottom_aspect_ratios.beGone() - PRIMARY_NONE + CROP_ROTATE_NONE } else { crop_image_view.guidelines = CropImageView.Guidelines.ON bottom_aspect_ratios.beVisible() - PRIMARY_ASPECT_RATIO + CROP_ROTATE_ASPECT_RATIO } - updatePrimaryActionButtons() + updateCropRotateActionButtons() } } @@ -196,8 +222,29 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener updateAspectRatioButtons() } + private fun updatePrimaryActionButtons() { + arrayOf(bottom_primary_filter, bottom_primary_crop_rotate).forEach { + it.applyColorFilter(Color.WHITE) + } + + val currentPrimaryActionButton = when (currPrimaryAction) { + PRIMARY_ACTION_FILTER -> bottom_primary_filter + PRIMARY_ACTION_CROP_ROTATE -> bottom_primary_crop_rotate + else -> null + } + + currentPrimaryActionButton?.applyColorFilter(config.primaryColor) + if (currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) { + bottom_editor_edit_actions.beVisible() + } else { + bottom_aspect_ratios.beGone() + bottom_editor_edit_actions.beGone() + currCropRotateAction = CROP_ROTATE_NONE + } + } + private fun updateAspectRatio(aspectRatio: Int) { - currentAspectRatio = aspectRatio + currAspectRatio = aspectRatio updateAspectRatioButtons() crop_image_view.apply { @@ -220,7 +267,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener it.setTextColor(Color.WHITE) } - val currentAspectRatioButton = when (currentAspectRatio) { + val currentAspectRatioButton = when (currAspectRatio) { ASPECT_RATIO_FREE -> bottom_aspect_ratio_free ASPECT_RATIO_ONE_ONE -> bottom_aspect_ratio_one_one ASPECT_RATIO_FOUR_THREE -> bottom_aspect_ratio_four_three @@ -230,13 +277,13 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener currentAspectRatioButton.setTextColor(config.primaryColor) } - private fun updatePrimaryActionButtons() { + private fun updateCropRotateActionButtons() { arrayOf(bottom_aspect_ratio).forEach { it.applyColorFilter(Color.WHITE) } - val primaryActionView = when (currPrimaryAction) { - PRIMARY_ASPECT_RATIO -> bottom_aspect_ratio + val primaryActionView = when (currCropRotateAction) { + CROP_ROTATE_ASPECT_RATIO -> bottom_aspect_ratio else -> null } diff --git a/app/src/main/res/drawable-hdpi/ic_photo_filter.png b/app/src/main/res/drawable-hdpi/ic_photo_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..724d01d695c74706f9ce1caac761e19a3a9a8004 GIT binary patch literal 292 zcmV+<0o(qGP)j1^Vig3;>doHE_GR{$nXGOkh_Py?^S~U00009x$jC5zxmJA0*i;CV2&2Vpaok0M W$Y|Ui5!AE*00002x|B!Bnt}hxwk9#4Lb1pb1b2L>c%NL6oBy!C#FoYTw8{K*Z+E7=Bi@IyE6NrDKmpNMN>xAaPEuRnQ)F~^WMz+`I)=# z@a;Ndj4{R-Gcgvjo4b4`CoUw)xyAsVwg5_a2%tBh2^0q~kM3{*R8yUIz(EKY&`w+4 z0e8X$u!M++CHV$?3K(z}fHV09{0{Z=pb_t+!T_rHi}#mueF3`}Zo8@g zs@TC#hWo(|DpUk8pL+f>o?p~6S9Aa?I71JU>EaAaMFvnqI}vdV(#Cpu0oAl62-qz1 z5n3Ma5we%qKBF<_e0DM1PGLVX+GtZYN+h52X~L@)Hq3DbfHO+RX=cYgG0uxz&~P&D zoX;vE23aC1fbt|SC!Mr9Co5okk~yC`Hi!zKh>r~Sk)mwJXI|KV0;3gl1w3Q4XG#Jn zroc5j5|Nx=^Gwkw z7{0NkHNbBzY7Ow4yP5;4sa74}S%3vtfCX591z3OuC=2+AETu^U?jp$-mlTJQ + android:id="@+id/bottom_editor_edit_actions" + layout="@layout/bottom_editor_crop_rotate_actions" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_above="@+id/bottom_editor_primary_actions" + android:visibility="gone"/> + + diff --git a/app/src/main/res/layout/bottom_editor_actions.xml b/app/src/main/res/layout/bottom_editor_crop_rotate_actions.xml similarity index 96% rename from app/src/main/res/layout/bottom_editor_actions.xml rename to app/src/main/res/layout/bottom_editor_crop_rotate_actions.xml index 04a19515d..da48247b9 100644 --- a/app/src/main/res/layout/bottom_editor_actions.xml +++ b/app/src/main/res/layout/bottom_editor_crop_rotate_actions.xml @@ -5,8 +5,7 @@ android:id="@+id/bottom_editor_actions_wrapper" android:layout_width="match_parent" android:layout_height="@dimen/bottom_actions_height" - android:layout_alignParentBottom="true" - android:background="@drawable/gradient_background_lighter"> + android:layout_alignParentBottom="true"> + + + + + + + From 85e105819ce02f37aed74f821555c5c4afebc0be Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 19 Jul 2018 21:15:54 +0200 Subject: [PATCH 74/90] add an Editor horizontal recyclerview that will hold the filter previews --- .../gallery/activities/EditActivity.kt | 8 ++++---- app/src/main/res/layout/activity_edit.xml | 12 ++++++++++-- .../res/layout/bottom_editor_actions_filter.xml | 15 +++++++++++++++ 3 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 app/src/main/res/layout/bottom_editor_actions_filter.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index d8e53214b..ccfb847a4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -234,11 +234,11 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } currentPrimaryActionButton?.applyColorFilter(config.primaryColor) - if (currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) { - bottom_editor_edit_actions.beVisible() - } else { + bottom_editor_filter_actions.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_FILTER) + bottom_editor_crop_rotate_actions.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) + + if (currPrimaryAction != PRIMARY_ACTION_CROP_ROTATE) { bottom_aspect_ratios.beGone() - bottom_editor_edit_actions.beGone() currCropRotateAction = CROP_ROTATE_NONE } } diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml index 50fc8e022..30c0eaa05 100644 --- a/app/src/main/res/layout/activity_edit.xml +++ b/app/src/main/res/layout/activity_edit.xml @@ -19,11 +19,19 @@ layout="@layout/bottom_actions_aspect_ratio" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_above="@+id/bottom_editor_edit_actions" + android:layout_above="@+id/bottom_editor_crop_rotate_actions" android:visibility="gone"/> + + + + + + + From dbaacd596e35858aa38f307fe57bef19e331294d Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 19 Jul 2018 23:36:46 +0200 Subject: [PATCH 75/90] show a list of thumbnails at the editor, for applying filters --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 3 +- .../gallery/activities/EditActivity.kt | 29 ++++++++++++++ .../gallery/adapters/FiltersAdapter.kt | 38 +++++++++++++++++++ .../gallery/models/FilterItem.kt | 6 +++ .../layout/bottom_editor_actions_filter.xml | 9 +++-- .../main/res/layout/editor_filter_item.xml | 29 ++++++++++++++ app/src/main/res/values/dimens.xml | 2 + 8 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/gallery/adapters/FiltersAdapter.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/gallery/models/FilterItem.kt create mode 100644 app/src/main/res/layout/editor_filter_item.xml diff --git a/app/build.gradle b/app/build.gradle index 3b21595ad..14e86567d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,6 +57,7 @@ dependencies { implementation 'com.google.android.exoplayer:exoplayer-core:2.8.2' implementation 'com.google.vr:sdk-panowidget:1.150.0' implementation 'org.apache.sanselan:sanselan:0.97-incubator' + implementation 'info.androidhive:imagefilters:1.0.7' kapt "android.arch.persistence.room:compiler:1.1.1" implementation "android.arch.persistence.room:runtime:1.1.1" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d6c4a88c9..e58d5e3a1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,7 +21,8 @@ android:label="@string/app_launcher_name" android:roundIcon="@mipmap/ic_launcher" android:supportsRtl="true" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme" + tools:replace="android:label"> + + val adapter = FiltersAdapter(filterItems) { + + } + + bottom_actions_filter_list.adapter = adapter + adapter.notifyDataSetChanged() + } + }.start() + } + if (currPrimaryAction != PRIMARY_ACTION_CROP_ROTATE) { bottom_aspect_ratios.beGone() currCropRotateAction = CROP_ROTATE_NONE + updateCropRotateActionButtons() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/FiltersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/FiltersAdapter.kt new file mode 100644 index 000000000..9d02845bc --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/FiltersAdapter.kt @@ -0,0 +1,38 @@ +package com.simplemobiletools.gallery.adapters + +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.simplemobiletools.gallery.R +import com.simplemobiletools.gallery.models.FilterItem +import kotlinx.android.synthetic.main.editor_filter_item.view.* +import java.util.* + +class FiltersAdapter(val filterItems: ArrayList, val itemClick: (FilterItem) -> Unit) : RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bindView(filterItems[position], itemClick) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.editor_filter_item, parent, false) + return ViewHolder(view) + } + + override fun getItemCount() = filterItems.size + + class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + fun bindView(filterItem: FilterItem, itemClick: (FilterItem) -> Unit): View { + itemView.apply { + editor_filter_item_label.text = filterItem.filter.name + editor_filter_item_thumbnail.setImageBitmap(filterItem.bitmap) + + setOnClickListener { + itemClick.invoke(filterItem) + } + } + return itemView + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/models/FilterItem.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/models/FilterItem.kt new file mode 100644 index 000000000..f998efa27 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/models/FilterItem.kt @@ -0,0 +1,6 @@ +package com.simplemobiletools.gallery.models + +import android.graphics.Bitmap +import com.zomato.photofilters.imageprocessors.Filter + +data class FilterItem(val bitmap: Bitmap, val filter: Filter) diff --git a/app/src/main/res/layout/bottom_editor_actions_filter.xml b/app/src/main/res/layout/bottom_editor_actions_filter.xml index 51b5ffa3e..689e81f2e 100644 --- a/app/src/main/res/layout/bottom_editor_actions_filter.xml +++ b/app/src/main/res/layout/bottom_editor_actions_filter.xml @@ -1,15 +1,18 @@ + android:layout_height="@dimen/bottom_filters_height" + android:background="@color/crop_image_view_background" + android:orientation="horizontal" + app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/> diff --git a/app/src/main/res/layout/editor_filter_item.xml b/app/src/main/res/layout/editor_filter_item.xml new file mode 100644 index 000000000..28d915ef2 --- /dev/null +++ b/app/src/main/res/layout/editor_filter_item.xml @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 81fefce87..14367ad1f 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -11,4 +11,6 @@ 30dp 72dp 64dp + 76dp + 90dp From a995f5db3ce618cf13693f5e4c90e40bbabbbdd0 Mon Sep 17 00:00:00 2001 From: ScratchBuild Date: Fri, 20 Jul 2018 17:30:53 +0900 Subject: [PATCH 76/90] Update Japanese translation --- app/src/main/res/values-ja/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index a68a1a0e7..a9b209b0d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -5,11 +5,11 @@ 編集 カメラを開く (非表示) - (excluded) + (除外) フォルダをピン留めする フォルダのピン留めを外す トップにピン留めする - 全てを表示 + すべてを表示 すべてのフォルダ フォルダを選択する その他のフォルダ @@ -122,7 +122,7 @@ グループ分け 何もしない フォルダ - 最終更新 + 更新日時 撮影日時 ファイル形式 拡張子 @@ -153,8 +153,8 @@ ズームが可能な画像を高画質な物にする ステータスバーが非表示の時は詳細を隠す 無効なファイルを見せない調整を行う - 画面下部にアクションボタンを表示 - Show the Recycle Bin at the folders screen + 画面下部にアクションボタンを表示する + フォルダ画面にごみ箱を表示する サムネイル設定 From 8c116f6c16886ab46018ce649f4dea9b8d67edad Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 20 Jul 2018 11:07:25 +0200 Subject: [PATCH 77/90] apply the filters on thumbnail items --- .../gallery/activities/EditActivity.kt | 9 ++++++- .../helpers/FilterThumbnailsManager.kt | 26 +++++++++++++++++++ .../gallery/models/FilterItem.kt | 2 +- 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/gallery/helpers/FilterThumbnailsManager.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 802adaedd..a438dd1a7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -23,6 +23,7 @@ import com.simplemobiletools.gallery.dialogs.ResizeDialog import com.simplemobiletools.gallery.dialogs.SaveAsDialog import com.simplemobiletools.gallery.extensions.config import com.simplemobiletools.gallery.extensions.openEditor +import com.simplemobiletools.gallery.helpers.FilterThumbnailsManager import com.simplemobiletools.gallery.models.FilterItem import com.theartofdev.edmodo.cropper.CropImageView import com.zomato.photofilters.FilterPack @@ -253,8 +254,14 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener val size = resources.getDimension(R.dimen.bottom_filters_thumbnail_height).toInt() val bitmap = Glide.with(this).asBitmap().load(uri).submit(size, size).get() runOnUiThread { - val filterItems = FilterPack.getFilterPack(this).map { FilterItem(bitmap, it) } as ArrayList + FilterThumbnailsManager.clearThumbs() + FilterPack.getFilterPack(this).forEach { + val filterItem = FilterItem(bitmap, it) + FilterThumbnailsManager.addThumb(filterItem) + } + + val filterItems = FilterThumbnailsManager.processThumbs() val adapter = FiltersAdapter(filterItems) { } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/FilterThumbnailsManager.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/FilterThumbnailsManager.kt new file mode 100644 index 000000000..f9d833280 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/FilterThumbnailsManager.kt @@ -0,0 +1,26 @@ +package com.simplemobiletools.gallery.helpers + +import com.simplemobiletools.gallery.models.FilterItem +import java.util.* + +object FilterThumbnailsManager { + private var filterThumbnails = ArrayList(10) + private var processedThumbnails = ArrayList(10) + + fun addThumb(filterItem: FilterItem) { + filterThumbnails.add(filterItem) + } + + fun processThumbs(): ArrayList { + for (filterItem in filterThumbnails) { + filterItem.bitmap = filterItem.filter.processFilter(filterItem.bitmap) + processedThumbnails.add(filterItem) + } + return processedThumbnails + } + + fun clearThumbs() { + filterThumbnails = ArrayList() + processedThumbnails = ArrayList() + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/models/FilterItem.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/models/FilterItem.kt index f998efa27..f2dd7f2d6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/models/FilterItem.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/models/FilterItem.kt @@ -3,4 +3,4 @@ package com.simplemobiletools.gallery.models import android.graphics.Bitmap import com.zomato.photofilters.imageprocessors.Filter -data class FilterItem(val bitmap: Bitmap, val filter: Filter) +data class FilterItem(var bitmap: Bitmap, val filter: Filter) From efa93ef1a38d64dfffb2d4e27ae4f526c8ecf78e Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 20 Jul 2018 11:43:27 +0200 Subject: [PATCH 78/90] create a new bitmap copy at every filter --- .../gallery/helpers/FilterThumbnailsManager.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/FilterThumbnailsManager.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/FilterThumbnailsManager.kt index f9d833280..6ee92ae44 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/FilterThumbnailsManager.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/FilterThumbnailsManager.kt @@ -1,5 +1,6 @@ package com.simplemobiletools.gallery.helpers +import android.graphics.Bitmap import com.simplemobiletools.gallery.models.FilterItem import java.util.* @@ -13,7 +14,7 @@ object FilterThumbnailsManager { fun processThumbs(): ArrayList { for (filterItem in filterThumbnails) { - filterItem.bitmap = filterItem.filter.processFilter(filterItem.bitmap) + filterItem.bitmap = filterItem.filter.processFilter(Bitmap.createBitmap(filterItem.bitmap)) processedThumbnails.add(filterItem) } return processedThumbnails From 0e7eac1650806a8bb7863a48b024f23fd7bd7031 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 20 Jul 2018 11:47:41 +0200 Subject: [PATCH 79/90] do not make FilterThumbnailsManager static --- .../simplemobiletools/gallery/activities/EditActivity.kt | 7 ++++--- .../gallery/helpers/FilterThumbnailsManager.kt | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index a438dd1a7..86a6c3fdc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -254,14 +254,15 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener val size = resources.getDimension(R.dimen.bottom_filters_thumbnail_height).toInt() val bitmap = Glide.with(this).asBitmap().load(uri).submit(size, size).get() runOnUiThread { - FilterThumbnailsManager.clearThumbs() + val filterThumbnailsManager = FilterThumbnailsManager() + filterThumbnailsManager.clearThumbs() FilterPack.getFilterPack(this).forEach { val filterItem = FilterItem(bitmap, it) - FilterThumbnailsManager.addThumb(filterItem) + filterThumbnailsManager.addThumb(filterItem) } - val filterItems = FilterThumbnailsManager.processThumbs() + val filterItems = filterThumbnailsManager.processThumbs() val adapter = FiltersAdapter(filterItems) { } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/FilterThumbnailsManager.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/FilterThumbnailsManager.kt index 6ee92ae44..204f54f3b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/FilterThumbnailsManager.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/FilterThumbnailsManager.kt @@ -4,7 +4,7 @@ import android.graphics.Bitmap import com.simplemobiletools.gallery.models.FilterItem import java.util.* -object FilterThumbnailsManager { +class FilterThumbnailsManager { private var filterThumbnails = ArrayList(10) private var processedThumbnails = ArrayList(10) From efa2c9777ebfcbbf860e6e894feb52ac70e9e0d5 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 20 Jul 2018 11:48:56 +0200 Subject: [PATCH 80/90] create filter thumbnails just once, not at every filter toggle --- .../com/simplemobiletools/gallery/activities/EditActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 86a6c3fdc..10910fcab 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -249,7 +249,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener bottom_editor_filter_actions.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_FILTER) bottom_editor_crop_rotate_actions.beVisibleIf(currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) - if (currPrimaryAction == PRIMARY_ACTION_FILTER) { + if (currPrimaryAction == PRIMARY_ACTION_FILTER && bottom_actions_filter_list.adapter == null) { Thread { val size = resources.getDimension(R.dimen.bottom_filters_thumbnail_height).toInt() val bitmap = Glide.with(this).asBitmap().load(uri).submit(size, size).get() From 994d8fac093907615fa8cb9639e0d8d9c547a73a Mon Sep 17 00:00:00 2001 From: gregory678 Date: Sat, 21 Jul 2018 18:05:10 +0200 Subject: [PATCH 81/90] PL translation update [2018.07.21] --- app/src/main/res/values-pl/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a32fd452b..ed6d9d6d9 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -84,7 +84,7 @@ Przewróć w poziomie Przewróć w pionie Edytuj w: - Free + Wolne Tapeta @@ -154,7 +154,7 @@    Ukrywaj dodatkowe szczegóły gdy pasek stanu jest ukryty    Dodatkowe sprawdzenie w celu uniknięcia pokazywania niewłaściwych plików Pokazuj niektóre przyciski akcji na dole ekranu - Show the Recycle Bin at the folders screen + Pokazuj kosz w widoku folderów    Miniatury @@ -176,7 +176,7 @@    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. -    Jaka jest różnica pomiędzy ukryciem, a wykluczeniem folderu? +    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? Aplikacja niestety nie wie, czy dane zdjęcie jest okładką od piosenki czy czymś innym. Aby ukryć niechciane rzeczy, przytrzymaj je i wybierz opcję \'Wyklucz\' z paska akcji. From d308dfb069eb9fe63311be3d4c525e930f53cb67 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 22 Jul 2018 21:13:04 +0200 Subject: [PATCH 82/90] use Glide for loading the initial image in the editor --- .../gallery/activities/EditActivity.kt | 28 ++++++++++--------- app/src/main/res/layout/activity_edit.xml | 7 +++++ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 10910fcab..6644e91c9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -115,19 +115,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } isCropIntent = intent.extras?.get(CROP) == "true" - - crop_image_view.apply { - setOnCropImageCompleteListener(this@EditActivity) - setImageUriAsync(uri) - guidelines = CropImageView.Guidelines.ON - - if (isCropIntent && shouldCropSquare()) { - currAspectRatio = ASPECT_RATIO_ONE_ONE - setFixedAspectRatio(true) - bottom_aspect_ratio.beGone() - } - } - + Glide.with(this).load(uri).into(default_image_view) setupBottomActions() } @@ -157,6 +145,20 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener return true } + private fun loadCropImageView() { + crop_image_view.apply { + setOnCropImageCompleteListener(this@EditActivity) + setImageUriAsync(uri) + guidelines = CropImageView.Guidelines.ON + + if (isCropIntent && shouldCropSquare()) { + currAspectRatio = ASPECT_RATIO_ONE_ONE + setFixedAspectRatio(true) + bottom_aspect_ratio.beGone() + } + } + } + private fun setupBottomActions() { setupPrimaryActionButtons() setupCropRotateActionButtons() diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml index 30c0eaa05..a6b77522b 100644 --- a/app/src/main/res/layout/activity_edit.xml +++ b/app/src/main/res/layout/activity_edit.xml @@ -6,11 +6,18 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + From c17f77ceda6e5167a8b1af7c49132de636c7357a Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 22 Jul 2018 21:28:38 +0200 Subject: [PATCH 83/90] adding a new None filter as the first item --- app/build.gradle | 2 +- .../com/simplemobiletools/gallery/activities/EditActivity.kt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 14e86567d..8ff84d38f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.5.2' + implementation 'com.simplemobiletools:commons:4.5.3' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'com.android.support:multidex:1.0.3' implementation 'it.sephiroth.android.exif:library:1.0.1' diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 6644e91c9..3fe8a731e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -27,6 +27,7 @@ import com.simplemobiletools.gallery.helpers.FilterThumbnailsManager import com.simplemobiletools.gallery.models.FilterItem import com.theartofdev.edmodo.cropper.CropImageView import com.zomato.photofilters.FilterPack +import com.zomato.photofilters.imageprocessors.Filter import kotlinx.android.synthetic.main.activity_edit.* import kotlinx.android.synthetic.main.bottom_actions_aspect_ratio.* import kotlinx.android.synthetic.main.bottom_editor_actions_filter.* @@ -259,6 +260,9 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener val filterThumbnailsManager = FilterThumbnailsManager() filterThumbnailsManager.clearThumbs() + val noFilter = Filter(getString(R.string.none)) + filterThumbnailsManager.addThumb(FilterItem(bitmap, noFilter)) + FilterPack.getFilterPack(this).forEach { val filterItem = FilterItem(bitmap, it) filterThumbnailsManager.addThumb(filterItem) From 1112d5f19b2fd5b732aeee3a9c3c56664e45e1c3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 22 Jul 2018 22:02:08 +0200 Subject: [PATCH 84/90] apply the selected filter on the fullscreen shown image --- .../gallery/activities/EditActivity.kt | 22 +++++++++++++++++-- .../layout/bottom_editor_actions_filter.xml | 1 + 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 3fe8a731e..d7c4403d4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -12,6 +12,10 @@ import android.provider.MediaStore import android.view.Menu import android.view.MenuItem import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.OTG_PATH import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE @@ -69,6 +73,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener private var isCropIntent = false private var isEditingWithThirdParty = false + private var shownBitmap: Bitmap? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_edit) @@ -116,7 +122,18 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } isCropIntent = intent.extras?.get(CROP) == "true" - Glide.with(this).load(uri).into(default_image_view) + Glide.with(this) + .asBitmap() + .load(uri) + .listener(object : RequestListener { + override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean) = false + + override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { + shownBitmap = resource + return false + } + }).into(default_image_view) + setupBottomActions() } @@ -270,7 +287,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener val filterItems = filterThumbnailsManager.processThumbs() val adapter = FiltersAdapter(filterItems) { - + val newBitmap = Bitmap.createBitmap(shownBitmap) + default_image_view.setImageBitmap(it.filter.processFilter(newBitmap)) } bottom_actions_filter_list.adapter = adapter diff --git a/app/src/main/res/layout/bottom_editor_actions_filter.xml b/app/src/main/res/layout/bottom_editor_actions_filter.xml index 689e81f2e..734942343 100644 --- a/app/src/main/res/layout/bottom_editor_actions_filter.xml +++ b/app/src/main/res/layout/bottom_editor_actions_filter.xml @@ -13,6 +13,7 @@ android:layout_height="@dimen/bottom_filters_height" android:background="@color/crop_image_view_background" android:orientation="horizontal" + android:overScrollMode="never" app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/> From e17aa8b4b8721f872f5188c6a4b6b8ec83cb2f62 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 22 Jul 2018 22:17:30 +0200 Subject: [PATCH 85/90] mark the currently selected filter with a white stroke --- .../gallery/activities/EditActivity.kt | 2 +- .../gallery/adapters/FiltersAdapter.kt | 34 +++++++++++++++---- .../interfaces/FilterAdapterListener.kt | 9 +++++ .../main/res/drawable/stroke_background.xml | 8 +++++ .../main/res/layout/editor_filter_item.xml | 9 +++-- 5 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/FilterAdapterListener.kt create mode 100644 app/src/main/res/drawable/stroke_background.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index d7c4403d4..986bb3f71 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -286,7 +286,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } val filterItems = filterThumbnailsManager.processThumbs() - val adapter = FiltersAdapter(filterItems) { + val adapter = FiltersAdapter(applicationContext, filterItems) { val newBitmap = Bitmap.createBitmap(shownBitmap) default_image_view.setImageBitmap(it.filter.processFilter(newBitmap)) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/FiltersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/FiltersAdapter.kt index 9d02845bc..e8dfd83ef 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/FiltersAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/FiltersAdapter.kt @@ -1,35 +1,57 @@ package com.simplemobiletools.gallery.adapters +import android.content.Context +import android.graphics.drawable.Drawable import android.support.v7.widget.RecyclerView import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.simplemobiletools.gallery.R +import com.simplemobiletools.gallery.interfaces.FilterAdapterListener import com.simplemobiletools.gallery.models.FilterItem import kotlinx.android.synthetic.main.editor_filter_item.view.* import java.util.* -class FiltersAdapter(val filterItems: ArrayList, val itemClick: (FilterItem) -> Unit) : RecyclerView.Adapter() { +class FiltersAdapter(val context: Context, val filterItems: ArrayList, val itemClick: (FilterItem) -> Unit) : RecyclerView.Adapter(), + FilterAdapterListener { + + private var currentSelection = filterItems.first() + private var strokeBackground = context.resources.getDrawable(R.drawable.stroke_background) override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bindView(filterItems[position], itemClick) + holder.bindView(filterItems[position], strokeBackground) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.editor_filter_item, parent, false) - return ViewHolder(view) + return ViewHolder(view, this) } override fun getItemCount() = filterItems.size - class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { - fun bindView(filterItem: FilterItem, itemClick: (FilterItem) -> Unit): View { + override fun getCurrentFilter() = currentSelection + + override fun setCurrentFilter(filterItem: FilterItem) { + if (currentSelection != filterItem) { + currentSelection = filterItem + notifyDataSetChanged() + itemClick.invoke(filterItem) + } + } + + class ViewHolder(view: View, val filterAdapterListener: FilterAdapterListener) : RecyclerView.ViewHolder(view) { + fun bindView(filterItem: FilterItem, strokeBackground: Drawable): View { itemView.apply { editor_filter_item_label.text = filterItem.filter.name editor_filter_item_thumbnail.setImageBitmap(filterItem.bitmap) + editor_filter_item_thumbnail.background = if (filterAdapterListener.getCurrentFilter() == filterItem) { + strokeBackground + } else { + null + } setOnClickListener { - itemClick.invoke(filterItem) + filterAdapterListener.setCurrentFilter(filterItem) } } return itemView diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/FilterAdapterListener.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/FilterAdapterListener.kt new file mode 100644 index 000000000..3a5814721 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/FilterAdapterListener.kt @@ -0,0 +1,9 @@ +package com.simplemobiletools.gallery.interfaces + +import com.simplemobiletools.gallery.models.FilterItem + +interface FilterAdapterListener { + fun getCurrentFilter(): FilterItem + + fun setCurrentFilter(filterItem: FilterItem) +} diff --git a/app/src/main/res/drawable/stroke_background.xml b/app/src/main/res/drawable/stroke_background.xml new file mode 100644 index 000000000..6d274b7d2 --- /dev/null +++ b/app/src/main/res/drawable/stroke_background.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/app/src/main/res/layout/editor_filter_item.xml b/app/src/main/res/layout/editor_filter_item.xml index 28d915ef2..ff20581f1 100644 --- a/app/src/main/res/layout/editor_filter_item.xml +++ b/app/src/main/res/layout/editor_filter_item.xml @@ -4,16 +4,15 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/editor_filter_item_holder" android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingLeft="@dimen/tiny_margin" - android:paddingRight="@dimen/tiny_margin" - android:paddingTop="@dimen/tiny_margin"> + android:layout_height="wrap_content"> + android:layout_above="@+id/editor_filter_item_label" + android:background="@drawable/stroke_background" + android:padding="1dp"/> Date: Sun, 22 Jul 2018 23:32:14 +0200 Subject: [PATCH 86/90] rename shownBitmap to initialBitmap --- .../simplemobiletools/gallery/activities/EditActivity.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 986bb3f71..5d2085950 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -73,7 +73,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener private var isCropIntent = false private var isEditingWithThirdParty = false - private var shownBitmap: Bitmap? = null + private var initialBitmap: Bitmap? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -128,8 +128,8 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener .listener(object : RequestListener { override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean) = false - override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { - shownBitmap = resource + override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { + initialBitmap = bitmap return false } }).into(default_image_view) @@ -287,7 +287,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener val filterItems = filterThumbnailsManager.processThumbs() val adapter = FiltersAdapter(applicationContext, filterItems) { - val newBitmap = Bitmap.createBitmap(shownBitmap) + val newBitmap = Bitmap.createBitmap(initialBitmap) default_image_view.setImageBitmap(it.filter.processFilter(newBitmap)) } From 04da0fc1cfc9f5a8b529ecf664ce3f69c5a266b7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 23 Jul 2018 00:15:48 +0200 Subject: [PATCH 87/90] flip between crop and default image view as necessary --- .../gallery/activities/EditActivity.kt | 65 ++++++++++++++----- 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 5d2085950..490b9e2ff 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -122,18 +122,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } isCropIntent = intent.extras?.get(CROP) == "true" - Glide.with(this) - .asBitmap() - .load(uri) - .listener(object : RequestListener { - override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean) = false - - override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { - initialBitmap = bitmap - return false - } - }).into(default_image_view) - + loadDefaultImageView() setupBottomActions() } @@ -156,15 +145,41 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.save_as -> crop_image_view.getCroppedImageAsync() + R.id.save_as -> saveImage() R.id.edit -> editWith() else -> return super.onOptionsItemSelected(item) } return true } + private fun loadDefaultImageView() { + default_image_view.beVisible() + crop_image_view.beGone() + Glide.with(this) + .asBitmap() + .load(uri) + .listener(object : RequestListener { + override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean) = false + + override fun onResourceReady(bitmap: Bitmap?, model: Any?, target: Target?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { + val currentFilter = getFiltersAdapter()?.getCurrentFilter() + if (initialBitmap != null && currentFilter != null && currentFilter.filter.name != getString(R.string.none)) { + default_image_view.onGlobalLayout { + applyFilter(currentFilter) + } + } else { + initialBitmap = bitmap + } + + return false + } + }).into(default_image_view) + } + private fun loadCropImageView() { + default_image_view.beGone() crop_image_view.apply { + beVisible() setOnCropImageCompleteListener(this@EditActivity) setImageUriAsync(uri) guidelines = CropImageView.Guidelines.ON @@ -177,6 +192,16 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } } + private fun saveImage() { + if (crop_image_view.isVisible()) { + crop_image_view.getCroppedImageAsync() + } else { + val currentFilter = getFiltersAdapter()?.getCurrentFilter() + } + } + + private fun getFiltersAdapter() = bottom_actions_filter_list.adapter as? FiltersAdapter + private fun setupBottomActions() { setupPrimaryActionButtons() setupCropRotateActionButtons() @@ -255,6 +280,12 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } private fun updatePrimaryActionButtons() { + if (crop_image_view.isGone() && currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) { + loadCropImageView() + } else if (default_image_view.isGone() && currPrimaryAction == PRIMARY_ACTION_FILTER) { + loadDefaultImageView() + } + arrayOf(bottom_primary_filter, bottom_primary_crop_rotate).forEach { it.applyColorFilter(Color.WHITE) } @@ -287,8 +318,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener val filterItems = filterThumbnailsManager.processThumbs() val adapter = FiltersAdapter(applicationContext, filterItems) { - val newBitmap = Bitmap.createBitmap(initialBitmap) - default_image_view.setImageBitmap(it.filter.processFilter(newBitmap)) + applyFilter(it) } bottom_actions_filter_list.adapter = adapter @@ -304,6 +334,11 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } } + private fun applyFilter(filterItem: FilterItem) { + val newBitmap = Bitmap.createBitmap(initialBitmap) + default_image_view.setImageBitmap(filterItem.filter.processFilter(newBitmap)) + } + private fun updateAspectRatio(aspectRatio: Int) { currAspectRatio = aspectRatio updateAspectRatioButtons() From 3c48af1c916c72bce6bd36248dac837e91e8e753 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 23 Jul 2018 12:24:09 +0200 Subject: [PATCH 88/90] handle saving images with a filter applied --- .../gallery/activities/EditActivity.kt | 82 +++++++++++++------ 1 file changed, 57 insertions(+), 25 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 490b9e2ff..3675eb347 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -13,8 +13,10 @@ import android.view.Menu import android.view.MenuItem import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.Target import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.OTG_PATH @@ -155,9 +157,15 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener private fun loadDefaultImageView() { default_image_view.beVisible() crop_image_view.beGone() + + val options = RequestOptions() + .skipMemoryCache(true) + .diskCacheStrategy(DiskCacheStrategy.NONE) + Glide.with(this) .asBitmap() .load(uri) + .apply(options) .listener(object : RequestListener { override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean) = false @@ -196,7 +204,23 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener if (crop_image_view.isVisible()) { crop_image_view.getCroppedImageAsync() } else { - val currentFilter = getFiltersAdapter()?.getCurrentFilter() + val currentFilter = getFiltersAdapter()?.getCurrentFilter() ?: return + val filePathGetter = getNewFilePath() + SaveAsDialog(this, filePathGetter.first, filePathGetter.second) { + toast(R.string.saving) + + // clean up everything to free as much memory as possible + default_image_view.setImageResource(0) + crop_image_view.setImageBitmap(null) + bottom_actions_filter_list.adapter = null + bottom_actions_filter_list.beGone() + + Thread { + val originalBitmap = Glide.with(applicationContext).asBitmap().load(uri).submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get() + currentFilter.filter.processFilter(originalBitmap) + saveBitmapToFile(originalBitmap, it, false) + }.start() + } } } @@ -423,7 +447,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener if (result.error == null) { if (isCropIntent) { if (saveUri.scheme == "file") { - saveBitmapToFile(result.bitmap, saveUri.path) + saveBitmapToFile(result.bitmap, saveUri.path, true) } else { var inputStream: InputStream? = null var outputStream: OutputStream? = null @@ -447,27 +471,12 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } } else if (saveUri.scheme == "file") { SaveAsDialog(this, saveUri.path, true) { - saveBitmapToFile(result.bitmap, it) + saveBitmapToFile(result.bitmap, it, true) } } else if (saveUri.scheme == "content") { - var newPath = applicationContext.getRealPathFromURI(saveUri) ?: "" - var shouldAppendFilename = true - if (newPath.isEmpty()) { - val filename = applicationContext.getFilenameFromContentUri(saveUri) ?: "" - if (filename.isNotEmpty()) { - val path = if (intent.extras?.containsKey(REAL_FILE_PATH) == true) intent.getStringExtra(REAL_FILE_PATH).getParentPath() else internalStoragePath - newPath = "$path/$filename" - shouldAppendFilename = false - } - } - - if (newPath.isEmpty()) { - newPath = "$internalStoragePath/${getCurrentFormattedDateTime()}.${saveUri.toString().getFilenameExtension()}" - shouldAppendFilename = false - } - - SaveAsDialog(this, newPath, shouldAppendFilename) { - saveBitmapToFile(result.bitmap, it) + val filePathGetter = getNewFilePath() + SaveAsDialog(this, filePathGetter.first, filePathGetter.second) { + saveBitmapToFile(result.bitmap, it, true) } } else { toast(R.string.unknown_file_location) @@ -477,14 +486,34 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } } - private fun saveBitmapToFile(bitmap: Bitmap, path: String) { + private fun getNewFilePath(): Pair { + var newPath = applicationContext.getRealPathFromURI(saveUri) ?: "" + var shouldAppendFilename = true + if (newPath.isEmpty()) { + val filename = applicationContext.getFilenameFromContentUri(saveUri) ?: "" + if (filename.isNotEmpty()) { + val path = if (intent.extras?.containsKey(REAL_FILE_PATH) == true) intent.getStringExtra(REAL_FILE_PATH).getParentPath() else internalStoragePath + newPath = "$path/$filename" + shouldAppendFilename = false + } + } + + if (newPath.isEmpty()) { + newPath = "$internalStoragePath/${getCurrentFormattedDateTime()}.${saveUri.toString().getFilenameExtension()}" + shouldAppendFilename = false + } + + return Pair(newPath, shouldAppendFilename) + } + + private fun saveBitmapToFile(bitmap: Bitmap, path: String, showSavingToast: Boolean) { try { Thread { val file = File(path) val fileDirItem = FileDirItem(path, path.getFilenameFromPath()) getFileOutputStream(fileDirItem, true) { if (it != null) { - saveBitmap(file, bitmap, it) + saveBitmap(file, bitmap, it, showSavingToast) } else { toast(R.string.image_editing_failed) } @@ -497,8 +526,11 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } } - private fun saveBitmap(file: File, bitmap: Bitmap, out: OutputStream) { - toast(R.string.saving) + private fun saveBitmap(file: File, bitmap: Bitmap, out: OutputStream, showSavingToast: Boolean) { + if (showSavingToast) { + toast(R.string.saving) + } + if (resizeWidth > 0 && resizeHeight > 0) { val resized = Bitmap.createScaledBitmap(bitmap, resizeWidth, resizeHeight, false) resized.compress(file.absolutePath.getCompressionFormat(), 90, out) From 91bb5b70ded83e5dfd4efe6259881292994e231f Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 23 Jul 2018 12:36:08 +0200 Subject: [PATCH 89/90] automatically switch to crop_rotate primary action at Crop intent --- .../simplemobiletools/gallery/activities/EditActivity.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index 3675eb347..f2ae48e70 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -179,6 +179,12 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener initialBitmap = bitmap } + if (isCropIntent) { + loadCropImageView() + bottom_primary_filter.beGone() + bottom_primary_crop_rotate.performClick() + } + return false } }).into(default_image_view) From 9cfab3abc30dc199607dc2750288ab03f08171af Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 23 Jul 2018 12:49:05 +0200 Subject: [PATCH 90/90] hide the bottom primary actions at editor crop intent --- .../gallery/activities/EditActivity.kt | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt index f2ae48e70..3aca45b31 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/EditActivity.kt @@ -11,6 +11,7 @@ import android.os.Bundle import android.provider.MediaStore import android.view.Menu import android.view.MenuItem +import android.widget.RelativeLayout import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.DiskCacheStrategy @@ -124,6 +125,11 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener } isCropIntent = intent.extras?.get(CROP) == "true" + if (isCropIntent) { + bottom_editor_primary_actions.beGone() + (bottom_editor_crop_rotate_actions.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1) + } + loadDefaultImageView() setupBottomActions() } @@ -182,7 +188,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener if (isCropIntent) { loadCropImageView() bottom_primary_filter.beGone() - bottom_primary_crop_rotate.performClick() + bottomCropRotateClicked() } return false @@ -240,24 +246,32 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener private fun setupPrimaryActionButtons() { bottom_primary_filter.setOnClickListener { - currPrimaryAction = if (currPrimaryAction == PRIMARY_ACTION_FILTER) { - PRIMARY_ACTION_NONE - } else { - PRIMARY_ACTION_FILTER - } - updatePrimaryActionButtons() + bottomFilterClicked() } bottom_primary_crop_rotate.setOnClickListener { - currPrimaryAction = if (currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) { - PRIMARY_ACTION_NONE - } else { - PRIMARY_ACTION_CROP_ROTATE - } - updatePrimaryActionButtons() + bottomCropRotateClicked() } } + private fun bottomFilterClicked() { + currPrimaryAction = if (currPrimaryAction == PRIMARY_ACTION_FILTER) { + PRIMARY_ACTION_NONE + } else { + PRIMARY_ACTION_FILTER + } + updatePrimaryActionButtons() + } + + private fun bottomCropRotateClicked() { + currPrimaryAction = if (currPrimaryAction == PRIMARY_ACTION_CROP_ROTATE) { + PRIMARY_ACTION_NONE + } else { + PRIMARY_ACTION_CROP_ROTATE + } + updatePrimaryActionButtons() + } + private fun setupCropRotateActionButtons() { bottom_rotate.setOnClickListener { crop_image_view.rotateImage(90)