Merge branch 'develop'

This commit is contained in:
Thibault Deckers 2024-05-03 00:43:58 +02:00
commit 07ac7b3fda
32 changed files with 956 additions and 84 deletions

View file

@ -4,15 +4,17 @@ All notable changes to this project will be documented in this file.
## <a id="unreleased"></a>[Unreleased]
## <a id="v1.11.0"></a>[v1.11.0] - 2024-05-01
## <a id="v1.11.1"></a>[v1.11.1] - 2024-05-03
### Added
- Cataloguing: identify Apple variant of HDR images
- Collection: `select all` available as quick action
- Collection: allow using hash (md5/sha1/sha256) when bulk renaming
- Info: color palette
- Video: external subtitle support (SRT)
- option to force using western arabic numerals for dates
- Persian translation (thanks امیر جهانگرد, slasb37, mimvahedi, Alireza Rashidi)
### Changed
@ -25,6 +27,8 @@ All notable changes to this project will be documented in this file.
- stopping video playback when changing device orientation on Android >=13
- printing content orientation according to page format
## <a id="v1.11.0"></a>[v1.11.0] - 2024-05-01 [YANKED]
## <a id="v1.10.9"></a>[v1.10.9] - 2024-04-14
### Fixed

View file

@ -60,15 +60,6 @@ android {
disable 'InvalidPackage'
}
packagingOptions {
jniLibs {
// The Amazon Developer console mistakenly considers the app to not be 64-bit compatible
// if there are some libs in `lib/armeabi-v7a` unmatched by libs in `lib/arm64-v8a`,
// so we exclude the extra `neon` libs bundled by `FFmpegKit`.
excludes += ['lib/armeabi-v7a/*_neon.so']
}
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}

View file

@ -6,7 +6,7 @@
<path
android:fillColor="#ef435a"
android:fillType="evenOdd"
android:pathData="m41.18,56.69 l8.74,8.74a1.54,1.54 0,0 1,0 2.18l-4.18,4.18a7.99,7.99 0,0 1,-11.3 0L30.26,67.61a1.54,1.54 0,0 1,0 -2.18l8.74,-8.74a1.54,1.54 0,0 1,2.18 0z"
android:pathData="m40.44,57.44 l8.74,8.74a1.54,1.54 0,0 1,0 2.18l-4.18,4.18a7.99,7.99 0,0 1,-11.3 0l-4.18,-4.18a1.54,1.54 0,0 1,0 -2.18l8.74,-8.74a1.54,1.54 0,0 1,2.18 0z"
android:strokeWidth="1.61863"
android:strokeColor="#000000"
android:strokeLineCap="round"
@ -14,7 +14,7 @@
<path
android:fillColor="#e0e0e0"
android:fillType="evenOdd"
android:pathData="M54.22,43.64L62.96,52.38A1.54,1.54 0,0 1,62.96 54.56L54.22,63.3A1.54,1.54 0,0 1,52.04 63.3L43.3,54.56A1.54,1.54 0,0 1,43.3 52.38L52.04,43.64A1.54,1.54 90,0 1,54.22 43.64z"
android:pathData="m53.48,44.4 l8.74,8.74a1.54,1.54 0,0 1,-0 2.18l-8.74,8.74a1.54,1.54 0,0 1,-2.18 0l-8.74,-8.74a1.54,1.54 0,0 1,0 -2.18l8.74,-8.74a1.54,1.54 0,0 1,2.18 0z"
android:strokeWidth="1.61862"
android:strokeColor="#000000"
android:strokeLineCap="round"
@ -22,7 +22,7 @@
<path
android:fillColor="#ffc11f"
android:fillType="evenOdd"
android:pathData="m56.35,39.33a1.54,1.54 0,0 0,0 2.18l8.74,8.74a1.54,1.54 0,0 0,2.18 0l8.74,-8.74a1.54,1.54 0,0 0,0 -2.18l-4.34,-4.34a7.77,7.77 0,0 0,-10.98 0zM64.97,39.22a1.7,1.7 0,0 1,2.41 0,1.7 1.7,0 0,1 0,2.41 1.7,1.7 0,0 1,-2.41 0,1.7 1.7,0 0,1 0,-2.41z"
android:pathData="m55.61,40.09a1.54,1.54 0,0 0,0 2.18l8.74,8.74a1.54,1.54 0,0 0,2.18 0l8.74,-8.74a1.54,1.54 0,0 0,0 -2.18l-4.34,-4.34a7.77,7.77 0,0 0,-10.98 0zM64.23,39.98a1.71,1.71 0,0 1,2.41 0,1.71 1.71,0 0,1 0,2.41 1.71,1.71 0,0 1,-2.41 0,1.71 1.71,0 0,1 0,-2.41z"
android:strokeWidth="1.61862"
android:strokeColor="#000000"
android:strokeLineCap="round"
@ -30,7 +30,7 @@
<path
android:fillColor="@color/ic_launcher_flavour"
android:fillType="evenOdd"
android:pathData="m37.21,26.63 l12.76,12.76a1.54,1.54 0,0 1,0 2.18l-8.74,8.74a1.54,1.54 0,0 1,-2.18 0l-5.67,-5.67a12.06,12.06 0,0 1,0 -17.06l0.95,-0.95a2.04,2.04 0,0 1,2.88 0z"
android:pathData="m36.47,27.39 l12.76,12.76a1.54,1.54 0,0 1,0 2.18l-8.74,8.74a1.54,1.54 0,0 1,-2.18 0l-5.67,-5.67a12.06,12.06 0,0 1,0 -17.06l0.95,-0.95a2.04,2.04 0,0 1,2.88 0z"
android:strokeWidth="1.61863"
android:strokeColor="#000000"
android:strokeLineCap="round"

View file

@ -6,7 +6,7 @@
<path
android:fillColor="#000000"
android:fillType="evenOdd"
android:pathData="m41.18,56.69 l8.74,8.74a1.54,1.54 0,0 1,0 2.18l-4.18,4.18a7.99,7.99 0,0 1,-11.3 0L30.26,67.61a1.54,1.54 0,0 1,0 -2.18l8.74,-8.74a1.54,1.54 0,0 1,2.18 0z"
android:pathData="m40.44,57.44 l8.74,8.74a1.54,1.54 0,0 1,0 2.18l-4.18,4.18a7.99,7.99 0,0 1,-11.3 0l-4.18,-4.18a1.54,1.54 0,0 1,0 -2.18l8.74,-8.74a1.54,1.54 0,0 1,2.18 0z"
android:strokeWidth="1.61863"
android:strokeColor="#00000000"
android:strokeLineCap="round"
@ -14,7 +14,7 @@
<path
android:fillColor="#000000"
android:fillType="evenOdd"
android:pathData="M54.22,43.64L62.96,52.38A1.54,1.54 0,0 1,62.96 54.56L54.22,63.3A1.54,1.54 0,0 1,52.04 63.3L43.3,54.56A1.54,1.54 0,0 1,43.3 52.38L52.04,43.64A1.54,1.54 90,0 1,54.22 43.64z"
android:pathData="m53.48,44.4 l8.74,8.74a1.54,1.54 0,0 1,-0 2.18l-8.74,8.74a1.54,1.54 0,0 1,-2.18 0l-8.74,-8.74a1.54,1.54 0,0 1,0 -2.18l8.74,-8.74a1.54,1.54 0,0 1,2.18 0z"
android:strokeWidth="1.61862"
android:strokeColor="#00000000"
android:strokeLineCap="round"
@ -22,7 +22,7 @@
<path
android:fillColor="#000000"
android:fillType="evenOdd"
android:pathData="m56.35,39.33a1.54,1.54 0,0 0,0 2.18l8.74,8.74a1.54,1.54 0,0 0,2.18 0l8.74,-8.74a1.54,1.54 0,0 0,0 -2.18l-4.34,-4.34a7.77,7.77 0,0 0,-10.98 0zM64.97,39.22a1.7,1.7 0,0 1,2.41 0,1.7 1.7,0 0,1 0,2.41 1.7,1.7 0,0 1,-2.41 0,1.7 1.7,0 0,1 0,-2.41z"
android:pathData="m55.61,40.09a1.54,1.54 0,0 0,0 2.18l8.74,8.74a1.54,1.54 0,0 0,2.18 0l8.74,-8.74a1.54,1.54 0,0 0,0 -2.18l-4.34,-4.34a7.77,7.77 0,0 0,-10.98 0zM64.23,39.98a1.71,1.71 0,0 1,2.41 0,1.71 1.71,0 0,1 0,2.41 1.71,1.71 0,0 1,-2.41 0,1.71 1.71,0 0,1 0,-2.41z"
android:strokeWidth="1.61862"
android:strokeColor="#00000000"
android:strokeLineCap="round"
@ -30,7 +30,7 @@
<path
android:fillColor="#000000"
android:fillType="evenOdd"
android:pathData="m37.21,26.63 l12.76,12.76a1.54,1.54 0,0 1,0 2.18l-8.74,8.74a1.54,1.54 0,0 1,-2.18 0l-5.67,-5.67a12.06,12.06 0,0 1,0 -17.06l0.95,-0.95a2.04,2.04 0,0 1,2.88 0z"
android:pathData="m36.47,27.39 l12.76,12.76a1.54,1.54 0,0 1,0 2.18l-8.74,8.74a1.54,1.54 0,0 1,-2.18 0l-5.67,-5.67a12.06,12.06 0,0 1,0 -17.06l0.95,-0.95a2.04,2.04 0,0 1,2.88 0z"
android:strokeWidth="1.61863"
android:strokeColor="#00000000"
android:strokeLineCap="round"

View file

@ -0,0 +1,4 @@
In v1.11.1:
- watch videos with SRT subtitle files
- enjoy the app in Persian
Full changelog available on GitHub

View file

@ -0,0 +1,4 @@
In v1.11.1:
- watch videos with SRT subtitle files
- enjoy the app in Persian
Full changelog available on GitHub

View file

@ -1,5 +1,5 @@
<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files.
<i>اِیوْز</i> می تواند انواع تصاویر و ویدیوها، از جمله JPEG ها و MP4 های عادی شما را مدیریت کند، اما همچنین چیزهای عجیب و غریب تری مانند <b> TIFF های چند صفحه ای، SVG ها، AVI های قدیمی و بیشتر</b>! این مجموعه رسانه های شما را بررسی می کند تا پرونده های <b>تصویر متحرک</b>، <b>پانوراما</b> (معروف به تصاویر کروی)، <b>360° ویدیو ها</b>، و همچنین <b>geoTIFF</b> را شناسایی کند.
<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc.
<b>پیمایش و جستجو</b>یک بخش مهم از <i>اِیوْز</i> است. هدف این است که کاربران به راحتی از آلبوم ها به عکس ها به برچسب ها به نقشه ها و غیره دست پیدا کنند.
<i>Aves</i> integrates with Android (from KitKat to Android 14, including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>.
<i>اِیوْز</i> با اندروید سازگار است (از نسخه KitKat تا اندروید 14, شامل تلوزیون اندرویدی) با قابلیت هایی مانند <b>ابزارک ها</b>, <b>میانبر ها</b>, <b>ذخیره نیرو</b> و <b>جستجو عمومی</b> و همچنین میتوان از آن به عنوان <b>نمایشگر و انتخابگز رسانه</b> استفاده کرد.

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 KiB

View file

@ -1532,5 +1532,9 @@
"videoActionABRepeat": "Паўтарыць ад А да Б",
"@videoActionABRepeat": {},
"videoRepeatActionSetStart": "Ўсталяваць пачатак",
"@videoRepeatActionSetStart": {}
"@videoRepeatActionSetStart": {},
"renameProcessorHash": "Хэш",
"@renameProcessorHash": {},
"settingsForceWesternArabicNumeralsTile": "Прымусовыя арабскія лічбы",
"@settingsForceWesternArabicNumeralsTile": {}
}

File diff suppressed because it is too large Load diff

View file

@ -841,7 +841,7 @@
"@settingsVideoButtonsTile": {},
"settingsVideoGestureDoubleTapTogglePlay": "Oynatmak/duraklatmak için çift dokunun",
"@settingsVideoGestureDoubleTapTogglePlay": {},
"settingsVideoGestureSideDoubleTapSeek": "Geri/ileri aramak için ekran kenarlarına çift dokunun",
"settingsVideoGestureSideDoubleTapSeek": "İleri/geri gitmek için ekran kenarlarına çift dokunun",
"@settingsVideoGestureSideDoubleTapSeek": {},
"settingsPrivacySectionTitle": "Gizlilik",
"@settingsPrivacySectionTitle": {},
@ -1376,5 +1376,7 @@
"videoRepeatActionSetEnd": "Bitiş noktası seç",
"@videoRepeatActionSetEnd": {},
"settingsForceWesternArabicNumeralsTile": "Arap rakamlarını zorla",
"@settingsForceWesternArabicNumeralsTile": {}
"@settingsForceWesternArabicNumeralsTile": {},
"renameProcessorHash": "Sağlama",
"@renameProcessorHash": {}
}

View file

@ -1374,5 +1374,9 @@
"videoActionABRepeat": "A-B 循环播放",
"@videoActionABRepeat": {},
"videoRepeatActionSetEnd": "设置终点",
"@videoRepeatActionSetEnd": {}
"@videoRepeatActionSetEnd": {},
"renameProcessorHash": "哈希",
"@renameProcessorHash": {},
"settingsForceWesternArabicNumeralsTile": "强制阿拉伯数数字",
"@settingsForceWesternArabicNumeralsTile": {}
}

