From 15daa64cbd6ebba6d4f6868f7009b2c92e4d72e7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 27 Nov 2017 20:32:57 +0100 Subject: [PATCH 01/28] reenable leak canary --- app/src/main/kotlin/com/simplemobiletools/gallery/App.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/App.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/App.kt index 350f990c2..361504972 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/App.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/App.kt @@ -2,18 +2,20 @@ package com.simplemobiletools.gallery import android.support.multidex.MultiDexApplication import com.github.ajalt.reprint.core.Reprint +import com.simplemobiletools.gallery.BuildConfig.USE_LEAK_CANARY import com.simplemobiletools.gallery.extensions.config +import com.squareup.leakcanary.LeakCanary import java.util.* class App : MultiDexApplication() { override fun onCreate() { super.onCreate() - /*if (USE_LEAK_CANARY) { + if (USE_LEAK_CANARY) { if (LeakCanary.isInAnalyzerProcess(this)) { return } LeakCanary.install(this) - }*/ + } if (config.useEnglish) { val conf = resources.configuration From 776643ba2a58b8cbc10aff822b42800fcdf956b2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 27 Nov 2017 20:36:11 +0100 Subject: [PATCH 02/28] update commons to 2.41.10 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 6634facfb..aa6a3df39 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:2.41.8' + implementation 'com.simplemobiletools:commons:2.41.10' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.8.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.4.0' implementation 'com.android.support:multidex:1.0.2' From 99cb734fc5ee5117d761233f207eac80442374de Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 28 Nov 2017 11:20:04 +0100 Subject: [PATCH 03/28] refresh the launcher icons, use svgs whenever possible --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 2 +- .../ic_launcher_foreground.png | Bin .../res/mipmap-anydpi-v21/ic_launcher.xml | 6 ++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 2 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 2 +- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 1554 -> 2607 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 2607 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 1962 -> 3272 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 3272 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 3346 -> 5861 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 5861 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 3885 -> 6793 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 6793 -> 0 bytes app/src/main/res/values/colors.xml | 4 ++-- 15 files changed, 12 insertions(+), 6 deletions(-) rename app/src/main/res/{mipmap-nodpi => drawable-v24}/ic_launcher_foreground.png (100%) create mode 100644 app/src/main/res/mipmap-anydpi-v21/ic_launcher.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/app/build.gradle b/app/build.gradle index aa6a3df39..4c8e642ac 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:2.41.10' + implementation 'com.simplemobiletools:commons:2.41.11' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.8.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.4.0' implementation 'com.android.support:multidex:1.0.2' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e0e44d1c3..37a01f75e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_launcher_name" - android:roundIcon="@mipmap/ic_launcher_round" + android:roundIcon="@mipmap/ic_launcher" android:supportsRtl="true" android:theme="@style/AppTheme"> diff --git a/app/src/main/res/mipmap-nodpi/ic_launcher_foreground.png b/app/src/main/res/drawable-v24/ic_launcher_foreground.png similarity index 100% rename from app/src/main/res/mipmap-nodpi/ic_launcher_foreground.png rename to app/src/main/res/drawable-v24/ic_launcher_foreground.png diff --git a/app/src/main/res/mipmap-anydpi-v21/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v21/ic_launcher.xml new file mode 100644 index 000000000..ca03b640b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v21/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 07b53a1c9..9512ead0c 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 07b53a1c9..9512ead0c 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index 26e7bfbd22b794175a7261217984f28d6c16e7a5..a92b5df689d8e49deec5e7f0b397563c5096c2f5 100644 GIT binary patch delta 2540 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 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index a92b5df689d8e49deec5e7f0b397563c5096c2f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2607 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≥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 c!BEJ50jCyu^JMEq2SQ;QjblM4HiWPs zq}n=keBg{sr=4Pb)R{VEoT;xVMW-{hTAU;hBZ?)R(kWDf5R&X>cklW2kHkT;ue-bV z?t|p>=RJ?#ch7J4>^Z;lxWE7d3^2d|{S`{LfOu*4z&6!h>gwwDI|Nh}IRFO(x1V(&z;4f83asaU@{Sn1~3?48-p}}MNe*$1P(GI0Kx?T zrwKR-q86#kCMU^{Y5VcB>HIvA$QTE3)g-&GIQLpsWCcJ=04f8Zm{dCx(Md2LmQud$ z)cl93`ou+Z>Q0WdI)DN4?kStgME4WnR)B`3#4e+qh~H*i9&{Gl-lr``1F5hZj@LDL|@)=bC>H#>cvSTUC5`-5V=eUNR zY3j7Xge4B>*gJhFLHve@mS@kmJ_?K`Mdx+)y2fU+t2VuHI(L`OBt`rIL}SgaJDm`t zoryO%YZ~7)vtCn&e_i$N+ej53TxpFD08GdS=nZeZ`w2Gji)&g%o%QZ51bQBTW>%e< z2{V|Va|D{Uk_R%`+Dvgk*BTU;grHgg8)IjU!IxE&>?4P}z5-~Z zDdJLrJrDN#4?+};i<(WI`5fK9dk_eCtxyplU0xmQR}k|*V8n3edH^F#la&Ir#Z@sI z9{|L#YoIRNY?%zH(AJn5q9rmw1bQf|R<&{ppiEz7IJ@e;4bZF^*b!qrd&U(;%M;ZB z-ulvc0NkdkvKTR9I>=_cLCKL1DlV}`3{hdXt>CU`S)w|CSlpLwkxp_APM}PY1xk95 zp!=hxM{HcKnq+6ft>#Oz7WO5u<NseJ^!K`ozVM7tNT-R)vb~qwE@YxgS{?(mO%I|hV@NF8_0SrvGR*o^KxCGjDTcFOo3u64W z>6Vie42U3^|RWE&LH^=oDj_or9pQ z*a2-(C1Bw)WCVhw1VgSsh!hL@xAl5@&~APLA~$4yVi;2Gu&wd{sy$|2+s!o)c~^m) zh0qp1lCaH0AV!xnAVOl_ksNT+dPzMKE9IJHN!KHaOQ0^QjBcxJ4aC)#)|iyiTR@}A zleTRX2|i7pW`E!3VI3fW&n;J!Hx$~^#}e*(`l8Oh2V(ThuxV5{3fhuwm)RmBXg5^@ zN@`Bk63`OvdH5lOWy#Wx*#Z zL4W(jkHRHHoW&6M&!)>DrDwL=x0^821PN%%Yk~aXu&vq!GB7$)rY?sVJKHi%03RLv z^gl0zONrR2TI>26}ybqu?838nW8q{kyq^#>n7Nz7y^M=UGKA)5?N6QlZe885Y0Rj#rEI_fr zR?J5ds=-$%1W?R7c5*E5Ku?eO{b0K zk84YTqxRT`l41Rso~(tBIBFW>YM;3GbhzwX14hKDb$^9{HuBR3qWBIW#O(ljys1;s zc^#P;sJjBt0c>)38d~Emn9!~!dtGBQ6L07>+}~khxyM!0@W(_7C%mo9S=0C?forW? zy37(@&j~c`PPA}R`}%Tf8lML9b4cgmt29F3_u9VxW@9qkj{gyK_BXc9~J3=?&%GTe^-(9Jm56_12l?9%rCww;3;P_zp|H zshzt^X9`uk${>rbqDn0cv;o+Z=uk5nmYi;I)g3$P^V3|G^0(RlzraTXVU`t*52WCv zTW5XQYGUym2w8QWh?&n5Q1|md<9?5cT~1$8^eV$i`CiraQxH7@f-@C1lRyXfRVZBJ zj3cU z>HL$^C)yPC76vK^SOD|iQxIh4PXYdu260FWG&Gqxo==pFalrRE4FDK zUCAS6n*sm|0?goS?zN4Y&v7q|^00005 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index c1aff4f4232125fed5e39ca6d5363710c5017b92..64766422115a2d87fd11089f24546aba4ab529a9 100644 GIT binary patch delta 5820 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 F{|A;czViS8 literal 3885 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 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 8cb25a2bb..96b5c1cdf 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -5,6 +5,6 @@ #66000000 - @color/default_dark_theme_text_color - @color/default_dark_theme_background_color + @color/theme_dark_text_color + @color/theme_dark_background_color From fda4181117948f3451c853eccb93fcf150b42c7e Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 28 Nov 2017 19:19:41 +0100 Subject: [PATCH 04/28] allow installing the gallery on SD card --- app/src/main/AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 37a01f75e..939db3f5a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,8 @@ + package="com.simplemobiletools.gallery" + android:installLocation="auto"> From 714f1b4458d8ba8cba88d77141deb4f5f5e40151 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 28 Nov 2017 19:19:51 +0100 Subject: [PATCH 05/28] update kotlin to 1.1.61 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 60b648170..1323953cd 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.1.60' + ext.kotlin_version = '1.1.61' repositories { jcenter() From 31a56033983f1e21d3454da12b896260c516417f Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 29 Nov 2017 11:14:08 +0100 Subject: [PATCH 06/28] adding Croatian translation --- app/src/main/res/values-hr/strings.xml | 149 +++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 app/src/main/res/values-hr/strings.xml diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml new file mode 100644 index 000000000..e15f4800d --- /dev/null +++ b/app/src/main/res/values-hr/strings.xml @@ -0,0 +1,149 @@ + + + Simple Gallery + Gallery + Edit + Open camera + (hidden) + Pin folder + Unpin folder + Show all folders content + All folders + Switch to folder view + Other folder + Show on map + Unknown location + No application with maps has been found + No Camera app has been found + Increase column count + Reduce column count + Change cover image + Select photo + Use default + Volume + Brightness + Do not ask again in this session + Lock orientation + Unlock orientation + + + Filter media + Images + Videos + GIFs + No media files have been found with the selected filters. + Change filters + + + This function hides the folder by adding a \'.nomedia\' file into it, it will hide all subfolders too. You can see them by toggling the \'Show hidden folders\' option in Settings. Continue? + Exclude + Excluded folders + Manage excluded folders + This will exclude the selection together with its subfolders from Simple Gallery only. You can manage excluded folders in Settings. + Exclude a parent instead? + Excluding folders will make them together with their subfolders hidden just in Simple Gallery, they will still be visible in other applications.\n\nIf you want to hide them from other apps too, use the Hide function. + Remove all + Remove all folders from the list of excluded? This will not delete the folders. + + + Included folders + Manage included folders + Add folder + If you have some folders which contain media, but were not recognized by the app, you can add them manually here.\n\nAdding some items here will not exclude any other folder. + + + Resize + Resize selection and save + Width + Height + Keep aspect ratio + Please enter a valid resolution + + + Editor + Save + Rotate + Path + Invalid image path + Image editing failed + Edit image with: + No image editor found + Unknown file location + Could not overwrite the source file + Rotate left + Rotate right + Rotate by 180º + Flip + Flip horizontally + Flip vertically + Edit with + + + Simple Wallpaper + Set as Wallpaper + Setting as Wallpaper failed + Set as wallpaper with: + No app capable of it has been found + Setting wallpaper… + Wallpaper set successfully + Portrait aspect ratio + Landscape aspect ratio + + + Slideshow + Interval (seconds): + Include photos + Include videos + Include GIFs + Random order + Use fade animations + Move backwards + Loop slideshow + The slideshow ended + No media for the slideshow have been found + + + Change view type + Grid + List + + + Show hidden media + Play videos automatically + Toggle filename visibility + Loop videos + Animate GIFs at thumbnails + Max brightness when viewing media + Crop thumbnails into squares + Rotate fullscreen media by + System setting + Device rotation + Aspect ratio + Dark background at fullscreen media + Scroll thumbnails horizontally + Automatically hide system UI at fullscreen media + Delete empty folders after deleting their content + Allow controlling video volume and brightness with vertical gestures + Show folder media count on the main view + Replace Share with Rotate at fullscreen menu + Show extended details over fullscreen media + Manage extended details + + + + A gallery for viewing photos and videos without ads. + + A simple tool usable for viewing photos and videos. Items can be sorted by date, size, name both ascending or descending, photos can be zoomed in. Media files are shown in multiple columns depending on the size of the display, you can change the column count by pinch gestures. They can be renamed, shared, deleted, copied, moved. Images can also be cropped, rotated, flipped or set as Wallpaper directly from the app. + + The Gallery is also offered for third party usage for previewing images / videos, adding attachments at email clients etc. It\'s perfect for everyday usage. + + Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors. + + This app is just one piece of a bigger series of apps. You can find the rest of them at http://www.simplemobiletools.com + + + + From 9ef6e159ccf23a2003906b5f37ed6e8e2db04ec6 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 29 Nov 2017 17:09:08 +0100 Subject: [PATCH 07/28] adding Croatian translation --- app/src/main/res/values-hr/strings.xml | 228 ++++++++++++------------- 1 file changed, 114 insertions(+), 114 deletions(-) diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index e15f4800d..7ab987bca 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -1,145 +1,145 @@ Simple Gallery - Gallery - Edit - Open camera - (hidden) - Pin folder - Unpin folder - Show all folders content - All folders - Switch to folder view - Other folder - Show on map - Unknown location - No application with maps has been found - No Camera app has been found - Increase column count - Reduce column count - Change cover image - Select photo - Use default - Volume - Brightness - Do not ask again in this session - Lock orientation - Unlock orientation + Galerija + Uredi + Otvori kameru + (skriveno) + Prikači direktorij + Otkači direktorij + Prikaži cijeli sadržaj direktorija + Svi direktoriji + Prebaci se na pogled direktorija + Ostali direktoriji + Prikaži na karti + Nepoznata lokacija + Nije pronađena aplikacija za kartame + Nije pronađena aplikacija za kameru + Povećaj broj stupaca + Smanji broj stupaca + Promjeni naslovnu sliku + Odaberi sliku + Koristi zadano + Glasnoća + Svjetlina + Ne pitaj me više u ovoj sesiji + Zaključaj orijentaciju + Otključaj orijentaciju - Filter media - Images - Videos - GIFs - No media files have been found with the selected filters. - Change filters + Filtriraj slike i videe + Slike + Videi + GIFovi + Nije pronađena nijedna datoteka s odabranim filterom. + Promjeni filter - This function hides the folder by adding a \'.nomedia\' file into it, it will hide all subfolders too. You can see them by toggling the \'Show hidden folders\' option in Settings. Continue? - Exclude - Excluded folders - Manage excluded folders - This will exclude the selection together with its subfolders from Simple Gallery only. You can manage excluded folders in Settings. - Exclude a parent instead? - Excluding folders will make them together with their subfolders hidden just in Simple Gallery, they will still be visible in other applications.\n\nIf you want to hide them from other apps too, use the Hide function. - Remove all - Remove all folders from the list of excluded? This will not delete the folders. + Ova funkcija skriva direktorij dodavajući \'.nomedia\' datoteku u njega. Također će sakriti i sve poddirektorije. Možete ih vidjeti uključivanjem opcije \'Show hidden folders\' u Postavkama. Nastaviti? + Izostavi + Izostavljeni direktoriji + Upravljaj izostavljenim direktorijima + Ovo će izostaviti izabrano zajedno s poddirektorijima samo iz Simple Gallery aplikacije. Možete upravljati izostavljenim direktorijima u Postavkama. + Izostavi glavni direktorij umjesto? + Izostavljanje direktorija učiniti će ih nevidljivim zajedno s njihovim poddirektorijima samo u Simple Gallery, ali će oni biti vidljivi u drugim aplikacijama.\n\nAko ih želite sakriti od drugih aplikacija također, koristite Sakrij opciju. + Ukloni sve + Ukloni sve direktorije iz liste izostavljenih? Ovo neće izbrisati direktorije. - Included folders - Manage included folders - Add folder - If you have some folders which contain media, but were not recognized by the app, you can add them manually here.\n\nAdding some items here will not exclude any other folder. + Dodaj direktorije + Upravljaj dodanim direktorijima + Dodaj direktorij + Ako postoji direktorij koji sadrži slike i video sadržaj, ali ga aplikacija ne prepoznaje, možete ih ručno dodati ovdje.\n\nDodavanjem nekoliko stavki ovdje, neće se izostaviti niti jedan drugi direktorij. - Resize - Resize selection and save - Width - Height - Keep aspect ratio - Please enter a valid resolution + Promjeni veličinu + Promjeni veličinu odabranog i spremi + Širina + Visina + Zadrži omjer slike + Molimo unesite valjanu rezoluciju - Editor - Save - Rotate - Path - Invalid image path - Image editing failed - Edit image with: - No image editor found - Unknown file location - Could not overwrite the source file - Rotate left - Rotate right - Rotate by 180º - Flip - Flip horizontally - Flip vertically - Edit with + Uređivač + Spremi + Rotiraj + Putanja + Neispravna putanja slike + Neuspješno uređivanje slike + Uredi sliku s: + Nije pronađen uređivač slika + Nepoznata lokacija datoteke + Nije moguće presnimiti izvornu datoteku + Rotiraj lijevo + Rotiraj desno + Rotiraj za 180º + Okreni + Okreni horizontalno + Okreni vertikalno + Uredi s - Simple Wallpaper - Set as Wallpaper - Setting as Wallpaper failed - Set as wallpaper with: - No app capable of it has been found - Setting wallpaper… - Wallpaper set successfully - Portrait aspect ratio - Landscape aspect ratio + Jednostavna pozadina + Postavi kao pozadinu + Neuspješno postavljanje pozadine + Postavi kao pozadinu s: + Nije pronađena aplikacija s ovim mogućnostima + Postavljanje pozadine… + Uspješno postavljanje pozadine + Portretni omjer slike + Pejzažni omjer slike - Slideshow - Interval (seconds): - Include photos - Include videos - Include GIFs - Random order - Use fade animations - Move backwards - Loop slideshow - The slideshow ended - No media for the slideshow have been found + Dijaprojekcija + Interval (sekunde): + Dodaj slike + Dodaj videe + Dodaj GIFove + Nasumični redoslijed + Koristi animaciju izbljeđivanja + Pomakni unatrag + Prikaži dijaprojekciju kao petlju + Kraj dijaprojekcije + Nema datoteka za dijaprojekciju - Change view type - Grid - List + Promjeni način pregleda + Rešetka + Lista - Show hidden media - Play videos automatically - Toggle filename visibility - Loop videos - Animate GIFs at thumbnails - Max brightness when viewing media - Crop thumbnails into squares - Rotate fullscreen media by - System setting - Device rotation - Aspect ratio - Dark background at fullscreen media - Scroll thumbnails horizontally - Automatically hide system UI at fullscreen media - Delete empty folders after deleting their content - Allow controlling video volume and brightness with vertical gestures - Show folder media count on the main view - Replace Share with Rotate at fullscreen menu - Show extended details over fullscreen media - Manage extended details + Prikaži skrivene datoteke + Automatsko pokretanje videa + Uključi prikaz naziva datoteka + Ponavljanje videa + Prikaz animacije GIFova na sličicama + Maksimalna svjetlina pri pregledu datoteka + Izreži sličice u kvadrate + Rotiraj datoteku u punom zaslonu za + Postavke sustava + Rotacija uređaja + Omjer slike + Crna pozadina pri pregledu datoteka + Listaj sličice horizontalno + Automatski sakrij UI sustava pri pregledu datoteka + Izbriži prazne direktorije nakon brisanja njihovog sadržaja + Omogući kontrolu glasnoće videa i svjetline pomoću vertikalnih gesti + Prikaži broj datoteka u direktoriju na glavnom zaslonu + Zamjeni Dijeli s Rotiraj pri pregledu datoteka + Prikaži detaljne informacije pri pregledu datoteka + Upravljaj detaljnim informacijama - A gallery for viewing photos and videos without ads. + Galerija za pregledavanje slika, GIFova i videa bez reklama. - A simple tool usable for viewing photos and videos. Items can be sorted by date, size, name both ascending or descending, photos can be zoomed in. Media files are shown in multiple columns depending on the size of the display, you can change the column count by pinch gestures. They can be renamed, shared, deleted, copied, moved. Images can also be cropped, rotated, flipped or set as Wallpaper directly from the app. + Jednostavan alat za pregled slika, GIFova i videa. Datoteke možete sortirati po datumu, veličini, imenu i to uzlazno i silazno. Također možete zumirati slike. Medijski sadržaj se prikazuje u višestrukim stupcima ovisno o veličini ekrana, a vi samo možete birati broj stupaca s gestom štipkanja. Možete preimenovati, dijeliti, brisati, kopirati, premještati datoteke. Slike također možete izrezati, rotirati ili postaviki kao pozadinu ekrana, odmah iz aplikacije. - The Gallery is also offered for third party usage for previewing images / videos, adding attachments at email clients etc. It\'s perfect for everyday usage. + Galerija se također može koristiti za pregledavanje slika i videa u drugim aplikacijama, prikačivanja datoteka u e-mail aplikacije itd. Savršeno za svakodnevno korištenje. - Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors. + Ne sadrži reklame niti nepotrebna dopuštenja. Aplikacije je otvorenog koda, te pruža mogućnost promjene boja. - This app is just one piece of a bigger series of apps. You can find the rest of them at http://www.simplemobiletools.com + Ova aplikacija je samo dio veće skupine aplikacije. Ostatak možete pronaći na http://www.simplemobiletools.com 篩選媒體檔案 @@ -92,20 +92,20 @@ 投影片 間隔 (秒): - Include photos + 包含照片 包含影片 - Include GIFs + 包含GIF 隨機順序 使用淡入淡出動畫 反向播放 - Loop slideshow + 投影片循環 投影片結束 找不到投影片的媒體檔案 - Change view type - Grid - List + 改變瀏覽類型 + 格狀 + 列表 顯示隱藏的媒體檔案 @@ -124,10 +124,10 @@ 全螢幕時自動隱藏系統介面 刪除內容後刪除空白資料夾 允許用上下手勢來控制影片的音量和亮度 - Show folder media count on the main view + 主畫面顯示資料夾內媒體檔案數量 將全螢幕選單的分享取代為旋轉 - Show extended details over fullscreen media - Manage extended details + 全螢幕時顯示詳細資訊 + 管理詳細資訊 From 7f596a39934884b22bf553b114423e1013560d26 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 30 Nov 2017 10:08:16 +0100 Subject: [PATCH 11/28] fix #480, make sure drag selection is always available --- .../gallery/activities/MainActivity.kt | 43 +++++++++++-------- .../gallery/activities/MediaActivity.kt | 42 ++++++++++-------- 2 files changed, 51 insertions(+), 34 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 232e2835a..a3883847d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -342,11 +342,6 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { } else { setupListLayoutManager() } - - getDirectoryAdapter()?.apply { - setupZoomListener(mZoomListener) - setupDragListener(true) - } } private fun setupGridLayoutManager() { @@ -360,20 +355,28 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { } layoutManager.spanCount = config.dirColumnCnt - mZoomListener = object : MyRecyclerView.MyZoomListener { - override fun zoomIn() { - if (layoutManager.spanCount > 1) { - reduceColumnCount() - getRecyclerAdapter().finishActMode() - } - } + } - override fun zoomOut() { - if (layoutManager.spanCount < MAX_COLUMN_COUNT) { - increaseColumnCount() - getRecyclerAdapter().finishActMode() + private fun initZoomListener() { + if (config.viewTypeFolders == VIEW_TYPE_GRID) { + val layoutManager = directories_grid.layoutManager as GridLayoutManager + mZoomListener = object : MyRecyclerView.MyZoomListener { + override fun zoomIn() { + if (layoutManager.spanCount > 1) { + reduceColumnCount() + getRecyclerAdapter().finishActMode() + } + } + + override fun zoomOut() { + if (layoutManager.spanCount < MAX_COLUMN_COUNT) { + increaseColumnCount() + getRecyclerAdapter().finishActMode() + } } } + } else { + mZoomListener = null } } @@ -554,12 +557,18 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { private fun setupAdapter() { val currAdapter = directories_grid.adapter if (currAdapter == null) { - directories_grid.adapter = DirectoryAdapter(this, mDirs, this, directories_grid, isPickIntent(intent) || isGetAnyContentIntent(intent)) { + initZoomListener() + DirectoryAdapter(this, mDirs, this, directories_grid, isPickIntent(intent) || isGetAnyContentIntent(intent)) { itemClicked((it as Directory).path) + }.apply { + setupZoomListener(mZoomListener) + setupDragListener(true) + directories_grid.adapter = this } } else { (currAdapter as DirectoryAdapter).updateDirs(mDirs) } + setupScrollDirection() } 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 d4fdd4955..0b5622186 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MediaActivity.kt @@ -176,8 +176,13 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { val currAdapter = media_grid.adapter if (currAdapter == null) { - media_grid.adapter = MediaAdapter(this, mMedia, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent, mAllowPickingMultiple, media_grid) { + initZoomListener() + MediaAdapter(this, mMedia, this, mIsGetImageIntent || mIsGetVideoIntent || mIsGetAnyIntent, mAllowPickingMultiple, media_grid) { itemClicked((it as Medium).path) + }.apply { + setupZoomListener(mZoomListener) + setupDragListener(true) + media_grid.adapter = this } } else { (currAdapter as MediaAdapter).updateMedia(mMedia) @@ -402,11 +407,6 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { } else { setupListLayoutManager() } - - getMediaAdapter()?.apply { - setupZoomListener(mZoomListener) - setupDragListener(true) - } } private fun setupGridLayoutManager() { @@ -420,20 +420,28 @@ class MediaActivity : SimpleActivity(), MediaAdapter.MediaOperationsListener { } layoutManager.spanCount = config.mediaColumnCnt - mZoomListener = object : MyRecyclerView.MyZoomListener { - override fun zoomIn() { - if (layoutManager.spanCount > 1) { - reduceColumnCount() - getRecyclerAdapter().finishActMode() - } - } + } - override fun zoomOut() { - if (layoutManager.spanCount < MAX_COLUMN_COUNT) { - increaseColumnCount() - getRecyclerAdapter().finishActMode() + private fun initZoomListener() { + if (config.viewTypeFiles == VIEW_TYPE_GRID) { + val layoutManager = media_grid.layoutManager as GridLayoutManager + mZoomListener = object : MyRecyclerView.MyZoomListener { + override fun zoomIn() { + if (layoutManager.spanCount > 1) { + reduceColumnCount() + getRecyclerAdapter().finishActMode() + } + } + + override fun zoomOut() { + if (layoutManager.spanCount < MAX_COLUMN_COUNT) { + increaseColumnCount() + getRecyclerAdapter().finishActMode() + } } } + } else { + mZoomListener = null } } From e7aeb4425601e9cd2bfc360f4b135077a7c442e6 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 30 Nov 2017 10:37:51 +0100 Subject: [PATCH 12/28] small cleanup at the sorting dialog --- .../gallery/dialogs/ChangeSortingDialog.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ChangeSortingDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ChangeSortingDialog.kt index 0af86fd6a..5ea179dad 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ChangeSortingDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ChangeSortingDialog.kt @@ -40,13 +40,13 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, val isDirectorySorti private fun setupSortRadio() { val sortingRadio = view.sorting_dialog_radio_sorting - var sortBtn = sortingRadio.sorting_dialog_radio_name - when { - currSorting and SORT_BY_PATH != 0 -> sortBtn = sortingRadio.sorting_dialog_radio_path - currSorting and SORT_BY_SIZE != 0 -> sortBtn = sortingRadio.sorting_dialog_radio_size - currSorting and SORT_BY_DATE_MODIFIED != 0 -> sortBtn = sortingRadio.sorting_dialog_radio_last_modified - currSorting and SORT_BY_DATE_TAKEN != 0 -> sortBtn = sortingRadio.sorting_dialog_radio_date_taken + val sortBtn = when { + currSorting and SORT_BY_PATH != 0 -> sortingRadio.sorting_dialog_radio_path + currSorting and SORT_BY_SIZE != 0 -> sortingRadio.sorting_dialog_radio_size + currSorting and SORT_BY_DATE_MODIFIED != 0 -> sortingRadio.sorting_dialog_radio_last_modified + currSorting and SORT_BY_DATE_TAKEN != 0 -> sortingRadio.sorting_dialog_radio_date_taken + else -> sortingRadio.sorting_dialog_radio_name } sortBtn.isChecked = true } From df86b5d9ae45be2ab99e86b801df3af7a2d56fe5 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 30 Nov 2017 14:58:27 +0100 Subject: [PATCH 13/28] update commons to 3.0.5 --- app/build.gradle | 2 +- .../gallery/adapters/DirectoryAdapter.kt | 18 +++++++++--------- .../gallery/adapters/ManageFoldersAdapter.kt | 4 ++-- .../gallery/adapters/MediaAdapter.kt | 18 +++++++++--------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 01f498aa8..91b49f6dd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.0.3' + implementation 'com.simplemobiletools:commons:3.0.5' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.8.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.4.0' implementation 'com.android.support:multidex:1.0.2' 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 74a25b4a9..92b09d15d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -57,8 +57,8 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: MutableList + setupView(itemView, dir) } bindViewHolder(holder, position, view) } @@ -93,6 +93,13 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: MutableList) { dirs = newDirs selectableItemCount = dirs.size 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 675490a0c..5d671bc29 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt @@ -43,8 +43,8 @@ class ManageFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList< override fun onBindViewHolder(holder: ViewHolder, position: Int) { val folder = folders[position] - val view = holder.bindView(folder) { - setupView(it, folder) + val view = holder.bindView(folder) { itemView, layoutPosition -> + setupView(itemView, folder) } bindViewHolder(holder, position, view) } 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 c1a4a2c1d..116858a5f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt @@ -57,8 +57,8 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) { val medium = media[position] - val view = holder.bindView(medium, !allowMultiplePicks) { - setupView(it, medium) + val view = holder.bindView(medium, !allowMultiplePicks) { itemView, layoutPosition -> + setupView(itemView, medium) } bindViewHolder(holder, position, view) } @@ -93,6 +93,13 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, } } + override fun onViewRecycled(holder: ViewHolder?) { + super.onViewRecycled(holder) + if (!activity.isActivityDestroyed()) { + Glide.with(activity).clear(holder?.itemView?.medium_thumbnail) + } + } + private fun checkHideBtnVisibility(menu: Menu) { var hiddenCnt = 0 var unhiddenCnt = 0 @@ -234,13 +241,6 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, return selectedMedia } - override fun onViewRecycled(holder: ViewHolder?) { - super.onViewRecycled(holder) - if (!activity.isActivityDestroyed()) { - Glide.with(activity).clear(holder?.itemView?.medium_thumbnail) - } - } - fun updateMedia(newMedia: ArrayList) { media = newMedia selectableItemCount = media.size From b5b3648602ae9585c7b8df4bb7ddb0e91ad35d46 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 30 Nov 2017 16:37:06 +0100 Subject: [PATCH 14/28] use a helper method for refreshing recyclerviews at delete --- app/build.gradle | 2 +- .../gallery/activities/MainActivity.kt | 10 +++--- .../gallery/adapters/DirectoryAdapter.kt | 36 +++++++------------ .../gallery/adapters/ManageFoldersAdapter.kt | 14 +------- .../gallery/adapters/MediaAdapter.kt | 16 ++------- 5 files changed, 22 insertions(+), 56 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 91b49f6dd..93b11d6c2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.0.5' + implementation 'com.simplemobiletools:commons:3.0.6' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.8.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.4.0' implementation 'com.android.support:multidex:1.0.2' 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 a3883847d..1337bf98e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -324,12 +324,10 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { } } - override fun tryDeleteFolders(folders: ArrayList) { - for (file in folders) { - deleteFolders(folders) { - runOnUiThread { - refreshItems() - } + override fun deleteFolders(folders: ArrayList) { + deleteFolders(folders) { + runOnUiThread { + refreshItems() } } } 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 92b09d15d..8a13d5c40 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -1,7 +1,6 @@ package com.simplemobiletools.gallery.adapters import android.graphics.PorterDuff -import android.util.SparseArray import android.view.Menu import android.view.View import android.view.ViewGroup @@ -233,42 +232,33 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: MutableList(selectedPositions.size) val removeFolders = ArrayList(selectedPositions.size) - var needPermissionForPath = "" + var SAFPath = "" selectedPositions.forEach { if (dirs.size > it) { val path = dirs[it].path if (activity.needsStupidWritePermissions(path) && config.treeUri.isEmpty()) { - needPermissionForPath = path + SAFPath = path } } } - activity.handleSAFDialog(File(needPermissionForPath)) { + activity.handleSAFDialog(File(SAFPath)) { selectedPositions.sortedDescending().forEach { - if (dirs.size > it) { - val directory = dirs[it] - folders.add(File(directory.path)) - removeFolders.add(directory) - notifyItemRemoved(it) - itemViews.put(it, null) - } + val directory = dirs[it] + folders.add(File(directory.path)) + removeFolders.add(directory) } dirs.removeAll(removeFolders) - selectedPositions.clear() - listener?.tryDeleteFolders(folders) - - val newItems = SparseArray() - (0 until itemViews.size()) - .filter { itemViews[it] != null } - .forEachIndexed { curIndex, i -> newItems.put(curIndex, itemViews[i]) } - - itemViews = newItems - selectableItemCount = dirs.size - finishActMode() + listener?.deleteFolders(folders) + removeSelectedItems() } } @@ -363,7 +353,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: MutableList) + fun deleteFolders(folders: ArrayList) fun recheckPinnedFolders() } 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 5d671bc29..98c2cb4a5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt @@ -1,6 +1,5 @@ package com.simplemobiletools.gallery.adapters -import android.util.SparseArray import android.view.Menu import android.view.View import android.view.ViewGroup @@ -72,8 +71,6 @@ class ManageFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList< selectedPositions.sortedDescending().forEach { val folder = folders[it] removeFolders.add(folder) - notifyItemRemoved(it) - itemViews.put(it, null) if (isShowingExcludedFolders) { config.removeExcludedFolder(folder) } else { @@ -82,16 +79,7 @@ class ManageFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList< } folders.removeAll(removeFolders) - selectedPositions.clear() - - val newItems = SparseArray() - (0 until itemViews.size()) - .filter { itemViews[it] != null } - .forEachIndexed { curIndex, i -> newItems.put(curIndex, itemViews[i]) } - - itemViews = newItems - selectableItemCount = folders.size - finishActMode() + removeSelectedItems() if (folders.isEmpty()) { listener?.refreshItems() } 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 116858a5f..4ea65d63a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt @@ -2,7 +2,6 @@ package com.simplemobiletools.gallery.adapters import android.graphics.PorterDuff import android.net.Uri -import android.util.SparseArray import android.view.Menu import android.view.View import android.view.ViewGroup @@ -212,26 +211,17 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, return } - activity.handleSAFDialog(File(media[selectedPositions.first()].path)) { + val SAFPath = media[selectedPositions.first()].path + activity.handleSAFDialog(File(SAFPath)) { selectedPositions.sortedDescending().forEach { val medium = media[it] files.add(File(medium.path)) removeMedia.add(medium) - notifyItemRemoved(it) - itemViews.put(it, null) } media.removeAll(removeMedia) listener?.deleteFiles(files) - - val newItems = SparseArray() - (0 until itemViews.size()) - .filter { itemViews[it] != null } - .forEachIndexed { curIndex, i -> newItems.put(curIndex, itemViews[i]) } - - itemViews = newItems - selectableItemCount = media.size - finishActMode() + removeSelectedItems() } } From d595c590f0a4add7fa1fe0106eaff1de53d951f3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 30 Nov 2017 18:26:04 +0100 Subject: [PATCH 15/28] update commons to 3.0.9 --- app/build.gradle | 2 +- .../simplemobiletools/gallery/adapters/DirectoryAdapter.kt | 7 ++----- .../gallery/adapters/ManageFoldersAdapter.kt | 6 ++---- .../com/simplemobiletools/gallery/adapters/MediaAdapter.kt | 7 ++----- 4 files changed, 7 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 93b11d6c2..fbad76fa5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.0.6' + implementation 'com.simplemobiletools:commons:3.0.9' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.8.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.4.0' implementation 'com.android.support:multidex:1.0.2' 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 8a13d5c40..86e9a54bc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -35,10 +35,6 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: MutableList) { dirs = newDirs - selectableItemCount = dirs.size notifyDataSetChanged() finishActMode() } 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 98c2cb4a5..73818a600 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/ManageFoldersAdapter.kt @@ -18,10 +18,6 @@ class ManageFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList< private val config = activity.config - init { - selectableItemCount = folders.size - } - override fun getActionMenuId() = R.menu.cab_delete_only override fun prepareActionMode(menu: Menu) {} @@ -38,6 +34,8 @@ class ManageFoldersAdapter(activity: BaseSimpleActivity, var folders: ArrayList< } } + override fun getSelectableItemCount() = folders.size + override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int) = createViewHolder(R.layout.item_manage_folder, parent) override fun onBindViewHolder(holder: ViewHolder, position: 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 4ea65d63a..58a76c181 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MediaAdapter.kt @@ -35,10 +35,6 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, private var cropThumbnails = config.cropThumbnails private var displayFilenames = config.displayFileNames - init { - selectableItemCount = media.count() - } - override fun getActionMenuId() = R.menu.cab_media override fun prepareItemSelection(view: View) { @@ -92,6 +88,8 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, } } + override fun getSelectableItemCount() = media.size + override fun onViewRecycled(holder: ViewHolder?) { super.onViewRecycled(holder) if (!activity.isActivityDestroyed()) { @@ -233,7 +231,6 @@ class MediaAdapter(activity: BaseSimpleActivity, var media: MutableList, fun updateMedia(newMedia: ArrayList) { media = newMedia - selectableItemCount = media.size notifyDataSetChanged() finishActMode() } From 48e78f529ecb4d8400bdfb807e6a95caa8f7829c Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 30 Nov 2017 18:34:12 +0100 Subject: [PATCH 16/28] rename mFragments to fragments at the pager adapter --- .../gallery/adapters/MyPagerAdapter.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MyPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MyPagerAdapter.kt index 69c389d9e..0f5d7fee3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MyPagerAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/MyPagerAdapter.kt @@ -14,7 +14,7 @@ import com.simplemobiletools.gallery.helpers.MEDIUM import com.simplemobiletools.gallery.models.Medium class MyPagerAdapter(val activity: ViewPagerActivity, fm: FragmentManager, val media: MutableList) : FragmentStatePagerAdapter(fm) { - private val mFragments = HashMap() + private val fragments = HashMap() override fun getCount() = media.size override fun getItem(position: Int): Fragment { @@ -38,19 +38,19 @@ class MyPagerAdapter(val activity: ViewPagerActivity, fm: FragmentManager, val m override fun instantiateItem(container: ViewGroup, position: Int): Any { val fragment = super.instantiateItem(container, position) as ViewPagerFragment - mFragments.put(position, fragment) + fragments.put(position, fragment) return fragment } override fun destroyItem(container: ViewGroup, position: Int, any: Any) { - mFragments.remove(position) + fragments.remove(position) super.destroyItem(container, position, any) } - fun getCurrentFragment(position: Int) = mFragments.get(position) + fun getCurrentFragment(position: Int) = fragments.get(position) fun toggleFullscreen(isFullscreen: Boolean) { - for ((pos, fragment) in mFragments) { + for ((pos, fragment) in fragments) { fragment.fullscreenToggled(isFullscreen) } } From 60a9acdebdc40cadb8df6e3459d5bb686cc9ad58 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 30 Nov 2017 18:40:36 +0100 Subject: [PATCH 17/28] remove the Vibrate permission --- app/src/main/AndroidManifest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 939db3f5a..b550c3128 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,6 @@ - Date: Thu, 30 Nov 2017 19:38:07 +0100 Subject: [PATCH 18/28] update commons to 3.0.12 --- app/build.gradle | 2 +- app/src/main/kotlin/com/simplemobiletools/gallery/App.kt | 9 ++------- .../simplemobiletools/gallery/activities/MainActivity.kt | 2 +- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index fbad76fa5..a08b9bb68 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.0.9' + implementation 'com.simplemobiletools:commons:3.0.12' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.8.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.4.0' implementation 'com.android.support:multidex:1.0.2' diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/App.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/App.kt index 361504972..2099d83cc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/App.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/App.kt @@ -2,10 +2,9 @@ package com.simplemobiletools.gallery import android.support.multidex.MultiDexApplication import com.github.ajalt.reprint.core.Reprint +import com.simplemobiletools.commons.extensions.checkUseEnglish import com.simplemobiletools.gallery.BuildConfig.USE_LEAK_CANARY -import com.simplemobiletools.gallery.extensions.config import com.squareup.leakcanary.LeakCanary -import java.util.* class App : MultiDexApplication() { override fun onCreate() { @@ -17,11 +16,7 @@ class App : MultiDexApplication() { LeakCanary.install(this) } - if (config.useEnglish) { - val conf = resources.configuration - conf.locale = Locale.ENGLISH - resources.updateConfiguration(conf, resources.displayMetrics) - } + checkUseEnglish() Reprint.initialize(this) } } 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 1337bf98e..2cfd99759 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -68,7 +68,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - storeStoragePaths() + appLaunched() mIsPickImageIntent = isPickImageIntent(intent) mIsPickVideoIntent = isPickVideoIntent(intent) From 6a5f53c5368faf13504f6ad5770a92f4da4e823f Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 30 Nov 2017 20:56:33 +0100 Subject: [PATCH 19/28] update commons to 3.0.13 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a08b9bb68..dc94e81e3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.0.12' + implementation 'com.simplemobiletools:commons:3.0.13' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.8.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.4.0' implementation 'com.android.support:multidex:1.0.2' From c75cc9d3a0db1239c687dc47439c3b51b28526ab Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 30 Nov 2017 23:24:17 +0100 Subject: [PATCH 20/28] hide the Check selection indicator by default --- app/src/main/res/layout/photo_video_item_grid.xml | 3 ++- app/src/main/res/layout/photo_video_item_list.xml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/photo_video_item_grid.xml b/app/src/main/res/layout/photo_video_item_grid.xml index 4ec84403d..ef873d244 100644 --- a/app/src/main/res/layout/photo_video_item_grid.xml +++ b/app/src/main/res/layout/photo_video_item_grid.xml @@ -23,7 +23,8 @@ android:layout_margin="@dimen/small_margin" android:background="@drawable/circle_background" android:padding="@dimen/tiny_margin" - android:src="@drawable/ic_check"/> + android:src="@drawable/ic_check" + android:visibility="gone"/> + android:src="@drawable/ic_check" + android:visibility="gone"/> Date: Thu, 30 Nov 2017 23:45:01 +0100 Subject: [PATCH 21/28] fix #478, make sure photos are visible after unhiding --- .../com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt | 1 + 1 file changed, 1 insertion(+) 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 86e9a54bc..dbd4cd7de 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/adapters/DirectoryAdapter.kt @@ -167,6 +167,7 @@ class DirectoryAdapter(activity: BaseSimpleActivity, var dirs: MutableList Date: Thu, 30 Nov 2017 23:51:56 +0100 Subject: [PATCH 22/28] fix #454, share multiple items properly, as images --- .../kotlin/com/simplemobiletools/gallery/extensions/activity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/activity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/activity.kt index 9910aa225..08b204cce 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/extensions/activity.kt @@ -43,7 +43,7 @@ fun Activity.shareMedium(medium: Medium) { } fun Activity.shareMedia(media: List) { - val uris = media.map { getFilePublicUri(File(it.path), BuildConfig.APPLICATION_ID) } as ArrayList + val uris = media.map { Uri.fromFile(File(it.path)) } as ArrayList shareUris(uris) } From 84fee84349b90d3b56c163417de0780dbb79f3f7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 1 Dec 2017 10:04:57 +0100 Subject: [PATCH 23/28] lets provide Subsampling our own orientation --- .../com/simplemobiletools/gallery/fragments/PhotoFragment.kt | 5 ++++- 1 file changed, 4 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 bffd0b422..599b17d3a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/PhotoFragment.kt @@ -224,12 +224,15 @@ class PhotoFragment : ViewPagerFragment() { private fun addZoomableView() { if ((medium.isImage()) && isFragmentVisible && view.subsampling_view.isGone()) { + val exif = android.media.ExifInterface(medium.path) + val orientation = exif.getAttributeInt(android.media.ExifInterface.TAG_ORIENTATION, android.media.ExifInterface.ORIENTATION_NORMAL) + ViewPagerActivity.wasDecodedByGlide = false view.subsampling_view.apply { maxScale = 10f beVisible() setImage(ImageSource.uri(medium.path)) - orientation = SubsamplingScaleImageView.ORIENTATION_USE_EXIF + this.orientation = degreesForRotation(orientation) setOnImageEventListener(object : SubsamplingScaleImageView.OnImageEventListener { override fun onImageLoaded() { } From 9fbbd902e8e09fd17c98ba39c6e175ee2e2edbfb Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 1 Dec 2017 11:04:26 +0100 Subject: [PATCH 24/28] update Commons with some dialog crashfixes --- app/build.gradle | 2 +- .../gallery/activities/MainActivity.kt | 2 +- .../dialogs/DeleteWithRememberDialog.kt | 13 +++-- .../gallery/dialogs/ResizeDialog.kt | 25 +++++----- .../gallery/dialogs/SaveAsDialog.kt | 49 ++++++++++--------- .../gallery/dialogs/SlideshowDialog.kt | 21 ++++---- .../gallery/fragments/VideoFragment.kt | 4 +- 7 files changed, 59 insertions(+), 57 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index dc94e81e3..4c0b8b22a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.0.13' + implementation 'com.simplemobiletools:commons:3.0.16' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.8.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.4.0' implementation 'com.android.support:multidex:1.0.2' 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 2cfd99759..b8d3cfc77 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/MainActivity.kt @@ -81,7 +81,7 @@ class MainActivity : SimpleActivity(), DirectoryAdapter.DirOperationsListener { mIsGetAnyContentIntent || mIsSetWallpaperIntent removeTempFolder() - directories_refresh_layout.setOnRefreshListener({ getDirectories() }) + directories_refresh_layout.setOnRefreshListener { getDirectories() } mDirs = ArrayList() storeStateVariables() checkWhatsNewDialog() diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/DeleteWithRememberDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/DeleteWithRememberDialog.kt index 05a240577..b506b894f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/DeleteWithRememberDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/DeleteWithRememberDialog.kt @@ -1,23 +1,22 @@ package com.simplemobiletools.gallery.dialogs -import android.content.Context +import android.app.Activity import android.support.v7.app.AlertDialog -import android.view.LayoutInflater import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.gallery.R import kotlinx.android.synthetic.main.dialog_delete_with_remember.view.* -class DeleteWithRememberDialog(val context: Context, val callback: (remember: Boolean) -> Unit) { - var dialog: AlertDialog - val view = LayoutInflater.from(context).inflate(R.layout.dialog_delete_with_remember, null) +class DeleteWithRememberDialog(val activity: Activity, val callback: (remember: Boolean) -> Unit) { + private var dialog: AlertDialog + val view = activity.layoutInflater.inflate(R.layout.dialog_delete_with_remember, null)!! init { - val builder = AlertDialog.Builder(context) + val builder = AlertDialog.Builder(activity) .setPositiveButton(R.string.yes, { dialog, which -> dialogConfirmed() }) .setNegativeButton(R.string.no, null) dialog = builder.create().apply { - context.setupDialogStuff(view, this) + activity.setupDialogStuff(view, this) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ResizeDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ResizeDialog.kt index cc2e9432f..7486849d6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ResizeDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/ResizeDialog.kt @@ -74,19 +74,20 @@ class ResizeDialog(val activity: BaseSimpleActivity, val size: Point, val callba .setNegativeButton(R.string.cancel, null) .create().apply { window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) - activity.setupDialogStuff(view, this, R.string.resize_and_save) - getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener({ - val width = getViewValue(widthView) - val height = getViewValue(heightView) - if (width <= 0 || height <= 0) { - activity.toast(R.string.invalid_values) - return@setOnClickListener - } + activity.setupDialogStuff(view, this, R.string.resize_and_save) { + getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + val width = getViewValue(widthView) + val height = getViewValue(heightView) + if (width <= 0 || height <= 0) { + activity.toast(R.string.invalid_values) + return@setOnClickListener + } - val newSize = Point(getViewValue(widthView), getViewValue(heightView)) - callback(newSize) - dismiss() - }) + val newSize = Point(getViewValue(widthView), getViewValue(heightView)) + callback(newSize) + dismiss() + } + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/SaveAsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/SaveAsDialog.kt index 4a401e289..8bd25c1ea 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/SaveAsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/SaveAsDialog.kt @@ -46,38 +46,39 @@ class SaveAsDialog(val activity: BaseSimpleActivity, val path: String, val appen .setNegativeButton(R.string.cancel, null) .create().apply { window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) - activity.setupDialogStuff(view, this, R.string.save_as) - getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener({ - val filename = view.save_as_name.value - val extension = view.save_as_extension.value + activity.setupDialogStuff(view, this, R.string.save_as) { + getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + val filename = view.save_as_name.value + val extension = view.save_as_extension.value - if (filename.isEmpty()) { - activity.toast(R.string.filename_cannot_be_empty) - return@setOnClickListener - } + if (filename.isEmpty()) { + activity.toast(R.string.filename_cannot_be_empty) + return@setOnClickListener + } - if (extension.isEmpty()) { - activity.toast(R.string.extension_cannot_be_empty) - return@setOnClickListener - } + if (extension.isEmpty()) { + activity.toast(R.string.extension_cannot_be_empty) + return@setOnClickListener + } - val newFile = File(realPath, "$filename.$extension") - if (!newFile.name.isAValidFilename()) { - activity.toast(R.string.filename_invalid_characters) - return@setOnClickListener - } + val newFile = File(realPath, "$filename.$extension") + if (!newFile.name.isAValidFilename()) { + activity.toast(R.string.filename_invalid_characters) + return@setOnClickListener + } - if (newFile.exists()) { - val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newFile.name) - ConfirmationDialog(activity, title) { + if (newFile.exists()) { + val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newFile.name) + ConfirmationDialog(activity, title) { + callback(newFile.absolutePath) + dismiss() + } + } else { callback(newFile.absolutePath) dismiss() } - } else { - callback(newFile.absolutePath) - dismiss() } - }) + } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/SlideshowDialog.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/SlideshowDialog.kt index e9dc60b49..5eda40879 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/SlideshowDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/dialogs/SlideshowDialog.kt @@ -73,17 +73,18 @@ class SlideshowDialog(val activity: BaseSimpleActivity, val callback: () -> Unit .setNegativeButton(R.string.cancel, null) .create().apply { window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) - activity.setupDialogStuff(view, this) - getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener({ - if (!view.include_photos.isChecked && !view.include_videos.isChecked && !view.include_gifs.isChecked) { - activity.toast(R.string.no_media_for_slideshow) - return@setOnClickListener - } + activity.setupDialogStuff(view, this) { + getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + if (!view.include_photos.isChecked && !view.include_videos.isChecked && !view.include_gifs.isChecked) { + activity.toast(R.string.no_media_for_slideshow) + return@setOnClickListener + } - storeValues() - callback() - dismiss() - }) + storeValues() + callback() + dismiss() + } + } } } 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 f4b7f4b67..e6b0831d5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/fragments/VideoFragment.kt @@ -119,7 +119,7 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee mSurfaceView = mView.video_surface mSurfaceHolder = mSurfaceView!!.holder mSurfaceHolder!!.addCallback(this) - mSurfaceView!!.setOnClickListener({ toggleFullscreen() }) + mSurfaceView!!.setOnClickListener { toggleFullscreen() } mView.video_holder.setOnClickListener { toggleFullscreen() } mView.video_volume_controller.setOnTouchListener { v, event -> handleVolumeTouched(event) @@ -423,7 +423,7 @@ class VideoFragment : ViewPagerFragment(), SurfaceHolder.Callback, SeekBar.OnSee setDataSource(context, Uri.parse(mediumPath)) setDisplay(mSurfaceHolder) setOnCompletionListener { videoCompleted() } - setOnVideoSizeChangedListener({ mediaPlayer, width, height -> setVideoSize() }) + setOnVideoSizeChangedListener { mediaPlayer, width, height -> setVideoSize() } setOnPreparedListener { videoPrepared(it) } setAudioStreamType(AudioManager.STREAM_MUSIC) prepare() From e04c4da1d631b211222b8044e96a16971ada3e66 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 1 Dec 2017 11:37:48 +0100 Subject: [PATCH 25/28] set translucent navigation bar programmatically where appropriate --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 12 ++++-------- .../gallery/activities/PhotoVideoActivity.kt | 2 ++ .../gallery/activities/ViewPagerActivity.kt | 1 + app/src/main/res/values-v21/styles.xml | 7 ------- app/src/main/res/values/styles.xml | 12 ------------ 6 files changed, 8 insertions(+), 28 deletions(-) delete mode 100644 app/src/main/res/values-v21/styles.xml diff --git a/app/build.gradle b/app/build.gradle index 4c0b8b22a..ce8bb2bd8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.0.16' + implementation 'com.simplemobiletools:commons:3.0.17' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.8.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.4.0' implementation 'com.android.support:multidex:1.0.2' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b550c3128..a6e97ccb7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -60,8 +60,7 @@ + android:parentActivityName=".activities.MediaActivity"> @@ -96,8 +95,7 @@ + android:configChanges="orientation|keyboardHidden|screenSize"/> + android:configChanges="orientation|keyboardHidden|screenSize"> @@ -125,8 +122,7 @@ + android:configChanges="orientation|keyboardHidden|screenSize"> 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 e92593e3b..4711f1c62 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/PhotoVideoActivity.kt @@ -40,6 +40,8 @@ open class PhotoVideoActivity : SimpleActivity(), ViewPagerFragment.FragmentList public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.fragment_holder) + setTranslucentNavigation() + handlePermission(PERMISSION_WRITE_STORAGE) { if (it) { checkIntent(savedInstanceState) 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 d0c9b7a61..47b0f6e53 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/activities/ViewPagerActivity.kt @@ -80,6 +80,7 @@ class ViewPagerActivity : SimpleActivity(), ViewPager.OnPageChangeListener, View override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_medium) + setTranslucentNavigation() handlePermission(PERMISSION_WRITE_STORAGE) { if (it) { diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml deleted file mode 100644 index 78a798255..000000000 --- a/app/src/main/res/values-v21/styles.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 54db9f7d0..0be50415b 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -2,16 +2,4 @@ - - - From 3a278c8c76ea6175edba039be61e3ddb95b7fbbe Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 1 Dec 2017 14:14:31 +0100 Subject: [PATCH 26/28] update commons to 3.0.20 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index ce8bb2bd8..6c2af3e29 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.0.17' + implementation 'com.simplemobiletools:commons:3.0.20' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.8.0' implementation 'com.theartofdev.edmodo:android-image-cropper:2.4.0' implementation 'com.android.support:multidex:1.0.2' From 3a917a44e909a4f08e146b189d16e5e8ea7cdec4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 1 Dec 2017 21:54:33 +0100 Subject: [PATCH 27/28] move the ic_launcher_foreground in drawable-v26 --- .../ic_launcher_foreground.png | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/main/res/{drawable-v24 => drawable-v26}/ic_launcher_foreground.png (100%) diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.png b/app/src/main/res/drawable-v26/ic_launcher_foreground.png similarity index 100% rename from app/src/main/res/drawable-v24/ic_launcher_foreground.png rename to app/src/main/res/drawable-v26/ic_launcher_foreground.png From 782216b7d5284f17d479b84deb4a5a446b1c77f6 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 1 Dec 2017 22:21:53 +0100 Subject: [PATCH 28/28] use an svg as adaptive icon foreground --- .../drawable-v26/ic_launcher_foreground.png | Bin 2304 -> 0 bytes .../drawable-v26/ic_launcher_foreground.xml | 15 ++++++++++++ .../res/mipmap-anydpi-v21/ic_launcher.xml | 23 ++++++++++++++---- .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 ---- 4 files changed, 33 insertions(+), 10 deletions(-) delete mode 100644 app/src/main/res/drawable-v26/ic_launcher_foreground.png create mode 100644 app/src/main/res/drawable-v26/ic_launcher_foreground.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/app/src/main/res/drawable-v26/ic_launcher_foreground.png b/app/src/main/res/drawable-v26/ic_launcher_foreground.png deleted file mode 100644 index 24b7f2986dcc07995d09f09e72083440da827ca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2304 zcmc&$`8U-28~;qEvCkyNmNjE5ds7kP>ssPtY`KW6*#|MkZrn1Ii5B^c-B7ajRp_E9 z#*iuFDW)g}0DvUu zVCxP5F!;|DK?s<)B91=`@C0knLqrf6BB56WSd{4ClK=q7mp>C$bQF0=Kq@5Kc_;oF z7oM1Mo)iY8q@)-SVxtp6&J)87;z$t{%NB|NAo3e%`-?{^o%i8FW0c*-jhxGo_{oNFTlJ21494y z8FtH5Wk>^v74Um>dbJC38$CoGQOeLD&8q) z+LOElrNfm_7Jx;E%VBTA%rKcD5%XUh5>$r8`IMtAP6nHJ$09oqO?r_npgwrFV(ML+ z!``v5Ezx(QDkZg2FkcFlg2QRTBTG%vSssk;7N6T~M&bl=wBdf?Joeeqs@ZlGLA z7yq_Qg{yN#~Iz{ZU3O115K7Zmxb$(tAgCu5 zO?_9y*$EX|Ei!X9lTX=3vN*b&Qx^JQ`9)?jhl&qe`b`6q)j$~X+=}EGJA76k%C7X+ zy=)!-_}qn^?b#w65MUn5o0oC!5elGf94JE7_JE&CF+-R%3ziTVi(mU%PjK{qQn+pr zB+mJe1s&wznYStK{dBM#fnVI(uDf)*MLECLF;caC=k@QEyJ>gU<0Bv~sg>ga-l$g8 zmNwCWH;IuHNi}bh6V?Z28kKL?QULSJ{_)P`|Dd{ilj#rwnC`|(d%vMEjXOe$JPr__ zxsT1HSHUiNnFoMZ0DJu(f6X+SafaFP_#;4P_WL1?QlSiyJS;x*+R082Zvu*_>SgTM zM%j?aGUzYi^&L4)I05t`WX&<~NJG0SAF>{F3NVQ1u6yn%(2Yo#-fIY5v1pR7Bfw+! z?b<%ooz(sbg#3Q#ZOi`aesE#^exl-HiB`&abPcqn^Eg*nsgP?AK9XGukA@Oj^UjpV zFvk+fbI)`HS}ioOFOvnZCExVAb>~o8rl{CoBlB(e!Zo<9T2z8eb16=}nXwh)z;xU+_CE#+3#6F!>1t)OVo zEK0cxNdZreu|UBERBBND_QLTMD?S7Qr{ga%@>Zp57zN1+L|^E|iIuerV6$=uiZHkG z93M}M;vPB88EJn*xv};>p{Ogg@%o0r3o4`(U|yWG=Oi7Bd*Dz5ZT`j{jXqq)9tA((uxCe_pjraLN-?2Y< zRHbt6Qzlkx@Lrg;ygV@qGQ>=sF)zM}1WD5TCixa;k~@2_pP^L1O~5^BNJ^cGw`%XN z{!qdlUFW~L7iP@DfeeV-|B2z@J!s8-b1Ppa()VcT0R-HyD7nih7o9s>?piVZ2px6F z6`H|1e_gibMJq@@x5^x$eK!c(%^N@czl+6lG{0%=pz?mco0CYkH(Q>p#>!odux#F| z?b#+UlGWM)icI*`Igu$vReP_MEB zVs{^Wx}?L3?+7WA;tvPZrA3cmN0H&OU7#_>WUVGamya}7;ejL2%y7trZ;7K$YK3&AEBz&2l zFq(t98H95CXkim^y81f26U#C)R*>LvFcTBVU@udf1sKtqO-4^U+z+v230Kr_d-AO6 zD@Cg{*wljWCsu=ZR6rBJ7 diff --git a/app/src/main/res/drawable-v26/ic_launcher_foreground.xml b/app/src/main/res/drawable-v26/ic_launcher_foreground.xml new file mode 100644 index 000000000..4a7af2a01 --- /dev/null +++ b/app/src/main/res/drawable-v26/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + diff --git a/app/src/main/res/mipmap-anydpi-v21/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v21/ic_launcher.xml index ca03b640b..b50665400 100644 --- a/app/src/main/res/mipmap-anydpi-v21/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v21/ic_launcher.xml @@ -1,6 +1,19 @@ - - - - + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 9512ead0c..000000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - -