From fb7aff39c4981adf17a0e61a6108f4f8f4792e81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xos=C3=A9=20M?= Date: Wed, 30 May 2018 07:07:37 +0200 Subject: [PATCH 01/64] actualiza galego --- app/src/main/res/values-gl/strings.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 78d103389..6a82b46ab 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -5,7 +5,7 @@ Editar Abrir cámara (oculto) - (excluded) + (excluído) Fixar cartafol Soltar cartafol Fixar arriba @@ -81,12 +81,12 @@ Editar con - Simple Fondo + Fondo de pantalla Establecer como fondo de pantalla Fallou establecer fondo de pantalla Establecer fondo de pantalla con: Establecendo fondo de pantalla… - Fondo de pantalla establecido con éxito + Fondo de pantalla establecido correctamente Proporción de Retrato Proporción de Paisaxe Pantalla de incio @@ -110,16 +110,16 @@ Cambiar o tipo de vista Grella Lista - Group direct subfolders + Agrupar subcartafoles directos - Group by - Do not group files - Folder - Last modified - Date taken - File type - Extension + Agrupar por + Non agrupar ficheiros + Cartafol + Último modificado + Data de captura + Tipo de ficheior + Extensión Reproducir vídeos automticamente @@ -185,7 +185,7 @@ A Galería tamén se ofrece como aplicación de terceiros para vista previa de imaxes / vídeos, engadir anexos en correos etc. É perfecta para o uso diario. - The fingerprint permission is needed for locking either hidden item visibility, or the whole app. + O permiso de pegada é preciso para bloquear a visibilidade de elementos ocultos ou o aplicativo completo. Non contén anuncios nin solicita permisos innecesarios. É de código aberto, con cores personalizadas. From f95c19c1c65ffb3a453117ffe03788fd7346373c Mon Sep 17 00:00:00 2001 From: gregory678 Date: Wed, 30 May 2018 14:54:24 +0200 Subject: [PATCH 02/64] Updates and fixes [2018.05.30] --- app/src/main/res/values-pl/strings.xml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 7e27a6fe9..b16808cb8 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -110,16 +110,16 @@    Zmień typ widoku    Siatka    Lista - Group direct subfolders + Grupuj bezpośrednie podfoldery - Group by - Do not group files - Folder - Last modified - Date taken - File type - Extension + Grupuj według + Nie grupuj plików + Folderu + Daty ostatniej modyfikacji + Daty utworzenia + Typu + Rozszerzenia Odtwarzaj filmy automatycznie @@ -172,8 +172,8 @@    Przejdź do sekcji z wykluczonymi folderami w ustawieniach aplikacji, dodaj tam folder główny (\"/\"), a następnie dodaj pożądane foldery w sekcji z dołączonymi folderami.    Zdjęcia w widoku pełnoekranowym mają dziwne artefakty. Jak mogę to naprawić?    U ustawieniach aplikacji włącz opcję \'Zamieniaj powiększalne obrazy na te o lepszej jakości\'. Poprawi ona jakość zdjęć, jednak przy bardzo dużych powiększeniach mogą się stać one zbyt rozmazane. - Can I crop images with this app? - Yes, you can crop images in the editor, by dragging the image corners. You can get to the editor either by long pressing an image thumbnail and selecting Edit, or selecting Edit from the fullscreen view. + Czy mogę w tej aplikacji przycinać obrazy? + Tak, możesz to zrobić w edytorze, przeciągając krawędzie obrazu. Edytor otworzysz przytrzymując miniaturę obrazu i wybierając opcję \'Edytuj\', bądź wybierając tą samą opcję w menu pełnoekranowym. From fe3a7c6f5edc94c4efdeffe6aa1d113572bdc469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Wed, 30 May 2018 20:45:16 +0200 Subject: [PATCH 03/64] Update strings.xml --- app/src/main/res/values-ca/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index f6db484e3..c69b94e16 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -110,16 +110,16 @@ Canviar el tipus de vista Reixeta Llista - Group direct subfolders + Agrupar carpetes directes - Group by - Do not group files - Folder - Last modified - Date taken - File type - Extension + Agrupar per + No agrupar fitxers + Carpeta + Darrer modificat + Data de presa + Tipus de fitxer + Extensió Reproduir vídeos automàticament From 4c7df4bd58aa1ef65b82194e3413148584f79aa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Solatec=20Inform=C3=A0tica?= <35220662+Solatec@users.noreply.github.com> Date: Wed, 30 May 2018 20:47:17 +0200 Subject: [PATCH 04/64] Update strings.xml --- app/src/main/res/values-es/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 8011439d0..ba9877366 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -110,16 +110,16 @@ Cambiar tipo de vista Cuadrícula Lista - Group direct subfolders + Agrupar subcarpetas directas - Group by - Do not group files - Folder - Last modified - Date taken - File type - Extension + Agrupar por + No agrupar ficheros + Carpeta + Último modificado + Data de toma + Tipo de fichero + Extensión Reproducir vídeos automáticamente From 702164e719b428238dbbe14b326f287e8c77d452 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 31 May 2018 18:37:35 +0200 Subject: [PATCH 05/64] updating a spanish word --- 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 ba9877366..2cac25fa8 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -160,7 +160,7 @@ He protegido la aplicación con una contraseña, pero la he olvidado. ¿Que puedo hacer? Puedes resolverlo de 2 maneras. Puede reinstalar la aplicación o encontrar la aplicación en la configuración de su dispositivo y seleccionar \"Borrar datos \". Restablecerá todas sus configuraciones, no eliminará ningún archivo multimedia. ¿Cómo puedo hacer que un álbum siempre aparezca en la parte superior? - Puede aguantar pulaso el álbum deseado y seleccionar el ícono Pin en el menú de acción, que lo fijará en la parte superior. También puede anclar varias carpetas, los artículos fijados se ordenarán por el método de clasificación predeterminado. + Puede aguantar pressing el álbum deseado y seleccionar el ícono Pin en el menú de acción, que lo fijará en la parte superior. También puede anclar varias carpetas, los artículos fijados se ordenarán por el método de clasificación predeterminado. ¿Cómo puedo avanzar videos? Puede hacer clic en los textos de duración actual o máxima cerca de la barra de búsqueda, que moverán el video hacia atrás o hacia adelante. ¿Cuál es la diferencia entre ocultar y excluir una carpeta? From a417a20e114de5113cb2337e707895edd77ad588 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 2 Jun 2018 15:39:37 +0200 Subject: [PATCH 06/64] create a list of folders that should be ignored (fake internal storage paths) --- .../com/simplemobiletools/gallery/helpers/MediaFetcher.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt index bb577941c..13e3b826a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt @@ -97,6 +97,7 @@ class MediaFetcher(val context: Context) { } private fun parseCursor(cursor: Cursor): ArrayList { + val foldersToIgnore = arrayListOf("/storage/emulated/legacy") val config = context.config val includedFolders = config.includedFolders var foldersToScan = ArrayList() @@ -106,7 +107,7 @@ class MediaFetcher(val context: Context) { do { val path = cursor.getStringValue(MediaStore.Images.Media.DATA).trim() val parentPath = File(path).parent?.trimEnd('/') ?: continue - if (!includedFolders.contains(parentPath)) { + if (!includedFolders.contains(parentPath) && !foldersToIgnore.contains(parentPath.toLowerCase())) { foldersToScan.add(parentPath) } } while (cursor.moveToNext()) From 209b11bc565a34dce132a9fff5822d1b11d981f7 Mon Sep 17 00:00:00 2001 From: en2sv Date: Sat, 2 Jun 2018 20:09:31 +0200 Subject: [PATCH 07/64] Update Swedish translation --- app/src/main/res/values-sv/strings.xml | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 067406436..75cc0e3aa 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -81,12 +81,12 @@ Redigera med - Bakgrundsbild - Ange som bakgrundsbild - Det gick inte att byta bakgrundsbild - Ange som bakgrundsbild med: - Inställningar för bakgrundsbild… - Bakgrundsbilden är ändrad + Bakgrund + Använd som bakgrund + Det gick inte att ställa in bakgrunden + Ställ in som bakgrund med: + Ställer in bakgrunden… + Bakgrunden har ställts in Stående bildförhållande Liggande bildförhållande Startskärm @@ -110,16 +110,16 @@ Ändra vy Rutnät Lista - Group direct subfolders + Gruppera direkta undermappar - Group by - Do not group files - Folder - Last modified - Date taken - File type - Extension + Gruppera efter + Gruppera inte filer + Mapp + Senast ändrad + Fotodatum + Filtyp + Filnamnstillägg Spela upp videor automatiskt From faedde22b1e5d21d77301de1f9bff5d9fe5a9546 Mon Sep 17 00:00:00 2001 From: fricyo <30796677+fricyo@users.noreply.github.com> Date: Mon, 4 Jun 2018 17:52:50 +0800 Subject: [PATCH 08/64] Update Translation --- app/src/main/res/values-zh-rTW/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 4f8a69048..7fb0b00f2 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -115,11 +115,11 @@ Group by Do not group files - Folder - Last modified - Date taken - File type - Extension + 資料夾 + 最後修改 + 拍照日期 + 檔案類型 + 副檔名 自動播放影片 From 9e63236ea6c7d8ddfa854e2b89dd43669ab4d141 Mon Sep 17 00:00:00 2001 From: Jonas Schubert Date: Mon, 4 Jun 2018 22:25:41 +0200 Subject: [PATCH 09/64] Updated german translations --- app/src/main/res/values-de/strings.xml | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 7686ee191..82e910be7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,11 +1,11 @@  - Schlichte Galerie + Simple Gallery Galerie Bearbeiten Kamera öffnen (versteckt) - (excluded) + (ausgenohmen) Ordner anheften Ordner loslösen Oben anheften @@ -110,15 +110,15 @@ Darstellung ändern Gitter Liste - Group direct subfolders + Direkte Unterordner gruppieren - Group by - Do not group files - Folder - Last modified - Date taken - File type + Gruppieren bei + Dateien nicht gruppieren + Ordner + Zuletzt geändert + Erstelldatum + Dateitype Extension @@ -179,17 +179,17 @@ - Eine schlichte Galerie zum Betrachten von Bildern und Videos, ganz ohne Werbung. + Eine einfache Galerie zum Betrachten von Bildern und Videos, ganz ohne Werbung. - Eine schlichte App zum Betrachten von Bildern und Videos. Alle Medien können nach Datum, Größe, Name sowie auf- oder absteigend sortiert werden, in Bilder kann auch hineingezoomt werden. Die Vorschau-Kacheln werden in mehreren Spalten abhängig von der Displaygröße angezeigt, die Spaltenanzahl ist mit Zweifingergesten änderbar. Die Medien können umbenannt, geteilt, gelöscht, kopiert und verschoben werden. Bilder können direkt aus der App heraus zugeschnitten, gedreht oder als Hintergrund festgelegt werden. + Eine einfache Anwendung zum Betrachten von Bildern und Videos. Alle Medien können nach Datum, Größe, Name sowie auf- oder absteigend sortiert werden, in Bilder kann auch hineingezoomt werden. Die Vorschau-Kacheln werden in mehreren Spalten abhängig von der Displaygröße angezeigt, die Spaltenanzahl ist mit Zweifingergesten änderbar. Die Medien können umbenannt, geteilt, gelöscht, kopiert und verschoben werden. Bilder können direkt aus der Anwendung heraus zugeschnitten, gedreht oder als Hintergrund festgelegt werden. - Diese Galerie bietet auch für Drittanbieter einige Funktionen an: zur Vorschau von Bildern/Videos, zum Hinzufügen von Anhängen bei Email-Apps, etc. Sie ist perfekt für den täglichen Gebrauch. + Diese Galerie bietet auch für Drittanbieter einige Funktionen an: zur Vorschau von Bildern/Videos, zum Hinzufügen von Anhängen bei Email-Anwendungen, etc. Sie ist perfekt für den täglichen Gebrauch. - Die Berechtigung für Fingerabdrücke wird nur benötigt, um die Sichtbarkeit von versteckten Dateien oder die gesamte App zu sperren. + Die Berechtigung für Fingerabdrücke wird nur benötigt, um die Sichtbarkeit von versteckten Dateien oder die gesamte Anwendung zu sperren. Beinhaltet keine Werbung oder unnötige Berechtigungen. Sie ist komplett Open Source, alle verwendeten Farben sind anpassbar. - Diese App ist nur eine aus einer größeren Serie von schlichten Apps. Der Rest davon findet sich auf https://www.simplemobiletools.com + Diese Anwendung ist nur eine aus einer größeren Serie. Der Rest davon findet sich auf https://www.simplemobiletools.com - Eine einfache Galerie zum Betrachten von Bildern und Videos, ganz ohne Werbung. + Eine schlichte Galerie zum Betrachten von Bildern und Videos, ganz ohne Werbung. - Eine einfache Anwendung zum Betrachten von Bildern und Videos. Alle Medien können nach Datum, Größe, Name sowie auf- oder absteigend sortiert werden, in Bilder kann auch hineingezoomt werden. Die Vorschau-Kacheln werden in mehreren Spalten abhängig von der Displaygröße angezeigt, die Spaltenanzahl ist mit Zweifingergesten änderbar. Die Medien können umbenannt, geteilt, gelöscht, kopiert und verschoben werden. Bilder können direkt aus der Anwendung heraus zugeschnitten, gedreht oder als Hintergrund festgelegt werden. - - Diese Galerie bietet auch für Drittanbieter einige Funktionen an: zur Vorschau von Bildern/Videos, zum Hinzufügen von Anhängen bei Email-Anwendungen, etc. Sie ist perfekt für den täglichen Gebrauch. - - Die Berechtigung für Fingerabdrücke wird nur benötigt, um die Sichtbarkeit von versteckten Dateien oder die gesamte Anwendung zu sperren. - - Beinhaltet keine Werbung oder unnötige Berechtigungen. Sie ist komplett Open Source, alle verwendeten Farben sind anpassbar. - - Diese Anwendung ist nur eine aus einer größeren Serie. Der Rest davon findet sich auf https://www.simplemobiletools.com + Eine schlichte App zum Betrachten von Bildern und Videos. Alle Medien können nach Datum, Größe, Name sowie auf- oder absteigend sortiert werden, in Bilder kann auch hineingezoomt werden. Die Vorschau-Kacheln werden in mehreren Spalten abhängig von der Displaygröße angezeigt, die Spaltenanzahl ist mit Zweifingergesten änderbar. Die Medien können umbenannt, geteilt, gelöscht, kopiert und verschoben werden. Bilder können direkt aus der App heraus zugeschnitten, gedreht oder als Hintergrund festgelegt werden. + Eine einfache Anwendung zum Betrachten von Bildern und Videos. Alle Medien können nach Datum, Größe, Name sowie auf- oder absteigend sortiert werden, in Bilder kann auch hineingezoomt werden. Die Vorschau-Kacheln werden in mehreren Spalten abhängig von der Displaygröße angezeigt, die Spaltenanzahl ist mit Zweifingergesten änderbar. Die Medien können umbenannt, geteilt, gelöscht, kopiert und verschoben werden. Bilder können direkt aus der Anwendung heraus zugeschnitten, gedreht oder als Hintergrund festgelegt werden. + + Diese Galerie bietet auch für Drittanbieter einige Funktionen an: zur Vorschau von Bildern/Videos, zum Hinzufügen von Anhängen bei Email-Apps, etc. Sie ist perfekt für den täglichen Gebrauch. + Diese Galerie bietet auch für Drittanbieter einige Funktionen an: zur Vorschau von Bildern/Videos, zum Hinzufügen von Anhängen bei Email-Anwendungen, etc. Sie ist perfekt für den täglichen Gebrauch. + + Die Berechtigung für Fingerabdrücke wird nur benötigt, um die Sichtbarkeit von versteckten Dateien oder die gesamte App zu sperren. + Die Berechtigung für Fingerabdrücke wird nur benötigt, um die Sichtbarkeit von versteckten Dateien oder die gesamte Anwendung zu sperren. + + Beinhaltet keine Werbung oder unnötige Berechtigungen. Sie ist komplett Open Source, alle verwendeten Farben sind anpassbar. Beinhaltet keine Werbung oder unnötige Berechtigungen. Sie ist komplett Open Source, alle verwendeten Farben sind anpassbar. + + Diese App ist nur eine aus einer größeren Serie von schlichten Apps. Der Rest davon findet sich auf https://www.simplemobiletools.com Eine schlichte Galerie zum Betrachten von Bildern und Videos, ganz ohne Werbung. - Eine schlichte App zum Betrachten von Bildern und Videos. Alle Medien können nach Datum, Größe, Name sowie auf- oder absteigend sortiert werden, in Bilder kann auch hineingezoomt werden. Die Vorschau-Kacheln werden in mehreren Spalten abhängig von der Displaygröße angezeigt, die Spaltenanzahl ist mit Zweifingergesten änderbar. Die Medien können umbenannt, geteilt, gelöscht, kopiert und verschoben werden. Bilder können direkt aus der App heraus zugeschnitten, gedreht oder als Hintergrund festgelegt werden. + Eine einfache Anwendung zum Betrachten von Bildern und Videos. Alle Medien können nach Datum, Größe, Name sowie auf- oder absteigend sortiert werden, in Bilder kann auch hineingezoomt werden. Die Vorschau-Kacheln werden in mehreren Spalten abhängig von der Displaygröße angezeigt, die Spaltenanzahl ist mit Zweifingergesten änderbar. Die Medien können umbenannt, geteilt, gelöscht, kopiert und verschoben werden. Bilder können direkt aus der Anwendung heraus zugeschnitten, gedreht oder als Hintergrund festgelegt werden. + Eine schlichte App zum Betrachten von Bildern und Videos. Alle Medien können nach Datum, Größe, Name sowie auf- oder absteigend sortiert werden, in Bilder kann auch hineingezoomt werden. Die Vorschau-Kacheln werden in mehreren Spalten abhängig von der Displaygröße angezeigt, die Spaltenanzahl ist mit Zweifingergesten änderbar. Die Medien können umbenannt, geteilt, gelöscht, kopiert und verschoben werden. Bilder können direkt aus der App heraus zugeschnitten, gedreht oder als Hintergrund festgelegt werden. - Diese Galerie bietet auch für Drittanbieter einige Funktionen an: zur Vorschau von Bildern/Videos, zum Hinzufügen von Anhängen bei Email-Apps, etc. Sie ist perfekt für den täglichen Gebrauch. + Diese Galerie bietet auch für Drittanbieter einige Funktionen an: zur Vorschau von Bildern/Videos, zum Hinzufügen von Anhängen bei Email-Anwendungen, etc. Sie ist perfekt für den täglichen Gebrauch. + Diese Galerie bietet auch für Drittanbieter einige Funktionen an: zur Vorschau von Bildern/Videos, zum Hinzufügen von Anhängen bei Email-Apps, etc. Sie ist perfekt für den täglichen Gebrauch. - Die Berechtigung für Fingerabdrücke wird nur benötigt, um die Sichtbarkeit von versteckten Dateien oder die gesamte App zu sperren. + Die Berechtigung für Fingerabdrücke wird nur benötigt, um die Sichtbarkeit von versteckten Dateien oder die gesamte Anwendung zu sperren. + Die Berechtigung für Fingerabdrücke wird nur benötigt, um die Sichtbarkeit von versteckten Dateien oder die gesamte App zu sperren. - Beinhaltet keine Werbung oder unnötige Berechtigungen. Sie ist komplett Open Source, alle verwendeten Farben sind anpassbar. Beinhaltet keine Werbung oder unnötige Berechtigungen. Sie ist komplett Open Source, alle verwendeten Farben sind anpassbar. + Beinhaltet keine Werbung oder unnötige Berechtigungen. Sie ist komplett Open Source, alle verwendeten Farben sind anpassbar. Diese App ist nur eine aus einer größeren Serie von schlichten Apps. Der Rest davon findet sich auf https://www.simplemobiletools.com From c8fedf881992346205f84318e49f5a05c62be9ad Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 11 Jun 2018 11:29:26 +0200 Subject: [PATCH 13/64] update gradle to 3.1.3 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0a7f22883..7cbfad621 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.android.tools.build:gradle:3.1.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From 564dd00762d4a07dd89a9bfdaa6f601e18643ab8 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 12 Jun 2018 12:09:36 +0200 Subject: [PATCH 14/64] add back the Main intent at splash activity --- app/src/main/AndroidManifest.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f0b41b8a..601881fd6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,6 +20,8 @@ android:name=".activities.SplashActivity" android:theme="@style/SplashTheme"> + + From d5bf084b65b33ee5cd046974ee0dbae5caad2d88 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 13 Jun 2018 21:59:02 +0200 Subject: [PATCH 15/64] update commons to 4.1.7 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 77b4f15bb..0ee10cffb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.1.4' + implementation 'com.simplemobiletools:commons:4.1.7' 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 92eb5d09bc115af41b0d0b671d1c8f47fdd748d5 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 13 Jun 2018 22:58:49 +0200 Subject: [PATCH 16/64] update kotlin to 1.2.50 --- app/build.gradle | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0ee10cffb..c61e284c6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.1.7' + implementation 'com.simplemobiletools:commons:4.1.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/build.gradle b/build.gradle index 7cbfad621..ce1386288 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.41' + ext.kotlin_version = '1.2.50' repositories { jcenter() From 284a12666fbb6d88b9190ecca287f16e8c3b7881 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 14 Jun 2018 09:43:34 +0200 Subject: [PATCH 17/64] reset SkipDeleteConfirmation 5 mins after backgrounding --- .../com/simplemobiletools/gallery/activities/MainActivity.kt | 3 ++- .../com/simplemobiletools/gallery/activities/MediaActivity.kt | 3 ++- .../kotlin/com/simplemobiletools/gallery/helpers/Constants.kt | 2 +- 3 files changed, 5 insertions(+), 3 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 09098adaf..f26660cab 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -176,9 +176,10 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { override fun onStop() { super.onStop() - if (config.temporarilyShowHidden) { + if (config.temporarilyShowHidden || config.tempSkipDeleteConfirmation) { mTempShowHiddenHandler.postDelayed({ config.temporarilyShowHidden = false + config.tempSkipDeleteConfirmation = false }, SHOW_TEMP_HIDDEN_DURATION) } else { mTempShowHiddenHandler.removeCallbacksAndMessages(null) 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 fa5ebcb5f..29c5d956b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt @@ -162,9 +162,10 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { super.onStop() mSearchMenuItem?.collapseActionView() - if (config.temporarilyShowHidden) { + if (config.temporarilyShowHidden || config.tempSkipDeleteConfirmation) { mTempShowHiddenHandler.postDelayed({ config.temporarilyShowHidden = false + config.tempSkipDeleteConfirmation = false }, SHOW_TEMP_HIDDEN_DURATION) } else { mTempShowHiddenHandler.removeCallbacksAndMessages(null) 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 9d73f8dfe..e3b86de96 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt @@ -64,7 +64,7 @@ const val SLIDESHOW_SCROLL_DURATION = 500L const val NOMEDIA = ".nomedia" const val MAX_COLUMN_COUNT = 20 -const val SHOW_TEMP_HIDDEN_DURATION = 600000L +const val SHOW_TEMP_HIDDEN_DURATION = 300000L const val CLICK_MAX_DURATION = 150 const val DRAG_THRESHOLD = 8 From b80e02d14f4a260c3f38b80e6f950df6c42e380b Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 14 Jun 2018 10:23:10 +0200 Subject: [PATCH 18/64] fix #807, show a warning when deleting a folder --- app/build.gradle | 2 +- .../simplemobiletools/gallery/adapters/DirectoryAdapter.kt | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c61e284c6..6e9775862 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.1.10' + implementation 'com.simplemobiletools:commons:4.1.11' 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 66c7e08fa..df7976a18 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -317,8 +317,11 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList Date: Thu, 14 Jun 2018 10:27:38 +0200 Subject: [PATCH 19/64] reset Temp hidden item showing and Delete confirmation skipping on app start --- .../com/simplemobiletools/gallery/activities/MainActivity.kt | 2 ++ 1 file changed, 2 insertions(+) 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 f26660cab..e118ccfcc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -74,6 +74,8 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { setContentView(R.layout.activity_main) appLaunched(BuildConfig.APPLICATION_ID) + config.temporarilyShowHidden = false + config.tempSkipDeleteConfirmation = false mIsPickImageIntent = isPickImageIntent(intent) mIsPickVideoIntent = isPickVideoIntent(intent) mIsGetImageContentIntent = isGetImageContentIntent(intent) From 039d6fdfd5c9234033801921fc2997a25ef77545 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 14 Jun 2018 10:41:38 +0200 Subject: [PATCH 20/64] fix #802, always use white text color at fullscreen extended details --- .../com/simplemobiletools/gallery/fragments/PhotoFragment.kt | 1 - .../com/simplemobiletools/gallery/fragments/VideoFragment.kt | 1 - app/src/main/res/layout/pager_photo_item.xml | 3 ++- app/src/main/res/layout/pager_video_item.xml | 3 ++- 4 files changed, 4 insertions(+), 4 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 09a0a976c..1c2a1e314 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -380,7 +380,6 @@ class PhotoFragment : ViewPagerFragment() { if (context!!.config.showExtendedDetails) { view.photo_details.apply { text = getMediumExtendedDetails(medium) - setTextColor(context.config.textColor) beVisibleIf(text.isNotEmpty()) alpha = if (!context!!.config.hideExtendedDetails || !isFullscreen) 1f else 0f onGlobalLayout { 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 4349441ec..19a9a8c4f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -463,7 +463,6 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee if (context!!.config.showExtendedDetails) { mView!!.video_details.apply { text = getMediumExtendedDetails(medium) - setTextColor(context.config.textColor) beVisibleIf(text.isNotEmpty()) alpha = if (!context!!.config.hideExtendedDetails || !mIsFullscreen) 1f else 0f onGlobalLayout { diff --git a/app/src/main/res/layout/pager_photo_item.xml b/app/src/main/res/layout/pager_photo_item.xml index b8bff9183..deb877e71 100644 --- a/app/src/main/res/layout/pager_photo_item.xml +++ b/app/src/main/res/layout/pager_photo_item.xml @@ -18,7 +18,7 @@ android:layout_height="match_parent" 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 1c19114cb..719a49096 100644 --- a/app/src/main/res/layout/pager_video_item.xml +++ b/app/src/main/res/layout/pager_video_item.xml @@ -63,7 +63,7 @@ android:textColor="@android:color/white" android:textSize="@dimen/extra_big_text_size"/> - From 347959b830ce7fdc295ddd48d179865855e9adb9 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 14 Jun 2018 11:25:37 +0200 Subject: [PATCH 21/64] fix some visual glitches around fullscreen Extended details --- .../gallery/fragments/PhotoFragment.kt | 16 ++++++++++------ .../gallery/fragments/VideoFragment.kt | 16 ++++++++++------ 2 files changed, 20 insertions(+), 12 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 1c2a1e314..fb1ce093c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -379,12 +379,16 @@ class PhotoFragment : ViewPagerFragment() { private fun checkExtendedDetails() { if (context!!.config.showExtendedDetails) { view.photo_details.apply { + beInvisible() // make it invisible so we can measure it, but not show yet text = getMediumExtendedDetails(medium) - beVisibleIf(text.isNotEmpty()) - alpha = if (!context!!.config.hideExtendedDetails || !isFullscreen) 1f else 0f onGlobalLayout { - if (height != 0 && isAdded) { - y = getExtendedDetailsY(height) + if (isAdded) { + val realY = getExtendedDetailsY(height) + if (realY > 0) { + y = realY + beVisibleIf(text.isNotEmpty()) + alpha = if (!context!!.config.hideExtendedDetails || !isFullscreen) 1f else 0f + } } } } @@ -414,7 +418,7 @@ class PhotoFragment : ViewPagerFragment() { override fun fullscreenToggled(isFullscreen: Boolean) { this.isFullscreen = isFullscreen view.photo_details.apply { - if (storedShowExtendedDetails) { + if (storedShowExtendedDetails && isVisible()) { animate().y(getExtendedDetailsY(height)) if (storedHideExtendedDetails) { @@ -427,6 +431,6 @@ class PhotoFragment : ViewPagerFragment() { private fun getExtendedDetailsY(height: Int): Float { val smallMargin = resources.getDimension(R.dimen.small_margin) val fullscreenOffset = context!!.navigationBarHeight.toFloat() - smallMargin - return context!!.usableScreenSize.y - height + if (isFullscreen) fullscreenOffset else -(if (context!!.navigationBarHeight == 0) smallMargin else 0f) + return context!!.usableScreenSize.y - height + if (isFullscreen) fullscreenOffset else -smallMargin } } 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 19a9a8c4f..9993663ae 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -462,12 +462,16 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee private fun checkExtendedDetails() { if (context!!.config.showExtendedDetails) { mView!!.video_details.apply { + beInvisible() // make it invisible so we can measure it, but not show yet text = getMediumExtendedDetails(medium) - beVisibleIf(text.isNotEmpty()) - alpha = if (!context!!.config.hideExtendedDetails || !mIsFullscreen) 1f else 0f onGlobalLayout { - if (height != 0 && isAdded) { - y = getExtendedDetailsY(height) + if (isAdded) { + val realY = getExtendedDetailsY(height) + if (realY > 0) { + y = realY + beVisibleIf(text.isNotEmpty()) + alpha = if (!context!!.config.hideExtendedDetails || !mIsFullscreen) 1f else 0f + } } } } @@ -521,7 +525,7 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee mIsFullscreen = isFullscreen checkFullscreen() mView!!.video_details.apply { - if (mStoredShowExtendedDetails) { + if (mStoredShowExtendedDetails && isVisible()) { animate().y(getExtendedDetailsY(height)) if (mStoredHideExtendedDetails) { @@ -535,6 +539,6 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee val smallMargin = resources.getDimension(R.dimen.small_margin) val timeHolderHeight = mTimeHolder!!.height - context!!.navigationBarHeight.toFloat() val fullscreenOffset = context!!.navigationBarHeight.toFloat() - smallMargin - return context!!.usableScreenSize.y - height + if (mIsFullscreen) fullscreenOffset else -(timeHolderHeight + if (context!!.navigationBarHeight == 0) smallMargin else 0f) + return context!!.usableScreenSize.y - height + if (mIsFullscreen) fullscreenOffset else -(timeHolderHeight + smallMargin) } } From 4a26bafaa86f89c98b5cf81fc87cac7117370c44 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 14 Jun 2018 23:02:36 +0200 Subject: [PATCH 22/64] update commons to 4.1.14 --- app/build.gradle | 2 +- .../com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6e9775862..a82dd9afe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.1.11' + implementation 'com.simplemobiletools:commons:4.1.14' 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 df7976a18..d20a65167 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -290,7 +290,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList Date: Fri, 15 Jun 2018 12:23:26 +0200 Subject: [PATCH 23/64] 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 2cac25fa8..00ebb0e65 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -160,7 +160,7 @@ He protegido la aplicación con una contraseña, pero la he olvidado. ¿Que puedo hacer? Puedes resolverlo de 2 maneras. Puede reinstalar la aplicación o encontrar la aplicación en la configuración de su dispositivo y seleccionar \"Borrar datos \". Restablecerá todas sus configuraciones, no eliminará ningún archivo multimedia. ¿Cómo puedo hacer que un álbum siempre aparezca en la parte superior? - Puede aguantar pressing el álbum deseado y seleccionar el ícono Pin en el menú de acción, que lo fijará en la parte superior. También puede anclar varias carpetas, los artículos fijados se ordenarán por el método de clasificación predeterminado. + Puede aguantar pulsado el álbum deseado y seleccionar el ícono Pin en el menú de acción, que lo fijará en la parte superior. También puede anclar varias carpetas, los artículos fijados se ordenarán por el método de clasificación predeterminado. ¿Cómo puedo avanzar videos? Puede hacer clic en los textos de duración actual o máxima cerca de la barra de búsqueda, que moverán el video hacia atrás o hacia adelante. ¿Cuál es la diferencia entre ocultar y excluir una carpeta? From 75151956d03c5ed5fbd8a58c0e5fffa43111113f Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 15 Jun 2018 14:03:02 +0200 Subject: [PATCH 24/64] fix #785, do not scroll the pattern tab while being used --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a82dd9afe..e2bddac53 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.1.14' + implementation 'com.simplemobiletools:commons:4.1.16' 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 5c608de61b9dc970858e7d9b0a8be0d58969be53 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 15 Jun 2018 15:05:42 +0200 Subject: [PATCH 25/64] fix #786, do not request the pattern/pin/fp again after rotating the device --- app/build.gradle | 2 +- .../gallery/activities/MainActivity.kt | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e2bddac53..4ff65d961 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.1.16' + implementation 'com.simplemobiletools:commons:4.1.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/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt index e118ccfcc..9bbb7c875 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -43,6 +43,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { private val PICK_WALLPAPER = 3 private val LAST_MEDIA_CHECK_PERIOD = 3000L private val NEW_APP_PACKAGE = "com.simplemobiletools.clock" + private val IS_PROTECTION_DIALOG_SHOWN = "is_protection_dialog_shown" private var mIsPickImageIntent = false private var mIsPickVideoIntent = false @@ -55,6 +56,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { private var mIsGettingDirs = false private var mLoadedInitialPhotos = false private var mIsPasswordProtectionPending = false + private var mWasProtectionHandled = false private var mLatestMediaId = 0L private var mLatestMediaDateId = 0L private var mLastMediaHandler = Handler() @@ -154,8 +156,9 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { directories_empty_text_label.setTextColor(config.textColor) directories_empty_text.setTextColor(getAdjustedPrimaryColor()) - if (mIsPasswordProtectionPending) { + if (mIsPasswordProtectionPending && !mWasProtectionHandled) { handleAppPasswordProtection { + mWasProtectionHandled = it if (it) { mIsPasswordProtectionPending = false tryLoadGallery() @@ -231,6 +234,16 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { return true } + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putBoolean(WAS_PROTECTION_HANDLED, mWasProtectionHandled) + } + + override fun onRestoreInstanceState(savedInstanceState: Bundle) { + super.onRestoreInstanceState(savedInstanceState) + mWasProtectionHandled = savedInstanceState.getBoolean(WAS_PROTECTION_HANDLED, false) + } + private fun getRecyclerAdapter() = directories_grid.adapter as? DirectoryAdapter private fun storeStateVariables() { From 132953c25a33d089687d8275dc17afc25df8ef88 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 15 Jun 2018 15:14:41 +0200 Subject: [PATCH 26/64] removing a redundant variable --- .../com/simplemobiletools/gallery/activities/MainActivity.kt | 1 - 1 file changed, 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 9bbb7c875..1fc066316 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -43,7 +43,6 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { private val PICK_WALLPAPER = 3 private val LAST_MEDIA_CHECK_PERIOD = 3000L private val NEW_APP_PACKAGE = "com.simplemobiletools.clock" - private val IS_PROTECTION_DIALOG_SHOWN = "is_protection_dialog_shown" private var mIsPickImageIntent = false private var mIsPickVideoIntent = false From f1b4391d939ea85f7ff89a422750edc347247654 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 16 Jun 2018 21:50:55 +0200 Subject: [PATCH 27/64] update Commons with the recyclerview adapter, fix some inconsistency glitches --- app/build.gradle | 2 +- .../gallery/adapters/DirectoryAdapter.kt | 26 ++++++++++++------- .../gallery/adapters/ManageFoldersAdapter.kt | 6 ++--- .../adapters/ManageHiddenFoldersAdapter.kt | 6 ++--- .../gallery/adapters/MediaAdapter.kt | 8 +++--- 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4ff65d961..fb4e5d952 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.1.17' + implementation 'com.simplemobiletools:commons:4.2.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 d20a65167..b85316f05 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -47,12 +47,12 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList() - (0 until itemViews.size()) - .filter { itemViews[it] != null } - .forEachIndexed { curIndex, i -> newItems.put(curIndex, itemViews[i]) } + val newViewHolders = SparseArray() + val cnt = viewHolders.size() + for (i in 0..cnt) { + if (affectedPositions.contains(i)) { + continue + } + val view = viewHolders.get(i, null) + val newIndex = i - selectedPositions.count { it <= i } + newViewHolders.put(newIndex, view) + } + viewHolders = newViewHolders currentDirectoriesHash = newDirs.hashCode() - itemViews = newItems dirs = newDirs + finishActMode() fastScroller?.measureRecyclerView() listener?.updateDirectories(newDirs) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt index e27d56887..c65112f01 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt @@ -25,10 +25,10 @@ class ManageFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList< override fun prepareActionMode(menu: Menu) {} - override fun prepareItemSelection(view: View) {} + override fun prepareItemSelection(viewHolder: ViewHolder) {} - override fun markItemSelection(select: Boolean, view: View?) { - view?.manage_folder_holder?.isSelected = select + override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) { + viewHolder?.itemView?.manage_folder_holder?.isSelected = select } override fun actionItemPressed(id: Int) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageHiddenFoldersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageHiddenFoldersAdapter.kt index 931348420..31c35bb38 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageHiddenFoldersAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageHiddenFoldersAdapter.kt @@ -27,10 +27,10 @@ class ManageHiddenFoldersAdapter(activity: BaseSimpleActivity, var folders: Arra override fun prepareActionMode(menu: Menu) {} - override fun prepareItemSelection(view: View) {} + override fun prepareItemSelection(viewHolder: ViewHolder) {} - override fun markItemSelection(select: Boolean, view: View?) { - view?.manage_folder_holder?.isSelected = select + override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) { + viewHolder?.itemView?.manage_folder_holder?.isSelected = select } override fun actionItemPressed(id: Int) { 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 d1ed183ec..2e2199529 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt @@ -49,12 +49,12 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, override fun getActionMenuId() = R.menu.cab_media - override fun prepareItemSelection(view: View) { - view.medium_check?.background?.applyColorFilter(primaryColor) + override fun prepareItemSelection(viewHolder: ViewHolder) { + viewHolder.itemView?.medium_check?.background?.applyColorFilter(primaryColor) } - override fun markItemSelection(select: Boolean, view: View?) { - view?.medium_check?.beVisibleIf(select) + override fun markViewHolderSelection(select: Boolean, viewHolder: ViewHolder?) { + viewHolder?.itemView?.medium_check?.beVisibleIf(select) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { From ec7a5482b590171503ff1921a8d3af5c25952706 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 16 Jun 2018 22:09:48 +0200 Subject: [PATCH 28/64] adding 2 new strings --- app/src/main/res/values-ar/strings.xml | 2 ++ app/src/main/res/values-ca/strings.xml | 2 ++ app/src/main/res/values-cs/strings.xml | 2 ++ app/src/main/res/values-da/strings.xml | 2 ++ app/src/main/res/values-de/strings.xml | 2 ++ app/src/main/res/values-el/strings.xml | 2 ++ app/src/main/res/values-es/strings.xml | 2 ++ app/src/main/res/values-fi/strings.xml | 2 ++ app/src/main/res/values-fr/strings.xml | 2 ++ app/src/main/res/values-gl/strings.xml | 2 ++ app/src/main/res/values-hr/strings.xml | 2 ++ app/src/main/res/values-hu/strings.xml | 2 ++ app/src/main/res/values-it/strings.xml | 2 ++ app/src/main/res/values-ja/strings.xml | 2 ++ app/src/main/res/values-ko-rKR/strings.xml | 2 ++ app/src/main/res/values-lt/strings.xml | 2 ++ app/src/main/res/values-nb/strings.xml | 2 ++ app/src/main/res/values-nl/strings.xml | 2 ++ app/src/main/res/values-pl/strings.xml | 2 ++ app/src/main/res/values-pt-rBR/strings.xml | 2 ++ app/src/main/res/values-pt/strings.xml | 2 ++ app/src/main/res/values-ru/strings.xml | 2 ++ app/src/main/res/values-sk/strings.xml | 2 ++ app/src/main/res/values-sv/strings.xml | 2 ++ app/src/main/res/values-tr/strings.xml | 2 ++ app/src/main/res/values-zh-rCN/strings.xml | 2 ++ app/src/main/res/values-zh-rTW/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 28 files changed, 56 insertions(+) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index fd58452e7..007b4bff8 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -30,6 +30,7 @@ الصور الفديوهات الصور المتحركة + RAW images لم يتم العثور على ملفات وسائط مع الفلاتر المحددة تغيير الفلاتر @@ -151,6 +152,7 @@ استبدل الصور التي يمكن تكبيرها بعمق باستخدام صور ذات جودة أفضل إخفاء التفاصيل الموسعة عند إخفاء شريط الحالة قم بإجراء فحص إضافي لتجنب إظهار الملفات التالفة + Show some action buttons at the bottom of the screen المصغرات diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index c69b94e16..e89acd681 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -30,6 +30,7 @@ Imatges Vídeos GIFs + RAW images No s\'han tronat arxius amb els filtres seleccionats. Canviar filtres @@ -147,6 +148,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 Miniatures diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 6b121b7ff..d75d1e2ce 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -30,6 +30,7 @@ Images Videos GIFs + RAW images No media files have been found with the selected filters. Change filters @@ -147,6 +148,7 @@ Replace deep zoomable images with better quality ones 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 Thumbnails diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 1d83821bb..df8088856 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -30,6 +30,7 @@ Billeder Videoer GIF\'er + RAW images Der blev ikke fundet nogen filer med det valgte filter. Skift filter @@ -147,6 +148,7 @@ Erstat stærkt zoombare billeder med nogle i bedre kvalitet 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 Thumbnails diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f1949f68a..c3bee513c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -30,6 +30,7 @@ Bilder Videos GIFs + RAW images Keine Medien für die ausgewählten Filter gefunden Filter ändern @@ -147,6 +148,7 @@ Stark zoombare Bilder durch Bilder mit hoher Qualität ersetzen 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 Thumbnails diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index f3349bef4..dc4f69114 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -30,6 +30,7 @@ Εικόνες Βίντεο GIFs + RAW images Δεν βρέθηκε κανένα αρχείο πολυμέσων με τα επιλεγμένα φίλτρα. Αλλαγή φίλτρων @@ -148,6 +149,7 @@ Αντικατάσταση των φωτογραφιών που απαιτούν ζούμ με άλλες καλύτερης ποιότητας Απόκρυψη λεπτομερειών όταν η μπάρα κατάστασης είναι κρυμμένη Επιπλέον έλεγχος για την αποφυγή εμφάνισης λανθασμένων αρχείων + Show some action buttons at the bottom of the screen Εικονίδια diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 00ebb0e65..db762f7b7 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -30,6 +30,7 @@ Imágenes Vídeos GIFs + RAW images No se han encontrado ficheros con los filtros seleccionados. Cambiar filtros @@ -147,6 +148,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 Miniaturas diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 0fbd55c3c..cec932677 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -30,6 +30,7 @@ Kuvat Videot GIFit + RAW images Mediaa ei löytynyt valituilla suotimilla. Muuta suotimia @@ -147,6 +148,7 @@ Korvaa syvälle lähennettävät kuvat parempilaatuisella 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 Esikatselukuvat diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6a7c63a9e..704f7ed5c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -30,6 +30,7 @@ Images Vidéos GIF + RAW images Aucun fichier média trouvé avec les filtres sélectionnés. Changer les filtres @@ -147,6 +148,7 @@ Remplacer les images zoomables profondes par des images de meilleure qualité 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 Vignettes diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 6a82b46ab..3e93aac93 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -30,6 +30,7 @@ Imaxes Vídeos GIFs + RAW images Non se atoparon medios dos indicados polo filtro. Cambiar filtro @@ -147,6 +148,7 @@ Substituír imaxes con un gran zoom por por outras con mellor calidade 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 Iconas diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 8f9fba4bf..403bc5513 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -30,6 +30,7 @@ Slike Video GIF-ovi + RAW images Nije pronađena nijedna datoteka s odabranim filtrom. Promijeni filter @@ -147,6 +148,7 @@ Zamijenite slike s dubokim zumom za one s boljom kvalitetom 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 Sličice diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index dfccccaec..3711293f5 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -30,6 +30,7 @@ Images Videos GIFs + RAW images No media files have been found with the selected filters. Change filters @@ -147,6 +148,7 @@ Replace deep zoomable images with better quality ones 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 Thumbnails diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3c97e5a73..53c9dc299 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -30,6 +30,7 @@ Immagini Video GIF + RAW images Nessun file trovato per il filtro selezionato. Cambia filtro @@ -147,6 +148,7 @@ Sostituisci le immagini ingrandibili a fondo con altre di migliore qualità Nascondi i dettagli estesi quando la barra di stato è nascosta Fai un controllo ulteriore per evitare di mostrare file non validi + Show some action buttons at the bottom of the screen Miniature diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 8ed3387ef..c5ca12576 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -30,6 +30,7 @@ 画像 ビデオ GIF + RAW images 絞り込み条件に該当するメディアがありません。 絞り込み条件を変更 @@ -147,6 +148,7 @@ ズーム可能な画像をより高画質なものに置き換える ステータスバーが非表示の時は詳細を表示しない 無効なファイルを表示しないための調査を行います + Show some action buttons at the bottom of the screen サムネイル diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 214230c6a..bb6804892 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -30,6 +30,7 @@ 이미지 비디오 GIFs + RAW images 설정된 필터와 일치하는 컨텐츠가 존재하지 않습니다. 필터 변경 @@ -147,6 +148,7 @@ 확대 축소 가능한 이미지를 더 좋은 품질로 교체 상태 표시 줄이 숨겨져있을 때 확장 된 세부 정보 숨김 잘못된 파일 표시를 방지하기 위해 추가 검사 수행 + Show some action buttons at the bottom of the screen 섬네일 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 31bad5186..96011e86e 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -30,6 +30,7 @@ Atvaizdai Vaizdo įrašai GIF\'ai + RAW images Su pasirinktais filtrais nerasta medijos bylų. Pakeisti filtrus @@ -147,6 +148,7 @@ Pakeisti giliai priartinamus atvaizdus su geresnės kokybės atvaizdais 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 Miniatiūros diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 9a71c89dc..5ea56bfbd 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -30,6 +30,7 @@ Bilder Videoer GIF-bilder + RAW images Ingen media-filer er funnet med de valgte filtrene. Endre filtere @@ -147,6 +148,7 @@ Erstatt dyp-zoombare bilder med bilder av bedre kvalitet 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 Minibilder diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 5baae93d3..6f9f7c835 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -30,6 +30,7 @@ Afbeeldingen Video\'s GIF-bestanden + RAW images Er zijn geen bestanden gevonden met de huidige filters. Filters aanpassen @@ -147,6 +148,7 @@ In hoge kwaliteit weergeven (ten koste van ver inzoomen) Uitgebreide informatie niet tonen als de statusbalk is verborgen Ongeldige bestanden verbergen + Show some action buttons at the bottom of the screen Miniatuurvoorbeelden diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index b16808cb8..fae155e92 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -30,6 +30,7 @@ Obrazy Filmy GIFy + RAW images Nie znalazłem multimediów z wybranymi filtrami. Zmień filtry @@ -147,6 +148,7 @@    Zamieniaj powiększalne obrazy na te o lepszej jakości    Ukrywaj dodatkowe szczegóły gdy pasek stanu jest ukryty    Dodatkowe sprawdzenie w celu uniknięcia pokazywania niewłaściwych plików + Show some action buttons at the bottom of the 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 418287be2..52c6f82c4 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -30,6 +30,7 @@ Imagens Vídeos GIFs + RAW images Nenhum arquivo de mídia encontrado a partir dos filtros selecionados. Mudar filtros @@ -147,6 +148,7 @@ Substituir imagens aptas a grande quantitade de zoom por imagens de melhor qualidade 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 Miniaturas diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index e89ed8d41..67cf01651 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -30,6 +30,7 @@ Imagens Vídeos GIF + RAW images Não foram encontrados ficheiros que cumpram os requisitos. Alterar filtros @@ -147,6 +148,7 @@ Replace deep zoomable images with better quality ones 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 Miniaturas diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 036af35c8..58c8f5e51 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -30,6 +30,7 @@ Изображения Видео GIF + RAW images При заданных фильтрах медиафайлы не найдены Изменить фильтры @@ -147,6 +148,7 @@ Заменять масштабируемые изображения высококачественными Не показывать подробности при скрытой строке состояния Делать дополнительную проверку, чтобы избежать показа неподдерживаемых файлов + Show some action buttons at the bottom of the screen Миниатюры diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index e20e1788e..9d8fb036f 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -30,6 +30,7 @@ Obrázky Videá GIFká + RAW obrázky So zvolenými filtrami sa nenašli žiadne média súbory. Zmeniť filtre @@ -147,6 +148,7 @@ Nahradiť hlboko priblížiteľné obrázky s obrázkami s lepšou kvalitou 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 Náhľady diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 75cc0e3aa..989736b9d 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -30,6 +30,7 @@ Bilder Videor GIF-bilder + RAW images Inga mediefiler hittades med valda filter. Ändra filter @@ -147,6 +148,7 @@ Ersätt djupt zoombara bilder med bilder av bättre kvalitet 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 Miniatyrer diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 62b88f9c5..63c4966fc 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -30,6 +30,7 @@ Images Videos GIFs + RAW images No media files have been found with the selected filters. Change filters @@ -147,6 +148,7 @@ Replace deep zoomable images with better quality ones 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 Thumbnails diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 7ad76f03c..655f35f8e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -30,6 +30,7 @@ 图片 视频 GIFs + RAW images 所选的过滤器没有找到媒体文件。 更改过滤器 @@ -147,6 +148,7 @@ 用质量更好的图像替换可深度缩放的图像 当状态栏隐藏时隐藏扩展详情 额外检查以避免显示无效的文件 + Show some action buttons at the bottom of the screen 缩略图 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 7fb0b00f2..e9ddc409a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -30,6 +30,7 @@ 圖片 影片 GIF + RAW images 選擇的篩選條件未發現媒體檔案。 更改篩選條件 @@ -147,6 +148,7 @@ 可深度縮放的圖片用品質更佳的來取代 狀態欄隱藏時,同時隱藏詳細資訊 進行額外檢查,避免顯示無效的檔案 + Show some action buttons at the bottom of the screen 縮圖 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b2fd79fae..199e012db 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,6 +30,7 @@ Images Videos GIFs + RAW images No media files have been found with the selected filters. Change filters @@ -147,6 +148,7 @@ Replace deep zoomable images with better quality ones 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 Thumbnails From df9461a81bfdf3c8a8e50559b69e35bdc81b858b Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 16 Jun 2018 23:31:53 +0200 Subject: [PATCH 29/64] update commons to 4.2.2 --- app/build.gradle | 2 +- .../com/simplemobiletools/gallery/fragments/PhotoFragment.kt | 2 +- .../kotlin/com/simplemobiletools/gallery/models/Medium.kt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index fb4e5d952..86268b68f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.2.1' + implementation 'com.simplemobiletools:commons:4.2.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' 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 fb1ce093c..bde33edd5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -287,7 +287,7 @@ class PhotoFragment : ViewPagerFragment() { } private fun addZoomableView() { - if (!context!!.config.replaceZoomableImages && medium.isImage() && isFragmentVisible && view.subsampling_view.isGone() && !medium.isDng()) { + if (!context!!.config.replaceZoomableImages && medium.isImage() && isFragmentVisible && view.subsampling_view.isGone() && !medium.isRaw()) { ViewPagerActivity.wasDecodedByGlide = false view.subsampling_view.apply { maxScale = 10f diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt index 9203db306..d4f2b953e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt @@ -6,7 +6,7 @@ import android.arch.persistence.room.Index import android.arch.persistence.room.PrimaryKey import com.simplemobiletools.commons.extensions.formatDate import com.simplemobiletools.commons.extensions.formatSize -import com.simplemobiletools.commons.extensions.isDng +import com.simplemobiletools.commons.extensions.isRaw import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED import com.simplemobiletools.commons.helpers.SORT_BY_NAME import com.simplemobiletools.commons.helpers.SORT_BY_PATH @@ -37,7 +37,7 @@ data class Medium( fun isVideo() = type == TYPE_VIDEOS - fun isDng() = path.isDng() + fun isRaw() = path.isRaw() fun getBubbleText(sorting: Int) = when { sorting and SORT_BY_NAME != 0 -> name From d2bac07abb39b208c8375e87b4333001c05b2465 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 16 Jun 2018 23:33:14 +0200 Subject: [PATCH 30/64] remove a redundant check --- .../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 bde33edd5..84baf6b4c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -287,7 +287,7 @@ class PhotoFragment : ViewPagerFragment() { } private fun addZoomableView() { - if (!context!!.config.replaceZoomableImages && medium.isImage() && isFragmentVisible && view.subsampling_view.isGone() && !medium.isRaw()) { + if (!context!!.config.replaceZoomableImages && medium.isImage() && isFragmentVisible && view.subsampling_view.isGone()) { ViewPagerActivity.wasDecodedByGlide = false view.subsampling_view.apply { maxScale = 10f From 5062d3f087e8bbe23613934e675c9eadb036b6de Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 16 Jun 2018 23:48:12 +0200 Subject: [PATCH 31/64] fix #656, separate Images and Raws at filtering --- .../gallery/activities/PhotoVideoActivity.kt | 3 +- .../gallery/adapters/DirectoryAdapter.kt | 3 +- .../gallery/dialogs/FilterMediaDialog.kt | 6 +++- .../gallery/extensions/ArrayList.kt | 5 ++++ .../gallery/extensions/Context.kt | 8 +++-- .../gallery/helpers/Config.kt | 2 +- .../gallery/helpers/Constants.kt | 1 + .../gallery/helpers/MediaFetcher.kt | 30 ++++++++++++++++--- .../gallery/models/Medium.kt | 4 +-- .../gallery/receivers/RefreshMediaReceiver.kt | 9 +++--- .../main/res/layout/dialog_filter_media.xml | 8 +++++ 11 files changed, 61 insertions(+), 18 deletions(-) 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 d230fa2f6..6871069c2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt @@ -87,7 +87,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList val type = when { file.isImageFast() -> TYPE_IMAGES file.isVideoFast() -> TYPE_VIDEOS - else -> TYPE_GIFS + file.isGif() -> TYPE_GIFS + else -> TYPE_RAWS } mMedium = Medium(null, getFilenameFromUri(mUri!!), mUri.toString(), mUri!!.path.getParentPath(), 0, 0, file.length(), type) 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 b85316f05..b44e0f7f4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -444,7 +444,8 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: ArrayList TYPE_IMAGES directory.tmb.isVideoFast() -> TYPE_VIDEOS - else -> TYPE_GIFS + directory.tmb.isGif() -> TYPE_GIFS + else -> TYPE_RAWS } activity.loadImage(thumbnailType, directory.tmb, dir_thumbnail, scrollHorizontally, animateGifs, cropThumbnails) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/FilterMediaDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/FilterMediaDialog.kt index ec3cd7faa..4c1925b04 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/FilterMediaDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/FilterMediaDialog.kt @@ -7,6 +7,7 @@ import com.simplemobiletools.gallery.R import com.simplemobiletools.gallery.extensions.config import com.simplemobiletools.gallery.helpers.TYPE_GIFS import com.simplemobiletools.gallery.helpers.TYPE_IMAGES +import com.simplemobiletools.gallery.helpers.TYPE_RAWS import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS import kotlinx.android.synthetic.main.dialog_filter_media.view.* @@ -19,10 +20,11 @@ class FilterMediaDialog(val activity: BaseSimpleActivity, val callback: (result: filter_media_images.isChecked = filterMedia and TYPE_IMAGES != 0 filter_media_videos.isChecked = filterMedia and TYPE_VIDEOS != 0 filter_media_gifs.isChecked = filterMedia and TYPE_GIFS != 0 + filter_media_raws.isChecked = filterMedia and TYPE_RAWS != 0 } AlertDialog.Builder(activity) - .setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() }) + .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } .setNegativeButton(R.string.cancel, null) .create().apply { activity.setupDialogStuff(view, this, R.string.filter_media) @@ -37,6 +39,8 @@ class FilterMediaDialog(val activity: BaseSimpleActivity, val callback: (result: result += TYPE_VIDEOS if (view.filter_media_gifs.isChecked) result += TYPE_GIFS + if (view.filter_media_raws.isChecked) + result += TYPE_RAWS activity.config.filterMedia = result callback(result) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/ArrayList.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/ArrayList.kt index afd1c36e5..5d221bffa 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/ArrayList.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/ArrayList.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.gallery.extensions import com.simplemobiletools.gallery.helpers.TYPE_GIFS import com.simplemobiletools.gallery.helpers.TYPE_IMAGES +import com.simplemobiletools.gallery.helpers.TYPE_RAWS import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS import com.simplemobiletools.gallery.models.Medium @@ -19,5 +20,9 @@ fun ArrayList.getDirMediaTypes(): Int { types += TYPE_GIFS } + if (any { it.isRaw() }) { + types += TYPE_RAWS + } + return types } 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 9ed2214b5..cdcee9016 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt @@ -203,7 +203,7 @@ fun Context.checkAppendingHidden(path: String, hidden: String, includedFolders: fun Context.loadImage(type: Int, path: String, target: MySquareImageView, horizontalScroll: Boolean, animateGifs: Boolean, cropThumbnails: Boolean) { target.isHorizontalScrolling = horizontalScroll - if (type == TYPE_IMAGES || type == TYPE_VIDEOS) { + if (type == TYPE_IMAGES || type == TYPE_VIDEOS || type == TYPE_RAWS) { if (type == TYPE_IMAGES && path.isPng()) { loadPng(path, target, cropThumbnails) } else { @@ -289,7 +289,8 @@ fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: else -> filteredDirectories.filter { (filterMedia and TYPE_IMAGES != 0 && it.types and TYPE_IMAGES != 0) || (filterMedia and TYPE_VIDEOS != 0 && it.types and TYPE_VIDEOS != 0) || - (filterMedia and TYPE_GIFS != 0 && it.types and TYPE_GIFS != 0) + (filterMedia and TYPE_GIFS != 0 && it.types and TYPE_GIFS != 0) || + (filterMedia and TYPE_RAWS != 0 && it.types and TYPE_RAWS != 0) } }) as ArrayList @@ -331,7 +332,8 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag else -> media.filter { (filterMedia and TYPE_IMAGES != 0 && it.type == TYPE_IMAGES) || (filterMedia and TYPE_VIDEOS != 0 && it.type == TYPE_VIDEOS) || - (filterMedia and TYPE_GIFS != 0 && it.type == TYPE_GIFS) + (filterMedia and TYPE_GIFS != 0 && it.type == TYPE_GIFS) || + (filterMedia and TYPE_RAWS != 0 && it.type == TYPE_RAWS) } }) as ArrayList 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 f52fc5215..1b04f99c3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt @@ -151,7 +151,7 @@ class Config(context: Context) : BaseConfig(context) { set(darkBackground) = prefs.edit().putBoolean(DARK_BACKGROUND, darkBackground).apply() var filterMedia: Int - get() = prefs.getInt(FILTER_MEDIA, TYPE_IMAGES or TYPE_VIDEOS or TYPE_GIFS) + get() = prefs.getInt(FILTER_MEDIA, TYPE_IMAGES or TYPE_VIDEOS or TYPE_GIFS or TYPE_RAWS) set(filterMedia) = prefs.edit().putInt(FILTER_MEDIA, filterMedia).apply() var dirColumnCnt: Int 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 e3b86de96..ceab93a20 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt @@ -104,6 +104,7 @@ const val EXT_ALBUM = 1024 const val TYPE_IMAGES = 1 const val TYPE_VIDEOS = 2 const val TYPE_GIFS = 4 +const val TYPE_RAWS = 8 const val LOCAITON_INTERNAL = 1 const val LOCATION_SD = 2 diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt index 13e3b826a..f5d989c50 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt @@ -70,6 +70,12 @@ class MediaFetcher(val context: Context) { query.append("${MediaStore.Images.Media.DATA} LIKE ?") } + if (filterMedia and TYPE_RAWS != 0) { + rawExtensions.forEach { + query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ") + } + } + var selectionQuery = query.toString().trim().removeSuffix("OR") selectionQuery += ") AND " return selectionQuery @@ -93,6 +99,12 @@ class MediaFetcher(val context: Context) { args.add("%.gif") } + if (filterMedia and TYPE_RAWS != 0) { + rawExtensions.forEach { + args.add("%$it") + } + } + return args } @@ -160,8 +172,9 @@ class MediaFetcher(val context: Context) { val isImage = filename.isImageFast() val isVideo = if (isImage) false else filename.isVideoFast() val isGif = if (isImage || isVideo) false else filename.isGif() + val isRaw = if (isImage || isVideo || isGif) false else filename.isRaw() - if (!isImage && !isVideo && !isGif) + if (!isImage && !isVideo && !isGif && !isRaw) continue if (isVideo && (isPickImage || filterMedia and TYPE_VIDEOS == 0)) @@ -173,6 +186,9 @@ class MediaFetcher(val context: Context) { if (isGif && filterMedia and TYPE_GIFS == 0) continue + if (isRaw && filterMedia and TYPE_RAWS == 0) + continue + if (!showHidden && filename.startsWith('.')) continue @@ -190,7 +206,8 @@ class MediaFetcher(val context: Context) { val type = when { isImage -> TYPE_IMAGES isVideo -> TYPE_VIDEOS - else -> TYPE_GIFS + isGif -> TYPE_GIFS + else -> TYPE_RAWS } val medium = Medium(null, filename, file.absolutePath, folder, lastModified, dateTaken, size, type) @@ -214,8 +231,9 @@ class MediaFetcher(val context: Context) { val isImage = filename.isImageFast() val isVideo = if (isImage) false else filename.isVideoFast() val isGif = if (isImage || isVideo) false else filename.isGif() + val isRaw = if (isImage || isVideo || isGif) false else filename.isRaw() - if (!isImage && !isVideo && !isGif) + if (!isImage && !isVideo && !isGif || !isRaw) continue if (isVideo && (isPickImage || filterMedia and TYPE_VIDEOS == 0)) @@ -227,6 +245,9 @@ class MediaFetcher(val context: Context) { if (isGif && filterMedia and TYPE_GIFS == 0) continue + if (isRaw && filterMedia and TYPE_RAWS == 0) + continue + if (!showHidden && filename.startsWith('.')) continue @@ -240,7 +261,8 @@ class MediaFetcher(val context: Context) { val type = when { isImage -> TYPE_IMAGES isVideo -> TYPE_VIDEOS - else -> TYPE_GIFS + isGif -> TYPE_GIFS + else -> TYPE_RAWS } val path = Uri.decode(file.uri.toString().replaceFirst("${context.config.OTGTreeUri}/document/${context.config.OTGPartition}%3A", OTG_PATH)) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt index d4f2b953e..9fe49658b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt @@ -6,13 +6,13 @@ import android.arch.persistence.room.Index import android.arch.persistence.room.PrimaryKey import com.simplemobiletools.commons.extensions.formatDate import com.simplemobiletools.commons.extensions.formatSize -import com.simplemobiletools.commons.extensions.isRaw import com.simplemobiletools.commons.helpers.SORT_BY_DATE_MODIFIED import com.simplemobiletools.commons.helpers.SORT_BY_NAME import com.simplemobiletools.commons.helpers.SORT_BY_PATH import com.simplemobiletools.commons.helpers.SORT_BY_SIZE import com.simplemobiletools.gallery.helpers.TYPE_GIFS import com.simplemobiletools.gallery.helpers.TYPE_IMAGES +import com.simplemobiletools.gallery.helpers.TYPE_RAWS import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS import java.io.Serializable @@ -37,7 +37,7 @@ data class Medium( fun isVideo() = type == TYPE_VIDEOS - fun isRaw() = path.isRaw() + fun isRaw() = type == TYPE_RAWS fun getBubbleText(sorting: Int) = when { sorting and SORT_BY_NAME != 0 -> name diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/receivers/RefreshMediaReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/receivers/RefreshMediaReceiver.kt index 8b3f9921e..f90441e46 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/receivers/RefreshMediaReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/receivers/RefreshMediaReceiver.kt @@ -3,14 +3,12 @@ package com.simplemobiletools.gallery.receivers import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import com.simplemobiletools.commons.extensions.getFilenameFromPath -import com.simplemobiletools.commons.extensions.getParentPath -import com.simplemobiletools.commons.extensions.isImageFast -import com.simplemobiletools.commons.extensions.isVideoFast +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.REFRESH_PATH import com.simplemobiletools.gallery.extensions.galleryDB import com.simplemobiletools.gallery.helpers.TYPE_GIFS import com.simplemobiletools.gallery.helpers.TYPE_IMAGES +import com.simplemobiletools.gallery.helpers.TYPE_RAWS import com.simplemobiletools.gallery.helpers.TYPE_VIDEOS import com.simplemobiletools.gallery.models.Medium import java.io.File @@ -29,6 +27,7 @@ class RefreshMediaReceiver : BroadcastReceiver() { private fun getFileType(path: String) = when { path.isImageFast() -> TYPE_IMAGES path.isVideoFast() -> TYPE_VIDEOS - else -> TYPE_GIFS + path.isGif() -> TYPE_GIFS + else -> TYPE_RAWS } } diff --git a/app/src/main/res/layout/dialog_filter_media.xml b/app/src/main/res/layout/dialog_filter_media.xml index 37f2aba11..1554adec9 100644 --- a/app/src/main/res/layout/dialog_filter_media.xml +++ b/app/src/main/res/layout/dialog_filter_media.xml @@ -33,4 +33,12 @@ android:paddingTop="@dimen/activity_margin" android:text="@string/gifs"/> + + From 5de6eb9765ea087e1ce2ccf48ec4830c2816a646 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 09:04:33 +0200 Subject: [PATCH 32/64] add a toggle for showing some fullscreen image actions at the bottom --- .../gallery/activities/SettingsActivity.kt | 9 ++++++++ .../gallery/helpers/Config.kt | 4 ++++ .../gallery/helpers/Constants.kt | 1 + app/src/main/res/layout/activity_settings.xml | 23 +++++++++++++++++++ 4 files changed, 37 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 e50c30caf..d010bbc5e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt @@ -57,6 +57,7 @@ class SettingsActivity : SimpleActivity() { setupDeleteEmptyFolders() setupAllowPhotoGestures() setupAllowVideoGestures() + setupBottomActions() setupShowMediaCount() setupKeepLastModified() setupShowInfoBubble() @@ -295,6 +296,14 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupBottomActions() { + settings_bottom_actions.isChecked = config.bottomActions + settings_bottom_actions_holder.setOnClickListener { + settings_bottom_actions.toggle() + config.bottomActions = settings_bottom_actions.isChecked + } + } + private fun setupShowMediaCount() { settings_show_media_count.isChecked = config.showMediaCount settings_show_media_count_holder.setOnClickListener { 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 1b04f99c3..97e9e534e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt @@ -243,6 +243,10 @@ class Config(context: Context) : BaseConfig(context) { get() = prefs.getBoolean(ALLOW_VIDEO_GESTURES, true) set(allowVideoGestures) = prefs.edit().putBoolean(ALLOW_VIDEO_GESTURES, allowVideoGestures).apply() + var bottomActions: Boolean + get() = prefs.getBoolean(BOTTOM_ACTIONS, true) + set(bottomActions) = prefs.edit().putBoolean(BOTTOM_ACTIONS, bottomActions).apply() + var showMediaCount: Boolean get() = prefs.getBoolean(SHOW_MEDIA_COUNT, true) set(showMediaCount) = prefs.edit().putBoolean(SHOW_MEDIA_COUNT, showMediaCount).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 ceab93a20..902a005c9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt @@ -49,6 +49,7 @@ const val WAS_NEW_APP_SHOWN = "was_new_app_shown_clock" const val LAST_FILEPICKER_PATH = "last_filepicker_path" const val WAS_OTG_HANDLED = "was_otg_handled" const val TEMP_SKIP_DELETE_CONFIRMATION = "temp_skip_delete_confirmation" +const val BOTTOM_ACTIONS = "bottom_actions" // 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 a41f8df5c..ef0dc36d2 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -672,6 +672,29 @@ + + + + + + Date: Sun, 17 Jun 2018 14:30:44 +0200 Subject: [PATCH 33/64] add some bottom shadow to fullscreen photos when Bottom Actions are enabled --- .../gallery/activities/ViewPagerActivity.kt | 10 ++++++- .../gallery/fragments/PhotoFragment.kt | 28 ++++++++++++++++--- .../drawable/gradient_background_lighter.xml | 7 +++++ app/src/main/res/layout/pager_photo_item.xml | 10 +++++++ app/src/main/res/values/dimens.xml | 1 + 5 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/gradient_background_lighter.xml 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 31a23202a..2a92a42c0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -80,7 +80,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_medium) - setTranslucentNavigation() mMediaFiles = MediaActivity.mMedia.clone() as ArrayList handlePermission(PERMISSION_WRITE_STORAGE) { @@ -95,6 +94,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View storeStateVariables() } + @TargetApi(Build.VERSION_CODES.LOLLIPOP) override fun onResume() { super.onResume() if (!hasPermission(PERMISSION_WRITE_STORAGE)) { @@ -102,6 +102,14 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View return } + if (config.bottomActions) { + if (isLollipopPlus()) { + window.navigationBarColor = Color.TRANSPARENT + } + } else { + setTranslucentNavigation() + } + if (mStoredReplaceZoomableImages != config.replaceZoomableImages) { mPrevHashcode = 0 refreshViewPager() 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 84baf6b4c..6dcf9a864 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -51,6 +51,7 @@ class PhotoFragment : ViewPagerFragment() { private var storedShowExtendedDetails = false private var storedHideExtendedDetails = false + private var storedBottomActions = false private var storedExtendedDetails = 0 lateinit var view: ViewGroup @@ -116,7 +117,8 @@ class PhotoFragment : ViewPagerFragment() { isFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN loadImage() - checkExtendedDetails() + initExtendedDetails() + initBottomActions() wasInit = true return view @@ -130,7 +132,11 @@ class PhotoFragment : ViewPagerFragment() { override fun onResume() { super.onResume() if (wasInit && (context!!.config.showExtendedDetails != storedShowExtendedDetails || context!!.config.extendedDetails != storedExtendedDetails)) { - checkExtendedDetails() + initExtendedDetails() + } + + if (wasInit && (context!!.config.bottomActions != storedBottomActions)) { + initBottomActions() } val allowPhotoGestures = context!!.config.allowPhotoGestures @@ -162,6 +168,7 @@ class PhotoFragment : ViewPagerFragment() { storedShowExtendedDetails = showExtendedDetails storedHideExtendedDetails = hideExtendedDetails storedExtendedDetails = extendedDetails + storedBottomActions = bottomActions } } @@ -376,7 +383,7 @@ class PhotoFragment : ViewPagerFragment() { loadBitmap(degrees) } - private fun checkExtendedDetails() { + private fun initExtendedDetails() { if (context!!.config.showExtendedDetails) { view.photo_details.apply { beInvisible() // make it invisible so we can measure it, but not show yet @@ -397,6 +404,14 @@ class PhotoFragment : ViewPagerFragment() { } } + private fun initBottomActions() { + if (context!!.config.bottomActions) { + view.bottom_actions.beVisible() + } else { + view.bottom_actions.beGone() + } + } + override fun onDestroyView() { super.onDestroyView() if (activity?.isActivityDestroyed() == false) { @@ -408,7 +423,8 @@ class PhotoFragment : ViewPagerFragment() { override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) loadImage() - checkExtendedDetails() + initExtendedDetails() + initBottomActions() } private fun photoClicked() { @@ -426,6 +442,10 @@ class PhotoFragment : ViewPagerFragment() { } } } + + if (storedBottomActions) { + view.bottom_actions.animate().alpha(if (isFullscreen) 0f else 1f).start() + } } private fun getExtendedDetailsY(height: Int): Float { diff --git a/app/src/main/res/drawable/gradient_background_lighter.xml b/app/src/main/res/drawable/gradient_background_lighter.xml new file mode 100644 index 000000000..ba3477dc5 --- /dev/null +++ b/app/src/main/res/drawable/gradient_background_lighter.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 deb877e71..85765aa38 100644 --- a/app/src/main/res/layout/pager_photo_item.xml +++ b/app/src/main/res/layout/pager_photo_item.xml @@ -68,4 +68,14 @@ android:layout_alignParentEnd="true" android:layout_alignParentRight="true"/> + + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0a0cdcd24..3771a2dbc 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -10,4 +10,5 @@ 60dp 30dp 72dp + 110dp From a231a3af69ab1d0189769388034038759ebd0f48 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 15:20:41 +0200 Subject: [PATCH 34/64] move bottom actions from fragments to the activity --- app/build.gradle | 1 + .../gallery/activities/ViewPagerActivity.kt | 42 +++++++++++++++ .../gallery/fragments/PhotoFragment.kt | 20 ------- app/src/main/res/layout/activity_medium.xml | 54 +++++++++++++++++++ app/src/main/res/layout/pager_photo_item.xml | 10 ---- app/src/main/res/values/dimens.xml | 2 +- 6 files changed, 98 insertions(+), 31 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 86268b68f..67dfb9030 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -53,6 +53,7 @@ dependencies { implementation 'it.sephiroth.android.exif:library:1.0.1' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.12' implementation 'com.github.chrisbanes:PhotoView:2.1.3' + implementation 'com.android.support.constraint:constraint-layout:1.1.2' kapt "android.arch.persistence.room:compiler:1.1.0" implementation "android.arch.persistence.room:runtime:1.1.0" 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 2a92a42c0..14b69e3be 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -69,6 +69,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private var mIsOrientationLocked = false private var mStoredReplaceZoomableImages = false + private var mStoredBottomActions = true private var mMediaFiles = ArrayList() companion object { @@ -92,6 +93,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } storeStateVariables() + initBottomActions() } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @@ -115,6 +117,10 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View refreshViewPager() } + if (mStoredBottomActions != config.bottomActions) { + initBottomActions() + } + supportActionBar?.setBackgroundDrawable(resources.getDrawable(R.drawable.actionbar_gradient_background)) if (config.maxBrightness) { @@ -240,10 +246,18 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View view_pager.adapter?.let { (it as MyPagerAdapter).toggleFullscreen(mIsFullScreen) checkSystemUI() + if (!bottom_actions.isGone()) { + bottom_actions.animate().alpha(if (mIsFullScreen) 0f else 1f).start() + } } } } + private fun initBottomActions() { + initBottomActionsLayout() + initBottomActionButtons() + } + private fun setupRotation() { if (mIsOrientationLocked) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { @@ -313,6 +327,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private fun storeStateVariables() { config.apply { mStoredReplaceZoomableImages = replaceZoomableImages + mStoredBottomActions = bottomActions } } @@ -719,6 +734,33 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View return (floatD + floatM / 60 + floatS / 3600).toFloat() } + private fun initBottomActionsLayout() { + bottom_actions.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight + if (config.bottomActions) { + bottom_actions.beVisible() + } else { + bottom_actions.beGone() + } + } + + private fun initBottomActionButtons() { + bottom_properties.setOnClickListener { + + } + + bottom_edit.setOnClickListener { + + } + + bottom_share.setOnClickListener { + + } + + bottom_delete.setOnClickListener { + + } + } + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { if (requestCode == REQUEST_EDIT_IMAGE) { if (resultCode == Activity.RESULT_OK && resultData != null) { 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 6dcf9a864..2ad42afb4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -51,7 +51,6 @@ class PhotoFragment : ViewPagerFragment() { private var storedShowExtendedDetails = false private var storedHideExtendedDetails = false - private var storedBottomActions = false private var storedExtendedDetails = 0 lateinit var view: ViewGroup @@ -118,7 +117,6 @@ class PhotoFragment : ViewPagerFragment() { isFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN loadImage() initExtendedDetails() - initBottomActions() wasInit = true return view @@ -135,10 +133,6 @@ class PhotoFragment : ViewPagerFragment() { initExtendedDetails() } - if (wasInit && (context!!.config.bottomActions != storedBottomActions)) { - initBottomActions() - } - val allowPhotoGestures = context!!.config.allowPhotoGestures val allowInstantChange = context!!.config.allowInstantChange @@ -168,7 +162,6 @@ class PhotoFragment : ViewPagerFragment() { storedShowExtendedDetails = showExtendedDetails storedHideExtendedDetails = hideExtendedDetails storedExtendedDetails = extendedDetails - storedBottomActions = bottomActions } } @@ -404,14 +397,6 @@ class PhotoFragment : ViewPagerFragment() { } } - private fun initBottomActions() { - if (context!!.config.bottomActions) { - view.bottom_actions.beVisible() - } else { - view.bottom_actions.beGone() - } - } - override fun onDestroyView() { super.onDestroyView() if (activity?.isActivityDestroyed() == false) { @@ -424,7 +409,6 @@ class PhotoFragment : ViewPagerFragment() { super.onConfigurationChanged(newConfig) loadImage() initExtendedDetails() - initBottomActions() } private fun photoClicked() { @@ -442,10 +426,6 @@ class PhotoFragment : ViewPagerFragment() { } } } - - if (storedBottomActions) { - view.bottom_actions.animate().alpha(if (isFullscreen) 0f else 1f).start() - } } private fun getExtendedDetailsY(height: Int): Float { diff --git a/app/src/main/res/layout/activity_medium.xml b/app/src/main/res/layout/activity_medium.xml index 1d8dc6c42..368540386 100644 --- a/app/src/main/res/layout/activity_medium.xml +++ b/app/src/main/res/layout/activity_medium.xml @@ -1,6 +1,7 @@ @@ -10,4 +11,57 @@ android:layout_width="match_parent" android:layout_height="match_parent"/> + + + + + + + + + + + diff --git a/app/src/main/res/layout/pager_photo_item.xml b/app/src/main/res/layout/pager_photo_item.xml index 85765aa38..deb877e71 100644 --- a/app/src/main/res/layout/pager_photo_item.xml +++ b/app/src/main/res/layout/pager_photo_item.xml @@ -68,14 +68,4 @@ android:layout_alignParentEnd="true" android:layout_alignParentRight="true"/> - - - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 3771a2dbc..79eab94d2 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -10,5 +10,5 @@ 60dp 30dp 72dp - 110dp + 54dp From 38397a71dd012450b9d6e6aeb136bda7b6a9d831 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 15:52:18 +0200 Subject: [PATCH 35/64] remove the option for replacing Share with Rotate at the fullscreen view --- .../gallery/activities/SettingsActivity.kt | 9 -------- .../gallery/activities/ViewPagerActivity.kt | 5 +--- .../gallery/helpers/Config.kt | 4 ---- .../gallery/helpers/Constants.kt | 1 - app/src/main/res/layout/activity_settings.xml | 23 ------------------- app/src/main/res/menu/menu_viewpager.xml | 8 +------ 6 files changed, 2 insertions(+), 48 deletions(-) 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 d010bbc5e..197d2071a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/SettingsActivity.kt @@ -51,7 +51,6 @@ class SettingsActivity : SimpleActivity() { setupScrollHorizontally() setupScreenRotation() setupHideSystemUI() - setupReplaceShare() setupPasswordProtection() setupAppPasswordProtection() setupDeleteEmptyFolders() @@ -220,14 +219,6 @@ class SettingsActivity : SimpleActivity() { } } - private fun setupReplaceShare() { - settings_replace_share.isChecked = config.replaceShare - settings_replace_share_holder.setOnClickListener { - settings_replace_share.toggle() - config.replaceShare = settings_replace_share.isChecked - } - } - private fun setupPasswordProtection() { settings_password_protection.isChecked = config.isPasswordProtectionOn settings_password_protection_holder.setOnClickListener { 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 14b69e3be..f681de3e8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -275,8 +275,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View val currentMedium = getCurrentMedium() ?: return true menu.apply { - findItem(R.id.menu_share_1).isVisible = !config.replaceShare - findItem(R.id.menu_share_2).isVisible = config.replaceShare findItem(R.id.menu_rotate).isVisible = currentMedium.isImage() findItem(R.id.menu_save_as).isVisible = mRotationDegrees != 0 findItem(R.id.menu_hide).isVisible = !currentMedium.name.startsWith('.') @@ -306,8 +304,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View R.id.menu_open_with -> openPath(getCurrentPath(), true) R.id.menu_hide -> toggleFileVisibility(true) R.id.menu_unhide -> toggleFileVisibility(false) - R.id.menu_share_1 -> shareMedium(getCurrentMedium()!!) - R.id.menu_share_2 -> shareMedium(getCurrentMedium()!!) + R.id.menu_share -> shareMedium(getCurrentMedium()!!) R.id.menu_delete -> checkDeleteConfirmation() R.id.menu_rename -> renameFile() R.id.menu_edit -> openEditor(getCurrentPath()) 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 97e9e534e..73d6db933 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Config.kt @@ -227,10 +227,6 @@ class Config(context: Context) : BaseConfig(context) { get() = prefs.getBoolean(HIDE_SYSTEM_UI, false) set(hideSystemUI) = prefs.edit().putBoolean(HIDE_SYSTEM_UI, hideSystemUI).apply() - var replaceShare: Boolean - get() = prefs.getBoolean(REPLACE_SHARE_WITH_ROTATE, false) - set(replaceShare) = prefs.edit().putBoolean(REPLACE_SHARE_WITH_ROTATE, replaceShare).apply() - var deleteEmptyFolders: Boolean get() = prefs.getBoolean(DELETE_EMPTY_FOLDERS, false) set(deleteEmptyFolders) = prefs.edit().putBoolean(DELETE_EMPTY_FOLDERS, deleteEmptyFolders).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 902a005c9..9c9d0b018 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt @@ -30,7 +30,6 @@ const val EXCLUDED_FOLDERS = "excluded_folders" const val INCLUDED_FOLDERS = "included_folders" const val ALBUM_COVERS = "album_covers" const val HIDE_SYSTEM_UI = "hide_system_ui" -const val REPLACE_SHARE_WITH_ROTATE = "replace_share_with_rotate" const val DELETE_EMPTY_FOLDERS = "delete_empty_folders" const val ALLOW_PHOTO_GESTURES = "allow_photo_gestures" const val ALLOW_VIDEO_GESTURES = "allow_video_gestures" diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index ef0dc36d2..94cc6ea57 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -557,29 +557,6 @@ - - - - - - @@ -34,12 +34,6 @@ android:title="@string/rotate_one_eighty"/> - Date: Sun, 17 Jun 2018 16:08:57 +0200 Subject: [PATCH 36/64] handle bottom action button clicks --- .../gallery/activities/ViewPagerActivity.kt | 12 ++++++++---- app/src/main/res/layout/activity_medium.xml | 2 +- 2 files changed, 9 insertions(+), 5 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 f681de3e8..784bf8fcd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -275,6 +275,10 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View val currentMedium = getCurrentMedium() ?: return true menu.apply { + findItem(R.id.menu_properties).isVisible = !config.bottomActions + findItem(R.id.menu_delete).isVisible = !config.bottomActions + findItem(R.id.menu_share).isVisible = !config.bottomActions + findItem(R.id.menu_edit).isVisible = !config.bottomActions findItem(R.id.menu_rotate).isVisible = currentMedium.isImage() findItem(R.id.menu_save_as).isVisible = mRotationDegrees != 0 findItem(R.id.menu_hide).isVisible = !currentMedium.name.startsWith('.') @@ -742,19 +746,19 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private fun initBottomActionButtons() { bottom_properties.setOnClickListener { - + showProperties() } bottom_edit.setOnClickListener { - + openEditor(getCurrentPath()) } bottom_share.setOnClickListener { - + shareMedium(getCurrentMedium()!!) } bottom_delete.setOnClickListener { - + checkDeleteConfirmation() } } diff --git a/app/src/main/res/layout/activity_medium.xml b/app/src/main/res/layout/activity_medium.xml index 368540386..0a1dcc508 100644 --- a/app/src/main/res/layout/activity_medium.xml +++ b/app/src/main/res/layout/activity_medium.xml @@ -36,7 +36,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="@dimen/medium_margin" - android:src="@drawable/ic_rename" + android:src="@drawable/ic_edit" app:layout_constraintEnd_toStartOf="@+id/bottom_share" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/bottom_properties"/> From 1147e012a7e27c859e7de107aff4c518db958279 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Sun, 17 Jun 2018 17:31:06 +0200 Subject: [PATCH 37/64] Dutch --- app/src/main/res/values-nl/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 6f9f7c835..8e12577dd 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -30,7 +30,7 @@ Afbeeldingen Video\'s GIF-bestanden - RAW images + RAW-afbeeldingen Er zijn geen bestanden gevonden met de huidige filters. Filters aanpassen @@ -148,7 +148,7 @@ In hoge kwaliteit weergeven (ten koste van ver inzoomen) Uitgebreide informatie niet tonen als de statusbalk is verborgen Ongeldige bestanden verbergen - Show some action buttons at the bottom of the screen + Enkele actieknoppen onderaan het scherm tonen Miniatuurvoorbeelden From 02ce6bd11b6d362a9f0dd390bdb6c557b7513012 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 20:11:29 +0200 Subject: [PATCH 38/64] make bottom actions work well with extended details --- .../com/simplemobiletools/gallery/fragments/PhotoFragment.kt | 3 ++- .../com/simplemobiletools/gallery/fragments/VideoFragment.kt | 4 ++++ 2 files changed, 6 insertions(+), 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 2ad42afb4..d69f35829 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -431,6 +431,7 @@ class PhotoFragment : ViewPagerFragment() { private fun getExtendedDetailsY(height: Int): Float { val smallMargin = resources.getDimension(R.dimen.small_margin) val fullscreenOffset = context!!.navigationBarHeight.toFloat() - smallMargin - return context!!.usableScreenSize.y - height + if (isFullscreen) fullscreenOffset else -smallMargin + val actionsHeight = if (context!!.config.bottomActions && !isFullscreen) resources.getDimension(R.dimen.bottom_actions_height) else 0f + return context!!.usableScreenSize.y - height - actionsHeight + if (isFullscreen) fullscreenOffset else -smallMargin } } 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 9993663ae..7faf57b2a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -199,6 +199,10 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee right += context!!.navigationBarWidth bottom += context!!.navigationBarHeight } + + if (context!!.config.bottomActions) { + bottom += resources.getDimension(R.dimen.bottom_actions_height).toInt() + } mTimeHolder!!.setPadding(left, top, right, bottom) } From 39ec57787f39b559c573ae4d0322d98ef2621a4d Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 21:07:38 +0200 Subject: [PATCH 39/64] recalculate video seekbar position if bottom actions get toggled --- .../simplemobiletools/gallery/fragments/VideoFragment.kt | 7 +++++++ 1 file changed, 7 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 7faf57b2a..ed866bc3f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -53,6 +53,7 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee private var mStoredShowExtendedDetails = false private var mStoredHideExtendedDetails = false + private var mStoredBottomActions = true private var mStoredExtendedDetails = 0 private lateinit var brightnessSideScroll: MediaSideScroll @@ -118,6 +119,11 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee if (context!!.config.showExtendedDetails != mStoredShowExtendedDetails || context!!.config.extendedDetails != mStoredExtendedDetails) { checkExtendedDetails() } + + if (context!!.config.bottomActions != mStoredBottomActions) { + initTimeHolder() + } + storeStateVariables() } @@ -139,6 +145,7 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee mStoredShowExtendedDetails = showExtendedDetails mStoredHideExtendedDetails = hideExtendedDetails mStoredExtendedDetails = extendedDetails + mStoredBottomActions = bottomActions } } From b1136ed0411bd3fe43b82946e1d5fbf0a7c61dc0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 21:28:44 +0200 Subject: [PATCH 40/64] replace the Play icon with a Pause at playing videos --- .../gallery/fragments/VideoFragment.kt | 5 ++++- .../res/drawable-hdpi/img_pause_outline_big.png | Bin 0 -> 8904 bytes .../drawable-xhdpi/img_pause_outline_big.png | Bin 0 -> 10372 bytes .../drawable-xxhdpi/img_pause_outline_big.png | Bin 0 -> 19825 bytes .../drawable-xxxhdpi/img_pause_outline_big.png | Bin 0 -> 16861 bytes app/src/main/res/layout/pager_video_item.xml | 2 +- app/src/main/res/values-sw600dp/dimens.xml | 2 +- app/src/main/res/values/dimens.xml | 2 +- 8 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/img_pause_outline_big.png create mode 100644 app/src/main/res/drawable-xhdpi/img_pause_outline_big.png create mode 100644 app/src/main/res/drawable-xxhdpi/img_pause_outline_big.png create mode 100644 app/src/main/res/drawable-xxxhdpi/img_pause_outline_big.png 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 ed866bc3f..ec781cc34 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -313,7 +313,8 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee } else { mPlayOnPrepare = true } - mView!!.video_play_outline.setImageDrawable(null) + + mView!!.video_play_outline.setImageDrawable(resources.getDrawable(R.drawable.img_pause_outline_big)) activity!!.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } @@ -544,6 +545,8 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee } } } + + mView!!.video_play_outline.animate().alpha(if (isFullscreen) 0f else 1f).start() } private fun getExtendedDetailsY(height: Int): Float { diff --git a/app/src/main/res/drawable-hdpi/img_pause_outline_big.png b/app/src/main/res/drawable-hdpi/img_pause_outline_big.png new file mode 100644 index 0000000000000000000000000000000000000000..5f7edd9bd36c115d7d751c53673e8b8b1745774d GIT binary patch literal 8904 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 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 new file mode 100644 index 0000000000000000000000000000000000000000..fb11ab5efb50f8f32251109c7d8d6b4271df0923 GIT binary patch literal 10372 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 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 new file mode 100644 index 0000000000000000000000000000000000000000..34930cced0b74df5a41dd17661e495115bb5f384 GIT binary patch literal 19825 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 120dp 30dp 38dp - 230dp + 200dp 60dp diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 79eab94d2..dc4653591 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -5,7 +5,7 @@ 20dp 22dp 26dp - 150dp + 130dp 60dp 60dp 30dp From 7a38862e8c83fa36864155da5cffb67a3f0d83e7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 21:30:51 +0200 Subject: [PATCH 41/64] recalculate bottom actions position on orientation change --- .../simplemobiletools/gallery/activities/ViewPagerActivity.kt | 1 + 1 file changed, 1 insertion(+) 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 784bf8fcd..9579a727f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -827,6 +827,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View override fun onConfigurationChanged(newConfig: Configuration?) { super.onConfigurationChanged(newConfig) measureScreen() + initBottomActionsLayout() } private fun measureScreen() { From 79aa2306be63401854d8552a0f811b2d5b3dd543 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 21:32:35 +0200 Subject: [PATCH 42/64] make sure the play/pause button is hidden if the fragment isnt created at fullscreen --- .../com/simplemobiletools/gallery/fragments/VideoFragment.kt | 2 ++ 1 file changed, 2 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 ec781cc34..fee105945 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -77,6 +77,8 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee } mIsFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN + mView!!.video_play_outline.alpha = if (mIsFullscreen) 0f else 1f + setupPlayer() if (savedInstanceState != null) { mCurrTime = savedInstanceState.getInt(PROGRESS) From dddfea3b1ea35de691cafada4ed4180e4647d66d Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 21:54:44 +0200 Subject: [PATCH 43/64] make cursor at retrieving Date Takens nullable --- .../com/simplemobiletools/gallery/helpers/MediaFetcher.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt index f5d989c50..5e95d2587 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt @@ -285,7 +285,7 @@ class MediaFetcher(val context: Context) { val dateTakens = HashMap() val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) - cursor.use { + cursor?.use { if (cursor.moveToFirst()) { do { try { From 875ba99dc02018e5183b0ef31beade7cf0bbfd33 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 21:57:48 +0200 Subject: [PATCH 44/64] catch IOExceptions at getting some file paths --- .../com/simplemobiletools/gallery/extensions/String.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/String.kt index a8f4a9f57..ad9a4ec58 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/String.kt @@ -3,6 +3,7 @@ package com.simplemobiletools.gallery.extensions import com.bumptech.glide.signature.ObjectKey import com.simplemobiletools.commons.helpers.OTG_PATH import java.io.File +import java.io.IOException fun String.getFileSignature(): ObjectKey { val file = File(this) @@ -35,4 +36,10 @@ fun String.shouldFolderBeVisible(excludedPaths: MutableSet, includedPath } // recognize /sdcard/DCIM as the same folder as /storage/emulated/0/DCIM -fun String.getDistinctPath() = if (startsWith(OTG_PATH)) toLowerCase() else File(this).canonicalPath.toLowerCase() +fun String.getDistinctPath(): String { + return try { + if (startsWith(OTG_PATH)) toLowerCase() else File(this).canonicalPath.toLowerCase() + } catch (e: IOException) { + toLowerCase() + } +} From 0258fc5e29141a2ebdf529cffdb65d2297077ea1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 22:02:52 +0200 Subject: [PATCH 45/64] ignore ConcurrentModificationExceptions thrown at updating the directories --- .../gallery/activities/MainActivity.kt | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 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 1fc066316..1068bc419 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -37,6 +37,7 @@ import com.simplemobiletools.gallery.models.Directory import com.simplemobiletools.gallery.models.Medium import kotlinx.android.synthetic.main.activity_main.* import java.io.* +import java.util.* class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { private val PICK_MEDIA = 2 @@ -609,41 +610,44 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { val directoryDao = galleryDB.DirectoryDao() val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 - for (directory in dirs) { - val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken) - val newDir = if (curMedia.isEmpty()) { - directory - } else { - createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, isSortingAscending) - } + try { + for (directory in dirs) { + val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken) + val newDir = if (curMedia.isEmpty()) { + directory + } else { + createDirectoryFromMedia(directory.path, curMedia, albumCovers, hiddenString, includedFolders, isSortingAscending) + } - // we are looping through the already displayed folders looking for changes, do not do anything if nothing changed - if (directory == newDir) { - continue - } + // we are looping through the already displayed folders looking for changes, do not do anything if nothing changed + if (directory == newDir) { + continue + } - directory.apply { - tmb = newDir.tmb - name = newDir.name - mediaCnt = newDir.mediaCnt - modified = newDir.modified - taken = newDir.taken - this@apply.size = newDir.size - types = newDir.types - } + directory.apply { + tmb = newDir.tmb + name = newDir.name + mediaCnt = newDir.mediaCnt + modified = newDir.modified + taken = newDir.taken + this@apply.size = newDir.size + types = newDir.types + } - showSortedDirs(dirs) + showSortedDirs(dirs) - // update directories and media files in the local db, delete invalid items - updateDBDirectory(directory) - mediumDao.insertAll(curMedia) - getCachedMedia(directory.path, getVideosOnly, getImagesOnly) { - it.forEach { - if (!curMedia.contains(it)) { - mediumDao.deleteMediumPath(it.path) + // update directories and media files in the local db, delete invalid items + updateDBDirectory(directory) + mediumDao.insertAll(curMedia) + getCachedMedia(directory.path, getVideosOnly, getImagesOnly) { + it.forEach { + if (!curMedia.contains(it)) { + mediumDao.deleteMediumPath(it.path) + } } } } + } catch (ignored: ConcurrentModificationException) { } val foldersToScan = mediaFetcher.getFoldersToScan() From 026f80aa20f41141bf9e49b96cd2cfc132f53687 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 22:23:26 +0200 Subject: [PATCH 46/64] catch some Room db exceptions --- .../gallery/extensions/Context.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) 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 cdcee9016..9506dd064 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.Intent import android.content.res.Configuration import android.database.Cursor +import android.database.sqlite.SQLiteException import android.graphics.Point import android.media.AudioManager import android.os.Build @@ -276,7 +277,11 @@ fun Context.loadJpg(path: String, target: MySquareImageView, cropThumbnails: Boo fun Context.getCachedDirectories(getVideosOnly: Boolean = false, getImagesOnly: Boolean = false, callback: (ArrayList) -> Unit) { Thread { val directoryDao = galleryDB.DirectoryDao() - val directories = directoryDao.getAll() as ArrayList + val directories = try { + directoryDao.getAll() as ArrayList + } catch (e: SQLiteException) { + ArrayList() + } val shouldShowHidden = config.shouldShowHidden val excludedPaths = config.excludedFolders val includedPaths = config.includedFolders @@ -317,8 +322,11 @@ fun Context.getCachedMedia(path: String, getVideosOnly: Boolean = false, getImag var media = ArrayList() val shouldShowHidden = config.shouldShowHidden foldersToScan.forEach { - val currMedia = mediumDao.getMediaFromPath(it) - media.addAll(currMedia) + try { + val currMedia = mediumDao.getMediaFromPath(it) + media.addAll(currMedia) + } catch (ignored: IllegalStateException) { + } } if (!shouldShowHidden) { From 9aa8f553ca9507eccf2461dd9cbb30ed8d90634a Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 17 Jun 2018 23:52:03 +0200 Subject: [PATCH 47/64] add the bottom action buttons to third party intent handling activity too --- .../gallery/activities/PhotoVideoActivity.kt | 43 +++++++++++++- .../gallery/activities/ViewPagerActivity.kt | 1 + app/src/main/res/layout/activity_medium.xml | 54 +----------------- app/src/main/res/layout/bottom_actions.xml | 56 +++++++++++++++++++ app/src/main/res/layout/fragment_holder.xml | 15 ++++- 5 files changed, 114 insertions(+), 55 deletions(-) create mode 100644 app/src/main/res/layout/bottom_actions.xml 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 6871069c2..d1528b092 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.gallery.activities import android.content.Intent +import android.content.res.Configuration import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.net.Uri @@ -20,6 +21,7 @@ import com.simplemobiletools.gallery.fragments.VideoFragment import com.simplemobiletools.gallery.fragments.ViewPagerFragment import com.simplemobiletools.gallery.helpers.* import com.simplemobiletools.gallery.models.Medium +import kotlinx.android.synthetic.main.bottom_actions.* import kotlinx.android.synthetic.main.fragment_holder.* import java.io.File @@ -46,6 +48,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList finish() } } + + initBottomActions() } override fun onResume() { @@ -99,7 +103,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList mFragment = if (mIsVideo) VideoFragment() else PhotoFragment() mFragment!!.listener = this mFragment!!.arguments = bundle - supportFragmentManager.beginTransaction().replace(R.id.fragment_holder, mFragment).commit() + supportFragmentManager.beginTransaction().replace(R.id.fragment_placeholder, mFragment).commit() } if (config.blackBackground) { @@ -112,6 +116,11 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList } } + override fun onConfigurationChanged(newConfig: Configuration?) { + super.onConfigurationChanged(newConfig) + initBottomActionsLayout() + } + private fun sendViewPagerIntent(path: String) { Intent(this, ViewPagerActivity::class.java).apply { putExtra(IS_VIEW_INTENT, true) @@ -153,6 +162,34 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList PropertiesDialog(this, mUri!!.path) } + private fun initBottomActions() { + initBottomActionsLayout() + initBottomActionButtons() + } + + private fun initBottomActionsLayout() { + bottom_actions.layoutParams.height = resources.getDimension(R.dimen.bottom_actions_height).toInt() + navigationBarHeight + if (config.bottomActions) { + bottom_actions.beVisible() + } else { + bottom_actions.beGone() + } + } + + private fun initBottomActionButtons() { + bottom_properties.setOnClickListener { + } + + bottom_edit.setOnClickListener { + } + + bottom_share.setOnClickListener { + } + + bottom_delete.setOnClickListener { + } + } + override fun fragmentClicked() { mIsFullScreen = !mIsFullScreen if (mIsFullScreen) { @@ -160,6 +197,10 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList } else { showSystemUI() } + + if (!bottom_actions.isGone()) { + bottom_actions.animate().alpha(if (mIsFullScreen) 0f else 1f).start() + } } override fun videoEnded() = false 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 9579a727f..7e25ad59c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -45,6 +45,7 @@ import com.simplemobiletools.gallery.fragments.ViewPagerFragment import com.simplemobiletools.gallery.helpers.* import com.simplemobiletools.gallery.models.Medium import kotlinx.android.synthetic.main.activity_medium.* +import kotlinx.android.synthetic.main.bottom_actions.* import java.io.File import java.io.FileOutputStream import java.io.InputStream diff --git a/app/src/main/res/layout/activity_medium.xml b/app/src/main/res/layout/activity_medium.xml index 0a1dcc508..63559ebf0 100644 --- a/app/src/main/res/layout/activity_medium.xml +++ b/app/src/main/res/layout/activity_medium.xml @@ -1,7 +1,6 @@ @@ -11,57 +10,8 @@ android:layout_width="match_parent" android:layout_height="match_parent"/> - + layout="@layout/bottom_actions"/> - - - - - - - - - diff --git a/app/src/main/res/layout/bottom_actions.xml b/app/src/main/res/layout/bottom_actions.xml new file mode 100644 index 000000000..dec089e89 --- /dev/null +++ b/app/src/main/res/layout/bottom_actions.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_holder.xml b/app/src/main/res/layout/fragment_holder.xml index 9a0863df0..d10a3a193 100644 --- a/app/src/main/res/layout/fragment_holder.xml +++ b/app/src/main/res/layout/fragment_holder.xml @@ -1,6 +1,17 @@ - + android:layout_height="match_parent"> + + + + + + From 6a216fc67548f111c50117198c628b3883daa031 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 Jun 2018 09:02:12 +0200 Subject: [PATCH 48/64] handle bottom button action presses at the PhotoVideo activity --- .../gallery/activities/PhotoVideoActivity.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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 d1528b092..6741d334b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt @@ -135,8 +135,9 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList menu.apply { findItem(R.id.menu_set_as).isVisible = mMedium?.isImage() == true - findItem(R.id.menu_edit).isVisible = mMedium?.isImage() == true && mUri?.scheme == "file" - findItem(R.id.menu_properties).isVisible = mUri?.scheme == "file" + findItem(R.id.menu_edit).isVisible = mMedium?.isImage() == true && mUri?.scheme == "file" && !config.bottomActions + findItem(R.id.menu_properties).isVisible = mUri?.scheme == "file" && !config.bottomActions + findItem(R.id.menu_share).isVisible = !config.bottomActions } return true @@ -178,16 +179,18 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList private fun initBottomActionButtons() { bottom_properties.setOnClickListener { + showProperties() } bottom_edit.setOnClickListener { + openEditor(mUri!!.toString()) } bottom_share.setOnClickListener { + sharePath(mUri!!.toString()) } - bottom_delete.setOnClickListener { - } + bottom_delete.beGone() } override fun fragmentClicked() { From d65045220d507a77c5ac6d22fe76fcfd18a1a0d0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 Jun 2018 09:10:08 +0200 Subject: [PATCH 49/64] set bottom actions padding at devices without a navigation bar too --- .../gallery/fragments/VideoFragment.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 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 fee105945..af7024ff4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -208,13 +208,14 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee right += context!!.navigationBarWidth bottom += context!!.navigationBarHeight } - - if (context!!.config.bottomActions) { - bottom += resources.getDimension(R.dimen.bottom_actions_height).toInt() - } - mTimeHolder!!.setPadding(left, top, right, bottom) } + if (context!!.config.bottomActions) { + bottom += resources.getDimension(R.dimen.bottom_actions_height).toInt() + } + + mTimeHolder!!.setPadding(left, top, right, bottom) + mCurrTimeView = mView!!.video_curr_time mSeekBar = mView!!.video_seekbar mSeekBar!!.setOnSeekBarChangeListener(this) From 061c7a5faea980927696050bd99a3f2a08759a0c Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 Jun 2018 09:22:03 +0200 Subject: [PATCH 50/64] remove the white stroke from play/pause buttons --- .../drawable-hdpi/img_pause_outline_big.png | Bin 8904 -> 3975 bytes .../drawable-hdpi/img_play_outline_big.png | Bin 10049 -> 5426 bytes .../drawable-xhdpi/img_pause_outline_big.png | Bin 10372 -> 3593 bytes .../drawable-xhdpi/img_play_outline_big.png | Bin 11420 -> 4664 bytes .../drawable-xxhdpi/img_pause_outline_big.png | Bin 19825 -> 7171 bytes .../drawable-xxhdpi/img_play_outline_big.png | Bin 22240 -> 10332 bytes .../img_pause_outline_big.png | Bin 16861 -> 4450 bytes .../drawable-xxxhdpi/img_play_outline_big.png | Bin 19117 -> 6171 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/src/main/res/drawable-hdpi/img_pause_outline_big.png b/app/src/main/res/drawable-hdpi/img_pause_outline_big.png index 5f7edd9bd36c115d7d751c53673e8b8b1745774d..eda00d0968baf39f89622fcf9687268ce64e6904 100644 GIT binary patch literal 3975 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 literal 8904 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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 index 96933587c0da5d6bb8161176204594c130ed1126..67419faa27611fa64fee8b1566bb2c7242a6fc24 100644 GIT binary patch literal 5426 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 a^DB|ng}Lxs(-aXDp#4z)L5&7H?EeA2WqYCk literal 10049 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 G{q#Q|)0{^D 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 index fb11ab5efb50f8f32251109c7d8d6b4271df0923..0dccd18e26f0bcba4988b54e1d711155b91b5d7c 100644 GIT binary patch literal 3593 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 I2PuF41N-cL1ONa4 literal 10372 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 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 index 29599d2ba8af36451bf265118c08828ae2a32261..e950835526dada0d628e4100b585142fa70f7765 100644 GIT binary patch literal 4664 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 literal 11420 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 E0C0OrR{#J2 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 index 34930cced0b74df5a41dd17661e495115bb5f384..4aa3cd3ccb5ca4fa3d69a21a28add2bd2d69e61a 100644 GIT binary patch literal 7171 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 xmuTBuf^h!sE_Zb}duIjmKk|sLTR#8* literal 19825 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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 literal 22240 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 diff --git a/app/src/main/res/drawable-xxxhdpi/img_pause_outline_big.png b/app/src/main/res/drawable-xxxhdpi/img_pause_outline_big.png index ffd3a897ceaa06276d48a921a367071664a82771..57fb987a18fd69b4183d7460c39514db5758871c 100644 GIT binary patch literal 4450 zcmd50lW7%36zEKel1I3sq z+%&^SL6%ZU3Y3T?;X}G)_mXIzx~_4y}$FF zy(Kuvzn9IwYyhCwlmNdO0JKQHtQD@|Ewb3^7n&o@|RJVxdT_MqXNQKqsLY9 zrF=d1M&qJv&6H`AWi?jzvR9lwDLZ-tfUBS4r6D0aV`OF)EH$`_qjwZNiNwagd85(EsJsAM$)Xw3+*Jc9@& z^2BEdC2~&NgP>Cjj1hswuzV+wu!&0Iq-~Y>^*HGoRx>2Lu2sUt^Pq?YUyfo+S$Yj=u~LSu^OS1a*ciOCKY}=Iw-zA$Ex6oD-=t=&hEeQ zcFU2V#QL%67cO*nt-drWC8+H6v{f6JWLvp#YeMfg!L zD`zNg`@VCf?(z6c!=7o^RAPQA>?n+GY@D<;mvIHfGuAyC*2qDjBPsCo+1)Ae6tLyA z?yj77_6m=36riCdJzOOY1t?o)?Lg%6;}y}2s>><9XtPbz*CfGwckg}DD)~6bnzKtF zXIEW7i_Zlz^+mqFnTg14i7)ZA{+ z5y;c&ZXhrt+*3pfv^g-eqFp8|og+{lU1V8iSuSmtL3a*)zLI8vOO{5(UQt7<+RKov z5^LU9EWCPitQ2mzN%{D{S~`XWQLw98ksUf3QteZ;k>M0WiZ(`Gr-aT4UK!vJ2Rz+x zhrb@6crIivdnys@!YKC$v)w?nvx}7OGpBDDg(-MD_xPcrAY#q$i85itG!wC$9>Z~>CWXDzNx_UCpNd;+)8kT^)Y47C;=Ow8BNKa)QSydvC2%Ktk-|JP-APQV`xhHq4oMla z7eE*_>vFj#tH05TWpc`>?+E>_2g$-B>fKmurYbu;bO6-c4-YPP{)~pz*T}KdKyJpR zKbng@!8^0Gy5ToZBlqwbofs!$pjJwBLS?BghUziMt?GLSAHkI9@cOi-S_g)IrM9E%vL~eO zH}db%{AEycqY$WC*4zpIY-4Pc7q?mA=VObG+{QCK;}>!{aAKfg)$y2BHtu-U!pH5GZzz=@eJsn5Atdi?wzuE8Y(?a0CFVKv* zrFnDrw=RFfF%fttq%%`D>y!>4XD&u%__52cKQUGrFU~qt&vu-1ijuU!#tj?V{=@|= znD^LN#j{3vj;}tZ&(nkFPaIB<887iZ@L=7hBYha&n%sO?56^+UlP+K*Su!U*EN$D$ zgV6eBHm)*mVEesE!1CX}ENA#F1q+6z@1tSKqmU(ZHgikHLgEUEEe{QY-ydQx;v@Oi zyg^2(etWGetmv$>_{Fun%~cGYnw<6*<@Dz>(F1yB<%SivOO!L(&}?jC==@jAT}DP?&7D{4x| zGD4>dDB?kVf}kKzG9_yE-AQqYrNDW^y=F6LB$h4EDD2)rPf9wlX)c4bD{e8~s}TFnf{rO$q^WUXG*zZFSxhp?%L;xx)W~1ZXGZms@Tls5S=aOALDcQi z{0~P;ZFzO6J=-JuKSK<6S4t9WgNpw=5xdG}!I#VT_-7jC1s+$4cFU|Q?_ORs`#o~^ z+Q-yOOWR^%*V$ue)|V4nL#}xk*eK0M=e|4@-T6W9tMjs9#OSwp%w(mbuplFPCXvu( zdcnu3OM`X^(1=p9G~b!F z*I%Ds6_PmC=Si9WA;X>kPnD=TYtQP`oQNpZGLjbGB@kuGl&p}*<9tVy;o@+V(n5)x z2u|8a!_Yc4j#B891PpP)p^TvjLL$$1;#kKr1cB2M1lE-!2pSgWJK`j?#uFzJ_Bp2) zejozJ;Djh}@nS0?;M^GdGJ*?Espw>74vRA;ajKS)us9)7Yy{`0Bu+TjQ7jH_h(Ha; z!4!vBD@`+UC?lh-C~`R0;Sigk^TB&Fg1d+a0_WO_2s#Zxpfoyzgg7ZS;{%*=(aO=u z!(kKt;1bCX*dP2CA_z`46A^)(^aUb7yhj5faITJ%2g3isr>(>G(_ilwe8Uzr5jImM L2l*ZL4cGn$ay0zA literal 16861 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 literal 19117 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 Date: Mon, 18 Jun 2018 14:13:44 +0200 Subject: [PATCH 51/64] add RAW filtering at release notes --- .../com/simplemobiletools/gallery/activities/MainActivity.kt | 1 + app/src/main/res/values/donottranslate.xml | 1 + 2 files changed, 2 insertions(+) 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 1068bc419..4f4d4b0da 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -894,6 +894,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { add(Release(163, R.string.release_163)) add(Release(177, R.string.release_177)) add(Release(178, R.string.release_178)) + add(Release(180, R.string.release_180)) checkWhatsNew(this, BuildConfig.VERSION_CODE) } } diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 585eaa0e8..b27383d5b 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -2,6 +2,7 @@ + Allow filtering out RAW images separately Added sorting by Date Taken Allow customizing the app launcher icon color Added toggles for disabling Pull-to-refresh and permanent Delete dialog confirmation skipping From 64085b4e0458c4f4abef92ab29635ab124bad138 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 Jun 2018 14:29:01 +0200 Subject: [PATCH 52/64] fix file filtering by type --- app/build.gradle | 2 +- .../com/simplemobiletools/gallery/helpers/MediaFetcher.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 67dfb9030..3da8ecf76 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.2.2' + implementation 'com.simplemobiletools:commons:4.2.4' 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/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt index 5e95d2587..89c60e8f1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt @@ -67,7 +67,7 @@ class MediaFetcher(val context: Context) { } if (filterMedia and TYPE_GIFS != 0) { - query.append("${MediaStore.Images.Media.DATA} LIKE ?") + query.append("${MediaStore.Images.Media.DATA} LIKE ? OR ") } if (filterMedia and TYPE_RAWS != 0) { @@ -172,7 +172,7 @@ class MediaFetcher(val context: Context) { val isImage = filename.isImageFast() val isVideo = if (isImage) false else filename.isVideoFast() val isGif = if (isImage || isVideo) false else filename.isGif() - val isRaw = if (isImage || isVideo || isGif) false else filename.isRaw() + val isRaw = if (isImage || isVideo || isGif) false else filename.isRawFast() if (!isImage && !isVideo && !isGif && !isRaw) continue @@ -231,7 +231,7 @@ class MediaFetcher(val context: Context) { val isImage = filename.isImageFast() val isVideo = if (isImage) false else filename.isVideoFast() val isGif = if (isImage || isVideo) false else filename.isGif() - val isRaw = if (isImage || isVideo || isGif) false else filename.isRaw() + val isRaw = if (isImage || isVideo || isGif) false else filename.isRawFast() if (!isImage && !isVideo && !isGif || !isRaw) continue From ffda57cd651cc953387e52cfa02d93e50494497e Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 Jun 2018 14:47:08 +0200 Subject: [PATCH 53/64] update commons to 4.2.5 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3da8ecf76..5d9633f27 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.2.4' + implementation 'com.simplemobiletools:commons:4.2.5' 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 53f92d336dd8a0c44187e849e689c32cba1f74f9 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 Jun 2018 14:48:43 +0200 Subject: [PATCH 54/64] update version to 4.2.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5d9633f27..f5b33e2e4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "com.simplemobiletools.gallery" minSdkVersion 16 targetSdkVersion 27 - versionCode 179 - versionName "4.1.1" + versionCode 180 + versionName "4.2.0" multiDexEnabled true setProperty("archivesBaseName", "gallery") } From db4809c551f3f2fc743b0a1cd0c73da6efe67558 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 18 Jun 2018 14:48:48 +0200 Subject: [PATCH 55/64] updating changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec08cac15..9b43279c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,17 @@ Changelog ========== +Version 4.2.0 *(2018-06-18)* +---------------------------- + + * Move some actions at the fullscreen view to the bottom of the screen + * Allow filtering out RAW images separately + * Add a warning if the user tries deleting a folder + * Properly reset the temporary Skip Delete Confirmation dialog + * Show a Pause button over video if not in fullscreen mode + * Fix some glitches around inserting pin/pattern/fingerprint + * Many other stability and ux improvements + Version 4.1.1 *(2018-05-26)* ---------------------------- From 1498b82ae54d777379d9b97590ddbe90c567b2dd Mon Sep 17 00:00:00 2001 From: gregory678 Date: Mon, 18 Jun 2018 20:43:03 +0200 Subject: [PATCH 56/64] PL translation update [2018.06.18] --- app/src/main/res/values-pl/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index fae155e92..e6232ee27 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -5,7 +5,7 @@ Edytuj Uruchom aplikację aparatu (ukryty) - (excluded) + (wykluczony) Przypnij folder Wypakuj folder    Przypnij na górze @@ -30,7 +30,7 @@ Obrazy Filmy GIFy - RAW images + Obrazy RAW Nie znalazłem multimediów z wybranymi filtrami. Zmień filtry @@ -148,7 +148,7 @@    Zamieniaj powiększalne obrazy na te o lepszej jakości    Ukrywaj dodatkowe szczegóły gdy pasek stanu jest ukryty    Dodatkowe sprawdzenie w celu uniknięcia pokazywania niewłaściwych plików - Show some action buttons at the bottom of the screen + Pokazuj niektóre przyciski akcji na dole ekranu    Miniatury @@ -167,7 +167,7 @@    Jaka jest różnica pomię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? -    Cóż, zdjęcie to zdjęcie. Aplikacja nie wie, czy to jest akurat okładka od piosenki, czy cokolwiek innego. Aby ukryć niechciane rzeczy, przytrzymaj je i wybierz opcję \'Wyklucz\' z paska akcji. + 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.    Nie pokazuje(-ą) mi się folder(y) ze zdjęciami / filmami. Co mogę zrobić?    Wejdź do ustawień aplikacji i w sekcji z dołączonymi folderami dodaj tenże folder do listy.    Co jeśli chcę widzieć tylko.wybrane foldery? From ea16e43aa706f84aeea6d0d670ed5822aac56bc1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 19 Jun 2018 21:04:24 +0200 Subject: [PATCH 57/64] add an mUri null check at PhotoVideoActivity --- .../simplemobiletools/gallery/activities/PhotoVideoActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6741d334b..03910a6e3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt @@ -144,7 +144,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList } override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (mMedium == null) { + if (mMedium == null || mUri == null) { return true } From ddb8c98f0d91b0294bf0cf787f42a1b73e1797b4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 19 Jun 2018 21:42:02 +0200 Subject: [PATCH 58/64] properly retrieve date_taken from media files when appropriate --- app/build.gradle | 2 +- .../simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f5b33e2e4..a0d0cfbed 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.2.5' + implementation 'com.simplemobiletools:commons:4.2.6' 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/asynctasks/GetMediaAsynctask.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt index 1f03be404..7f245c98a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt @@ -3,7 +3,6 @@ package com.simplemobiletools.gallery.asynctasks import android.content.Context import android.os.AsyncTask import com.simplemobiletools.commons.helpers.SORT_BY_DATE_TAKEN -import com.simplemobiletools.commons.models.FileDirItem.Companion.sorting import com.simplemobiletools.gallery.extensions.config import com.simplemobiletools.gallery.helpers.MediaFetcher import com.simplemobiletools.gallery.models.Medium @@ -15,7 +14,7 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage private val mediaFetcher = MediaFetcher(context) override fun doInBackground(vararg params: Void): ArrayList { - val getProperDateTaken = sorting and SORT_BY_DATE_TAKEN != 0 + val getProperDateTaken = context.config.getFileSorting(mPath) and SORT_BY_DATE_TAKEN != 0 return if (showAll) { val foldersToScan = mediaFetcher.getFoldersToScan() val media = ArrayList() From 158d7322ee4658a6abddfe2db1a185ec3f3c7b89 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 19 Jun 2018 22:55:33 +0200 Subject: [PATCH 59/64] update commons to 4.2.8 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a0d0cfbed..01162895e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.2.6' + implementation 'com.simplemobiletools:commons:4.2.8' 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 703aa7bbd118e6845adac3205ddd7d5328cacc5c Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 19 Jun 2018 23:14:03 +0200 Subject: [PATCH 60/64] adding a new Medium field isFavorite --- .../gallery/activities/PhotoVideoActivity.kt | 2 +- .../simplemobiletools/gallery/databases/GalleryDatabase.kt | 2 +- .../com/simplemobiletools/gallery/helpers/MediaFetcher.kt | 4 ++-- .../com/simplemobiletools/gallery/interfaces/MediumDao.kt | 2 +- .../kotlin/com/simplemobiletools/gallery/models/Medium.kt | 3 ++- .../gallery/receivers/RefreshMediaReceiver.kt | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) 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 03910a6e3..6ef5ae6bc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt @@ -95,7 +95,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList else -> TYPE_RAWS } - mMedium = Medium(null, getFilenameFromUri(mUri!!), mUri.toString(), mUri!!.path.getParentPath(), 0, 0, file.length(), type) + mMedium = Medium(null, getFilenameFromUri(mUri!!), mUri.toString(), mUri!!.path.getParentPath(), 0, 0, file.length(), type, false) supportActionBar?.title = mMedium!!.name bundle.putSerializable(MEDIUM, mMedium) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/databases/GalleryDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/databases/GalleryDatabase.kt index b8bd5f47c..56896a30b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/databases/GalleryDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/databases/GalleryDatabase.kt @@ -9,7 +9,7 @@ import com.simplemobiletools.gallery.interfaces.MediumDao import com.simplemobiletools.gallery.models.Directory import com.simplemobiletools.gallery.models.Medium -@Database(entities = [(Directory::class), (Medium::class)], version = 2) +@Database(entities = [(Directory::class), (Medium::class)], version = 3) abstract class GalleryDatabase : RoomDatabase() { abstract fun DirectoryDao(): DirectoryDao diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt index 89c60e8f1..cf79c7532 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt @@ -210,7 +210,7 @@ class MediaFetcher(val context: Context) { else -> TYPE_RAWS } - val medium = Medium(null, filename, file.absolutePath, folder, lastModified, dateTaken, size, type) + val medium = Medium(null, filename, file.absolutePath, folder, lastModified, dateTaken, size, type, false) media.add(medium) } return media @@ -266,7 +266,7 @@ class MediaFetcher(val context: Context) { } val path = Uri.decode(file.uri.toString().replaceFirst("${context.config.OTGTreeUri}/document/${context.config.OTGPartition}%3A", OTG_PATH)) - val medium = Medium(null, filename, path, folder, dateModified, dateTaken, size, type) + val medium = Medium(null, filename, path, folder, dateModified, dateTaken, size, type, false) media.add(medium) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt index 1c076f768..7d47aef32 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt @@ -8,7 +8,7 @@ import com.simplemobiletools.gallery.models.Medium @Dao interface MediumDao { - @Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type FROM media WHERE parent_path = :path") + @Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, is_favorite FROM media WHERE parent_path = :path") fun getMediaFromPath(path: String): List @Insert(onConflict = REPLACE) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt index 9fe49658b..5f167a180 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt @@ -25,7 +25,8 @@ data class Medium( @ColumnInfo(name = "last_modified") val modified: Long, @ColumnInfo(name = "date_taken") var taken: Long, @ColumnInfo(name = "size") val size: Long, - @ColumnInfo(name = "type") val type: Int) : Serializable { + @ColumnInfo(name = "type") val type: Int, + @ColumnInfo(name = "is_favorite") val isFavorite: Boolean) : Serializable { companion object { private const val serialVersionUID = -6553149366975455L diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/receivers/RefreshMediaReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/receivers/RefreshMediaReceiver.kt index f90441e46..7e6de9293 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/receivers/RefreshMediaReceiver.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/receivers/RefreshMediaReceiver.kt @@ -19,7 +19,7 @@ class RefreshMediaReceiver : BroadcastReceiver() { Thread { val medium = Medium(null, path.getFilenameFromPath(), path, path.getParentPath(), System.currentTimeMillis(), System.currentTimeMillis(), - File(path).length(), getFileType(path)) + File(path).length(), getFileType(path), false) context.galleryDB.MediumDao().insert(medium) }.start() } From 8270aaa2f2a1a0de92352c6a92cd0e00d5db8e88 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 19 Jun 2018 23:23:18 +0200 Subject: [PATCH 61/64] replace bottom actions Properties button with Add to favorites --- .../gallery/activities/PhotoVideoActivity.kt | 9 +++------ .../gallery/activities/ViewPagerActivity.kt | 5 ++--- app/src/main/res/layout/bottom_actions.xml | 6 +++--- 3 files changed, 8 insertions(+), 12 deletions(-) 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 6ef5ae6bc..516b24a16 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt @@ -136,7 +136,7 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList 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" && !config.bottomActions + findItem(R.id.menu_properties).isVisible = mUri?.scheme == "file" findItem(R.id.menu_share).isVisible = !config.bottomActions } @@ -178,9 +178,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList } private fun initBottomActionButtons() { - bottom_properties.setOnClickListener { - showProperties() - } + bottom_favorite.beGone() + bottom_delete.beGone() bottom_edit.setOnClickListener { openEditor(mUri!!.toString()) @@ -189,8 +188,6 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList bottom_share.setOnClickListener { sharePath(mUri!!.toString()) } - - bottom_delete.beGone() } 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 7e25ad59c..a357ff1b6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -276,7 +276,6 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View val currentMedium = getCurrentMedium() ?: return true menu.apply { - findItem(R.id.menu_properties).isVisible = !config.bottomActions findItem(R.id.menu_delete).isVisible = !config.bottomActions findItem(R.id.menu_share).isVisible = !config.bottomActions findItem(R.id.menu_edit).isVisible = !config.bottomActions @@ -746,8 +745,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } private fun initBottomActionButtons() { - bottom_properties.setOnClickListener { - showProperties() + bottom_favorite.setOnClickListener { + } bottom_edit.setOnClickListener { diff --git a/app/src/main/res/layout/bottom_actions.xml b/app/src/main/res/layout/bottom_actions.xml index dec089e89..23eed6ae2 100644 --- a/app/src/main/res/layout/bottom_actions.xml +++ b/app/src/main/res/layout/bottom_actions.xml @@ -10,12 +10,12 @@ android:paddingTop="@dimen/medium_margin"> @@ -29,7 +29,7 @@ android:src="@drawable/ic_edit" app:layout_constraintEnd_toStartOf="@+id/bottom_share" app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toEndOf="@+id/bottom_properties"/> + app:layout_constraintStart_toEndOf="@+id/bottom_favorite"/> Date: Tue, 19 Jun 2018 23:34:36 +0200 Subject: [PATCH 62/64] handle Toggle favorite icon updating --- .../gallery/activities/ViewPagerActivity.kt | 21 +++++++++++++++++-- .../gallery/models/Medium.kt | 2 +- app/src/main/res/menu/menu_viewpager.xml | 10 +++++++++ 3 files changed, 30 insertions(+), 3 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 a357ff1b6..5b33873f0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -283,6 +283,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View findItem(R.id.menu_save_as).isVisible = mRotationDegrees != 0 findItem(R.id.menu_hide).isVisible = !currentMedium.name.startsWith('.') findItem(R.id.menu_unhide).isVisible = currentMedium.name.startsWith('.') + findItem(R.id.menu_add_to_favorites).isVisible = !currentMedium.isFavorite && !config.bottomActions + findItem(R.id.menu_remove_from_favorites).isVisible = currentMedium.isFavorite && !config.bottomActions findItem(R.id.menu_lock_orientation).isVisible = mRotationDegrees == 0 findItem(R.id.menu_lock_orientation).title = getString(if (mIsOrientationLocked) R.string.unlock_orientation else R.string.lock_orientation) findItem(R.id.menu_rotate).setShowAsAction( @@ -293,6 +295,9 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View }) } + if (config.bottomActions) { + updateFavoriteIcon(currentMedium) + } return true } @@ -316,6 +321,8 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View R.id.menu_show_on_map -> showOnMap() R.id.menu_rotate_right -> rotateImage(90) R.id.menu_rotate_left -> rotateImage(270) + R.id.menu_add_to_favorites -> toggleFavorite() + R.id.menu_remove_from_favorites -> toggleFavorite() R.id.menu_rotate_one_eighty -> rotateImage(180) R.id.menu_lock_orientation -> toggleLockOrientation() R.id.menu_save_as -> saveImageAs() @@ -746,7 +753,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private fun initBottomActionButtons() { bottom_favorite.setOnClickListener { - + toggleFavorite() } bottom_edit.setOnClickListener { @@ -762,6 +769,16 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } } + private fun updateFavoriteIcon(medium: Medium) { + val icon = if (medium.isFavorite) R.drawable.ic_star_on else R.drawable.ic_star_off + bottom_favorite.setImageResource(icon) + } + + private fun toggleFavorite() { + getCurrentMedium()!!.isFavorite = !getCurrentMedium()!!.isFavorite + invalidateOptionsMenu() + } + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { if (requestCode == REQUEST_EDIT_IMAGE) { if (resultCode == Activity.RESULT_OK && resultData != null) { @@ -972,7 +989,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View mPos = position updateActionbarTitle() mRotationDegrees = 0 - supportInvalidateOptionsMenu() + invalidateOptionsMenu() scheduleSwipe() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt index 5f167a180..60e551038 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/models/Medium.kt @@ -26,7 +26,7 @@ data class Medium( @ColumnInfo(name = "date_taken") var taken: Long, @ColumnInfo(name = "size") val size: Long, @ColumnInfo(name = "type") val type: Int, - @ColumnInfo(name = "is_favorite") val isFavorite: Boolean) : Serializable { + @ColumnInfo(name = "is_favorite") var isFavorite: Boolean) : Serializable { companion object { private const val serialVersionUID = -6553149366975455L diff --git a/app/src/main/res/menu/menu_viewpager.xml b/app/src/main/res/menu/menu_viewpager.xml index 6997ce606..c26c45eb8 100644 --- a/app/src/main/res/menu/menu_viewpager.xml +++ b/app/src/main/res/menu/menu_viewpager.xml @@ -34,6 +34,16 @@ android:title="@string/rotate_one_eighty"/> + + Date: Wed, 20 Jun 2018 11:56:38 +0200 Subject: [PATCH 63/64] fix storing item Favorite state --- .../gallery/activities/ViewPagerActivity.kt | 22 +++++++++++++++++-- .../gallery/helpers/MediaFetcher.kt | 14 +++++++----- .../gallery/interfaces/MediumDao.kt | 6 +++++ 3 files changed, 34 insertions(+), 8 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 5b33873f0..1ed1579c2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -72,6 +72,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private var mStoredReplaceZoomableImages = false private var mStoredBottomActions = true private var mMediaFiles = ArrayList() + private var mFavoritePaths = ArrayList() companion object { var screenWidth = 0 @@ -95,6 +96,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View storeStateVariables() initBottomActions() + initFavorites() } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @@ -259,6 +261,12 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View initBottomActionButtons() } + private fun initFavorites() { + Thread { + mFavoritePaths = galleryDB.MediumDao().getFavorites() as ArrayList + }.start() + } + private fun setupRotation() { if (mIsOrientationLocked) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { @@ -274,6 +282,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_viewpager, menu) val currentMedium = getCurrentMedium() ?: return true + currentMedium.isFavorite = mFavoritePaths.contains(currentMedium.path) menu.apply { findItem(R.id.menu_delete).isVisible = !config.bottomActions @@ -775,8 +784,17 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View } private fun toggleFavorite() { - getCurrentMedium()!!.isFavorite = !getCurrentMedium()!!.isFavorite - invalidateOptionsMenu() + val medium = getCurrentMedium() ?: return + medium.isFavorite = !medium.isFavorite + Thread { + galleryDB.MediumDao().updateFavorite(medium.path, medium.isFavorite) + if (medium.isFavorite) { + mFavoritePaths.add(medium.path) + } else { + mFavoritePaths.remove(medium.path) + } + invalidateOptionsMenu() + }.start() } override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt index cf79c7532..14ca604c1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt @@ -6,10 +6,7 @@ import android.net.Uri import android.provider.MediaStore import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* -import com.simplemobiletools.gallery.extensions.config -import com.simplemobiletools.gallery.extensions.getDistinctPath -import com.simplemobiletools.gallery.extensions.getOTGFolderChildren -import com.simplemobiletools.gallery.extensions.shouldFolderBeVisible +import com.simplemobiletools.gallery.extensions.* import com.simplemobiletools.gallery.models.Medium import java.io.File @@ -162,6 +159,7 @@ class MediaFetcher(val context: Context) { val doExtraCheck = context.config.doExtraCheck val showHidden = context.config.shouldShowHidden val dateTakens = if (getProperDateTaken) getFolderDateTakens(folder) else HashMap() + val favoritePaths = context.galleryDB.MediumDao().getFavorites() for (file in files) { if (shouldStop) { @@ -210,7 +208,9 @@ class MediaFetcher(val context: Context) { else -> TYPE_RAWS } - val medium = Medium(null, filename, file.absolutePath, folder, lastModified, dateTaken, size, type, false) + val path = file.absolutePath + val isFavorite = favoritePaths.contains(path) + val medium = Medium(null, filename, path, folder, lastModified, dateTaken, size, type, isFavorite) media.add(medium) } return media @@ -221,6 +221,7 @@ class MediaFetcher(val context: Context) { val files = context.getDocumentFile(folder)?.listFiles() ?: return media val doExtraCheck = context.config.doExtraCheck val showHidden = context.config.shouldShowHidden + val favoritePaths = context.galleryDB.MediumDao().getFavorites() for (file in files) { if (shouldStop) { @@ -266,7 +267,8 @@ class MediaFetcher(val context: Context) { } val path = Uri.decode(file.uri.toString().replaceFirst("${context.config.OTGTreeUri}/document/${context.config.OTGPartition}%3A", OTG_PATH)) - val medium = Medium(null, filename, path, folder, dateModified, dateTaken, size, type, false) + val isFavorite = favoritePaths.contains(path) + val medium = Medium(null, filename, path, folder, dateModified, dateTaken, size, type, isFavorite) media.add(medium) } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt index 7d47aef32..f3c88755b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt @@ -11,6 +11,9 @@ interface MediumDao { @Query("SELECT filename, full_path, parent_path, last_modified, date_taken, size, type, is_favorite FROM media WHERE parent_path = :path") fun getMediaFromPath(path: String): List + @Query("SELECT full_path FROM media WHERE is_favorite = 1") + fun getFavorites(): List + @Insert(onConflict = REPLACE) fun insert(medium: Medium) @@ -22,4 +25,7 @@ interface MediumDao { @Query("UPDATE OR REPLACE media SET filename = :newFilename, full_path = :newFullPath, parent_path = :newParentPath WHERE full_path = :oldPath") fun updateMedium(oldPath: String, newParentPath: String, newFilename: String, newFullPath: String) + + @Query("UPDATE media SET is_favorite = :isFavorite WHERE full_path = :path") + fun updateFavorite(path: String, isFavorite: Boolean) } From dce71ac1660029812bc8d8112e6c993ac9d03540 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 20 Jun 2018 12:10:41 +0200 Subject: [PATCH 64/64] optimize favorite item fetching, do not query it too often --- .../gallery/activities/MainActivity.kt | 5 +++-- .../gallery/activities/ViewPagerActivity.kt | 2 +- .../gallery/asynctasks/GetMediaAsynctask.kt | 6 ++++-- .../gallery/extensions/Context.kt | 2 ++ .../gallery/helpers/Constants.kt | 1 + .../gallery/helpers/MediaFetcher.kt | 18 ++++++++++-------- .../gallery/interfaces/MediumDao.kt | 2 +- 7 files changed, 22 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 4f4d4b0da..cfb34cdad 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -609,10 +609,11 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { val mediumDao = galleryDB.MediumDao() val directoryDao = galleryDB.DirectoryDao() val getProperDateTaken = config.directorySorting and SORT_BY_DATE_TAKEN != 0 + val favoritePaths = getFavoritePaths() try { for (directory in dirs) { - val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken) + val curMedia = mediaFetcher.getFilesFrom(directory.path, getImagesOnly, getVideosOnly, getProperDateTaken, favoritePaths) val newDir = if (curMedia.isEmpty()) { directory } else { @@ -657,7 +658,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { // check the remaining folders which were not cached at all yet for (folder in foldersToScan) { - val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken) + val newMedia = mediaFetcher.getFilesFrom(folder, getImagesOnly, getVideosOnly, getProperDateTaken, favoritePaths) if (newMedia.isEmpty()) { continue } 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 1ed1579c2..dfd2b21d5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -263,7 +263,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View private fun initFavorites() { Thread { - mFavoritePaths = galleryDB.MediumDao().getFavorites() as ArrayList + mFavoritePaths = getFavoritePaths() }.start() } 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 7f245c98a..07b9bb630 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/asynctasks/GetMediaAsynctask.kt @@ -4,6 +4,7 @@ import android.content.Context 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.MediaFetcher import com.simplemobiletools.gallery.models.Medium import java.util.* @@ -15,18 +16,19 @@ class GetMediaAsynctask(val context: Context, val mPath: String, val isPickImage override fun doInBackground(vararg params: Void): ArrayList { val getProperDateTaken = context.config.getFileSorting(mPath) and SORT_BY_DATE_TAKEN != 0 + val favoritePaths = context.getFavoritePaths() return if (showAll) { val foldersToScan = mediaFetcher.getFoldersToScan() val media = ArrayList() foldersToScan.forEach { - val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken) + val newMedia = mediaFetcher.getFilesFrom(it, isPickImage, isPickVideo, getProperDateTaken, favoritePaths) media.addAll(newMedia) } MediaFetcher(context).sortMedia(media, context.config.getFileSorting("")) media } else { - mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken) + mediaFetcher.getFilesFrom(mPath, isPickImage, isPickVideo, getProperDateTaken, favoritePaths) } } 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 9506dd064..1fb50627e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/Context.kt @@ -374,3 +374,5 @@ fun Context.updateDBDirectory(directory: Directory) { fun Context.getOTGFolderChildren(path: String) = getDocumentFile(path)?.listFiles() fun Context.getOTGFolderChildrenNames(path: String) = getOTGFolderChildren(path)?.map { it.name }?.toList() + +fun Context.getFavoritePaths() = galleryDB.MediumDao().getFavoritePaths() as ArrayList 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 9c9d0b018..39fdd8a4b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/Constants.kt @@ -63,6 +63,7 @@ const val SLIDESHOW_DEFAULT_INTERVAL = 5 const val SLIDESHOW_SCROLL_DURATION = 500L const val NOMEDIA = ".nomedia" +const val FAVORITES = "favorites" const val MAX_COLUMN_COUNT = 20 const val SHOW_TEMP_HIDDEN_DURATION = 300000L const val CLICK_MAX_DURATION = 150 diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt index 14ca604c1..9afb95ccf 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/helpers/MediaFetcher.kt @@ -6,14 +6,17 @@ import android.net.Uri import android.provider.MediaStore import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* -import com.simplemobiletools.gallery.extensions.* +import com.simplemobiletools.gallery.extensions.config +import com.simplemobiletools.gallery.extensions.getDistinctPath +import com.simplemobiletools.gallery.extensions.getOTGFolderChildren +import com.simplemobiletools.gallery.extensions.shouldFolderBeVisible import com.simplemobiletools.gallery.models.Medium import java.io.File class MediaFetcher(val context: Context) { var shouldStop = false - fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean): ArrayList { + fun getFilesFrom(curPath: String, isPickImage: Boolean, isPickVideo: Boolean, getProperDateTaken: Boolean, favoritePaths: ArrayList): ArrayList { val filterMedia = context.config.filterMedia if (filterMedia == 0) { return ArrayList() @@ -21,10 +24,10 @@ class MediaFetcher(val context: Context) { val curMedia = ArrayList() if (curPath.startsWith(OTG_PATH)) { - val newMedia = getMediaOnOTG(curPath, isPickImage, isPickVideo, filterMedia) + val newMedia = getMediaOnOTG(curPath, isPickImage, isPickVideo, filterMedia, favoritePaths) curMedia.addAll(newMedia) } else { - val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken) + val newMedia = getMediaInFolder(curPath, isPickImage, isPickVideo, filterMedia, getProperDateTaken, favoritePaths) curMedia.addAll(newMedia) } @@ -153,13 +156,13 @@ class MediaFetcher(val context: Context) { } } - private fun getMediaInFolder(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean): ArrayList { + private fun getMediaInFolder(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, getProperDateTaken: Boolean, + favoritePaths: ArrayList): ArrayList { val media = ArrayList() val files = File(folder).listFiles() ?: return media val doExtraCheck = context.config.doExtraCheck val showHidden = context.config.shouldShowHidden val dateTakens = if (getProperDateTaken) getFolderDateTakens(folder) else HashMap() - val favoritePaths = context.galleryDB.MediumDao().getFavorites() for (file in files) { if (shouldStop) { @@ -216,12 +219,11 @@ class MediaFetcher(val context: Context) { return media } - private fun getMediaOnOTG(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int): ArrayList { + private fun getMediaOnOTG(folder: String, isPickImage: Boolean, isPickVideo: Boolean, filterMedia: Int, favoritePaths: ArrayList): ArrayList { val media = ArrayList() val files = context.getDocumentFile(folder)?.listFiles() ?: return media val doExtraCheck = context.config.doExtraCheck val showHidden = context.config.shouldShowHidden - val favoritePaths = context.galleryDB.MediumDao().getFavorites() for (file in files) { if (shouldStop) { diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt index f3c88755b..451f92e27 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/interfaces/MediumDao.kt @@ -12,7 +12,7 @@ interface MediumDao { fun getMediaFromPath(path: String): List @Query("SELECT full_path FROM media WHERE is_favorite = 1") - fun getFavorites(): List + fun getFavoritePaths(): List @Insert(onConflict = REPLACE) fun insert(medium: Medium)