View file

@ -83,6 +83,10 @@ class Contributors {
Contributor('wanzh', 'wanzh66666@gmail.com'),
Contributor('ID J', 'tabby4442@gmail.com'),
Contributor('randint', 'lancameb@hotmail.com'),
Contributor('امیر جهانگرد', 'ijahangard.a@gmail.com'),
Contributor('slasb37', 'p84haghi@gmail.com'),
Contributor('mimvahedi', 'vahedi0vahedi@gmail.com'),
Contributor('Alireza Rashidi', 'alirezarashidigoorabi@gmail.com'),
// Contributor('Alvi Khan', 'aveenalvi@gmail.com'), // Bengali
// Contributor('Htet Oo Hlaing', 'htetoh2006@outlook.com'), // Burmese
// Contributor('Khant', 'khant@users.noreply.hosted.weblate.org'), // Burmese
@ -96,10 +100,6 @@ class Contributors {
// Contributor('Rasti K5', 'rasti.khdhr@gmail.com'), // Kurdish (Central)
// Contributor('Raman', 'xysed@tutanota.com'), // Malayalam
// Contributor('Subham Jena', 'subhamjena8465@gmail.com'), // Odia
// Contributor('امیر جهانگرد', 'ijahangard.a@gmail.com'), // Persian
// Contributor('slasb37', 'p84haghi@gmail.com'), // Persian
// Contributor('mimvahedi', 'vahedi0vahedi@gmail.com'), // Persian
// Contributor('Alireza Rashidi', 'alirezarashidigoorabi@gmail.com'), // Persian
// Contributor('Prasanta-Hembram', 'Prasantahembram720@gmail.com'), // Santali
// Contributor('mytja', 'mamnju21@gmail.com'), // Slovenian
// Contributor('Shift18', 'bribable.lawyer@posteo.net'), // Swedish

View file

@ -28,12 +28,15 @@ class Selection<T> extends ChangeNotifier {
void addToSelection(Iterable<T> items) {
if (items.isEmpty) return;
select();
_selectedItems.addAll(items);
notifyListeners();
}
void removeFromSelection(Iterable<T> items) {
if (items.isEmpty) return;
_selectedItems.removeAll(items);
notifyListeners();
}

View file

@ -6,6 +6,7 @@ import 'package:aves/widgets/about/title.dart';
import 'package:aves/widgets/common/basic/text/change_highlight.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
class AboutTranslators extends StatelessWidget {
@ -108,7 +109,7 @@ class _RandomTextSpanHighlighterState extends State<_RandomTextSpanHighlighter>
children: [
...widget.spans.expandIndexed((i, v) => [
if (i != 0) const TextSpan(text: AText.separator),
TextSpan(text: v, style: i == _highlightedIndex ? _animatedStyle.value : _baseStyle),
TextSpan(text: '${Unicode.FSI}$v${Unicode.PDI}', style: i == _highlightedIndex ? _animatedStyle.value : _baseStyle),
])
],
),

View file

@ -61,7 +61,6 @@ class AvesApp extends StatefulWidget {
'bn', // Bengali
'ckb', // Kurdish (Central)
'da', // Danish
'fa', // Persian
'fi', // Finnish
'gl', // Galician
'he', // Hebrew

View file

@ -379,7 +379,8 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
final browsingQuickActions = settings.collectionBrowsingQuickActions;
final selectionQuickActions = isTrash ? [EntrySetAction.delete, EntrySetAction.restore] : settings.collectionSelectionQuickActions;
final quickActionButtons = (isSelecting ? selectionQuickActions : browsingQuickActions).where(isVisible).map(
final quickActions = isSelecting ? selectionQuickActions : browsingQuickActions;
final quickActionButtons = quickActions.where(isVisible).map(
(action) => _buildButtonIcon(context, action, enabled: canApply(action), selection: selection),
);
@ -390,13 +391,13 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
// key is expected by test driver
key: const Key('appbar-menu-button'),
itemBuilder: (context) {
final generalMenuItems = EntrySetActions.general.where(isVisible).map(
bool _isValidForMenu(EntrySetAction? v) => v == null || (!quickActions.contains(v) && isVisible(v));
final generalMenuItems = EntrySetActions.general.where(_isValidForMenu).map(
(action) => _toMenuItem(action, enabled: canApply(action), selection: selection),
);
final browsingMenuActions = EntrySetActions.pageBrowsing.where((v) => !browsingQuickActions.contains(v));
final selectionMenuActions = EntrySetActions.pageSelection.where((v) => !selectionQuickActions.contains(v));
final contextualMenuActions = (isSelecting ? selectionMenuActions : browsingMenuActions).where((v) => v == null || isVisible(v)).fold(<EntrySetAction?>[], (prev, v) {
final allContextualActions = isSelecting ? EntrySetActions.pageSelection: EntrySetActions.pageBrowsing;
final contextualMenuActions = allContextualActions.where(_isValidForMenu).fold(<EntrySetAction?>[], (prev, v) {
if (v == null && (prev.isEmpty || prev.last == null)) return prev;
return [...prev, v];
});

View file

@ -66,7 +66,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware
case EntrySetAction.select:
return appMode.canSelectMedia && !isSelecting;
case EntrySetAction.selectAll:
return isSelecting && selectedItemCount < itemCount;
return (isSelecting && selectedItemCount < itemCount) || (!isSelecting && settings.collectionBrowsingQuickActions.contains(action));
case EntrySetAction.selectNone:
return isSelecting && selectedItemCount == itemCount;
// browsing
@ -127,7 +127,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware
case EntrySetAction.select:
return hasItems;
case EntrySetAction.selectAll:
return selectedItemCount < itemCount;
return selectedItemCount < itemCount || (!isSelecting && settings.collectionBrowsingQuickActions.contains(action));
case EntrySetAction.selectNone:
return hasSelection;
case EntrySetAction.searchCollection:

View file

@ -12,6 +12,7 @@ class SupportedLocales {
'en': 'English',
'es': 'Español (México)',
'eu': 'Euskara',
'fa': 'فارسی',
'fr': 'Français',
'hu': 'Magyar',
'id': 'Bahasa Indonesia',

View file

@ -102,7 +102,6 @@ class _HiddenFilters extends StatelessWidget {
children: [
Expanded(
child: LayoutBuilder(builder: (context, constraints) {
debugPrint('TLAD constraints=$constraints');
return Row(
children: [
AvesFilterChip(

View file

@ -19,7 +19,9 @@ class CollectionActionEditorPage extends StatelessWidget {
Tab(text: l10n.settingsCollectionQuickActionTabBrowsing),
QuickActionEditorBody<EntrySetAction>(
bannerText: context.l10n.settingsCollectionBrowsingQuickActionEditorBanner,
allAvailableActions: const [EntrySetActions.collectionEditorBrowsing],
allAvailableActions: const [
EntrySetActions.collectionEditorBrowsing,
],
actionIcon: (action) => action.getIcon(),
actionText: (context, action) => action.getText(context),
load: () => settings.collectionBrowsingQuickActions,

View file

@ -65,6 +65,8 @@ class EntrySetActions {
EntrySetAction.map,
EntrySetAction.slideshow,
EntrySetAction.stats,
// only available as a quick action
EntrySetAction.selectAll,
];
// `null` items are converted to dividers
@ -98,6 +100,7 @@ class EntrySetActions {
EntrySetAction.map,
EntrySetAction.slideshow,
EntrySetAction.stats,
EntrySetAction.selectAll,
// editing actions are in their subsection
];

View file

@ -7,7 +7,7 @@ repository: https://github.com/deckerst/aves
# - play changelog: /whatsnew/whatsnew-en-US
# - izzy changelog: /fastlane/metadata/android/en-US/changelogs/XXX01.txt
# - libre changelog: /fastlane/metadata/android/en-US/changelogs/XXX.txt
version: 1.11.0+119
version: 1.11.1+120
publish_to: none
environment:

View file

@ -7,7 +7,6 @@ fi
# - scaled down versions for IzzyOnDroid
# - framed versions for Google Play
# - framed and scaled down versions for README (English only)
# - framed and scaled down versions for Amazon (English only)
# expects:
# - ImageMagick 6
@ -82,13 +81,3 @@ for source in framed/en/*; do
convert -resize 250x "$source" "$target"
fi
done
# amazon: scale down
for source in framed/en/*; do
if [[ -f "$source" ]]; then
target=${source/framed/amazon}
echo "$source -> $target"
mkdir -p "$(dirname "$target")"
convert -resize x1920 "$source" -gravity center -background transparent -extent 1200x1920 "$target"
fi
done

View file

@ -1,3 +1,4 @@
In v1.11.0:
In v1.11.1:
- watch videos with SRT subtitle files
- enjoy the app in Persian
Full changelog available on GitHub