This commit is contained in:
Thibault Deckers 2023-03-24 18:26:05 +01:00
parent e8893f7f07
commit ad3edf4458
35 changed files with 334 additions and 326 deletions

View file

@ -1,4 +1,4 @@
import 'package:aves/utils/emoji_utils.dart';
import 'package:aves/ref/unicode.dart';
import 'package:country_code/country_code.dart';
class GeoStates {
@ -15,73 +15,73 @@ class GeoStates {
};
static const _australiaEnglish = {
'Australian Capital Territory': StateCodes.auAustralianCapitalTerritory,
'New South Wales': StateCodes.auNewSouthWales,
'Northern Territory': StateCodes.auNorthernTerritory,
'Queensland': StateCodes.auQueensland,
'South Australia': StateCodes.auSouthAustralia,
'Tasmania': StateCodes.auTasmania,
'Victoria': StateCodes.auVictoria,
'Western Australia': StateCodes.auWesternAustralia,
'Australian Capital Territory': EmojiStateCodes.auAustralianCapitalTerritory,
'New South Wales': EmojiStateCodes.auNewSouthWales,
'Northern Territory': EmojiStateCodes.auNorthernTerritory,
'Queensland': EmojiStateCodes.auQueensland,
'South Australia': EmojiStateCodes.auSouthAustralia,
'Tasmania': EmojiStateCodes.auTasmania,
'Victoria': EmojiStateCodes.auVictoria,
'Western Australia': EmojiStateCodes.auWesternAustralia,
};
static const _unitedKingdomEnglish = {
'England': StateCodes.gbEngland,
'Northern Ireland': StateCodes.gbNorthernIreland,
'Scotland': StateCodes.gbScotland,
'Wales': StateCodes.gbWales,
'England': EmojiStateCodes.gbEngland,
'Northern Ireland': EmojiStateCodes.gbNorthernIreland,
'Scotland': EmojiStateCodes.gbScotland,
'Wales': EmojiStateCodes.gbWales,
};
static const _unitedStatesEnglish = {
'Alabama': StateCodes.usAlabama,
'Alaska': StateCodes.usAlaska,
'Arizona': StateCodes.usArizona,
'Arkansas': StateCodes.usArkansas,
'California': StateCodes.usCalifornia,
'Colorado': StateCodes.usColorado,
'Connecticut': StateCodes.usConnecticut,
'Delaware': StateCodes.usDelaware,
'Florida': StateCodes.usFlorida,
'Georgia': StateCodes.usGeorgia,
'Hawaii': StateCodes.usHawaii,
'Idaho': StateCodes.usIdaho,
'Illinois': StateCodes.usIllinois,
'Indiana': StateCodes.usIndiana,
'Iowa': StateCodes.usIowa,
'Kansas': StateCodes.usKansas,
'Kentucky': StateCodes.usKentucky,
'Louisiana': StateCodes.usLouisiana,
'Maine': StateCodes.usMaine,
'Maryland': StateCodes.usMaryland,
'Massachusetts': StateCodes.usMassachusetts,
'Michigan': StateCodes.usMichigan,
'Minnesota': StateCodes.usMinnesota,
'Mississippi': StateCodes.usMississippi,
'Missouri': StateCodes.usMissouri,
'Montana': StateCodes.usMontana,
'Nebraska': StateCodes.usNebraska,
'Nevada': StateCodes.usNevada,
'New Hampshire': StateCodes.usNewHampshire,
'New Jersey': StateCodes.usNewJersey,
'New Mexico': StateCodes.usNewMexico,
'New York': StateCodes.usNewYork,
'North Carolina': StateCodes.usNorthCarolina,
'North Dakota': StateCodes.usNorthDakota,
'Ohio': StateCodes.usOhio,
'Oklahoma': StateCodes.usOklahoma,
'Oregon': StateCodes.usOregon,
'Pennsylvania': StateCodes.usPennsylvania,
'Rhode Island': StateCodes.usRhodeIsland,
'South Carolina': StateCodes.usSouthCarolina,
'South Dakota': StateCodes.usSouthDakota,
'Tennessee': StateCodes.usTennessee,
'Utah': StateCodes.usUtah,
'Vermont': StateCodes.usVermont,
'Virginia': StateCodes.usVirginia,
'Washington': StateCodes.usWashington,
'Washington DC': StateCodes.usWashingtonDC,
'West Virginia': StateCodes.usWestVirginia,
'Wisconsin': StateCodes.usWisconsin,
'Wyoming': StateCodes.usWyoming,
'Alabama': EmojiStateCodes.usAlabama,
'Alaska': EmojiStateCodes.usAlaska,
'Arizona': EmojiStateCodes.usArizona,
'Arkansas': EmojiStateCodes.usArkansas,
'California': EmojiStateCodes.usCalifornia,
'Colorado': EmojiStateCodes.usColorado,
'Connecticut': EmojiStateCodes.usConnecticut,
'Delaware': EmojiStateCodes.usDelaware,
'Florida': EmojiStateCodes.usFlorida,
'Georgia': EmojiStateCodes.usGeorgia,
'Hawaii': EmojiStateCodes.usHawaii,
'Idaho': EmojiStateCodes.usIdaho,
'Illinois': EmojiStateCodes.usIllinois,
'Indiana': EmojiStateCodes.usIndiana,
'Iowa': EmojiStateCodes.usIowa,
'Kansas': EmojiStateCodes.usKansas,
'Kentucky': EmojiStateCodes.usKentucky,
'Louisiana': EmojiStateCodes.usLouisiana,
'Maine': EmojiStateCodes.usMaine,
'Maryland': EmojiStateCodes.usMaryland,
'Massachusetts': EmojiStateCodes.usMassachusetts,
'Michigan': EmojiStateCodes.usMichigan,
'Minnesota': EmojiStateCodes.usMinnesota,
'Mississippi': EmojiStateCodes.usMississippi,
'Missouri': EmojiStateCodes.usMissouri,
'Montana': EmojiStateCodes.usMontana,
'Nebraska': EmojiStateCodes.usNebraska,
'Nevada': EmojiStateCodes.usNevada,
'New Hampshire': EmojiStateCodes.usNewHampshire,
'New Jersey': EmojiStateCodes.usNewJersey,
'New Mexico': EmojiStateCodes.usNewMexico,
'New York': EmojiStateCodes.usNewYork,
'North Carolina': EmojiStateCodes.usNorthCarolina,
'North Dakota': EmojiStateCodes.usNorthDakota,
'Ohio': EmojiStateCodes.usOhio,
'Oklahoma': EmojiStateCodes.usOklahoma,
'Oregon': EmojiStateCodes.usOregon,
'Pennsylvania': EmojiStateCodes.usPennsylvania,
'Rhode Island': EmojiStateCodes.usRhodeIsland,
'South Carolina': EmojiStateCodes.usSouthCarolina,
'South Dakota': EmojiStateCodes.usSouthDakota,
'Tennessee': EmojiStateCodes.usTennessee,
'Utah': EmojiStateCodes.usUtah,
'Vermont': EmojiStateCodes.usVermont,
'Virginia': EmojiStateCodes.usVirginia,
'Washington': EmojiStateCodes.usWashington,
'Washington DC': EmojiStateCodes.usWashingtonDC,
'West Virginia': EmojiStateCodes.usWestVirginia,
'Wisconsin': EmojiStateCodes.usWisconsin,
'Wyoming': EmojiStateCodes.usWyoming,
};
}

View file

@ -0,0 +1,60 @@
class Contributors {
static const translators = {
Contributor('D3ZOXY', 'its.ghost.message@gmail.com'),
Contributor('JanWaldhorn', 'weblate@jwh.anonaddy.com'),
Contributor('n-berenice', null),
Contributor('Jonatas de Almeida Barros', 'ajonatas56@gmail.com'),
Contributor('MeFinity', 'me.dot.finity@gmail.com'),
Contributor('Maki', null),
Contributor('HiSubway', 'shenyusoftware@gmail.com'),
Contributor('glemco', 'glemco@posteo.net'),
Contributor('Aerowolf', null),
Contributor('小默', 'duzhe163908@gmail.com'),
Contributor('metezd', 'itoldyouthat@protonmail.com'),
Contributor('Martijn Fabrie', null),
Contributor('Koen Koppens', 'koenkoppens@proton.me'),
Contributor('Emmanouil Papavergis', null),
Contributor('kha84', 'khalukhin@gmail.com'),
Contributor('gallegonovato', 'fran-carro@hotmail.es'),
Contributor('Havokdan', 'havokdan@yahoo.com.br'),
Contributor('Jean Mareilles', 'waged1266@tutanota.com'),
Contributor('이정희', 'daemul72@gmail.com'),
Contributor('Translator-3000', 'weblate.m1d0h@8shield.net'),
Contributor('Ralea Adrian Vicențiu', 'ralea.adrian@gmail.com'),
Contributor('Igor Sorocean', 'sorocean.igor@gmail.com'),
Contributor('JY3', 'GeeyunJY3@gmail.com'),
Contributor('Gediminas Murauskas', 'muziejusinfo@gmail.com'),
Contributor('Oğuz Ersen', 'oguz@ersen.moe'),
Contributor('Allan Nordhøy', 'epost@anotheragency.no'),
Contributor('pemibe', 'pemibe4634@dmonies.com'),
Contributor('Linerly', 'linerly@protonmail.com'),
Contributor('Skrripy', 'rozihrash.ya6w7@simplelogin.com'),
Contributor('vesp', 'vesp@post.cz'),
Contributor('Dan', 'denqwerta@gmail.com'),
Contributor('Tijolinho', 'pedrohenrique29.alfenas@gmail.com'),
Contributor('Piotr K', '1337.kelt@gmail.com'),
Contributor('rehork', 'cooky@e.email'),
Contributor('Eric', 'hamburger2048@users.noreply.hosted.weblate.org'),
Contributor('Aitor Salaberria', 'trslbrr@gmail.com'),
Contributor('Felipe Nogueira', 'contato.fnog@gmail.com'),
Contributor('kaajjo', 'claymanoff@gmail.com'),
Contributor('Eduardo Malaspina', 'vaio0@swismail.com'),
// Contributor('SAMIRAH AIL', 'samiratalzahrani@gmail.com'), // Arabic
// Contributor('Salih Ail', 'rrrfff444@gmail.com'), // Arabic
// Contributor('امیر جهانگرد', 'ijahangard.a@gmail.com'), // Persian
// Contributor('slasb37', 'p84haghi@gmail.com'), // Persian
// Contributor('tryvseu', 'tryvseu@tuta.io'), // Nynorsk
// Contributor('Nattapong K', 'mixer5056@gmail.com'), // Thai
// Contributor('Idj', 'joneltmp+goahn@gmail.com'), // Hebrew
// Contributor('Martin Frandel', 'martinko.fr@gmail.com'), // Slovak
// Contributor('GoRaN', 'gorangharib.909@gmail.com'), // Kurdish (Central)
// Contributor('Rohit Burman', 'rohitburman31p@rediffmail.com'), // Hindi
};
}
class Contributor {
final String name;
final String? weblateEmail;
const Contributor(this.name, this.weblateEmail);
}

View file

@ -0,0 +1,16 @@
import 'package:permission_handler/permission_handler.dart';
class Permissions {
static const storage = [
Permission.storage,
// for media access on Android >=13
Permission.photos,
Permission.videos,
];
static const mediaAccess = [
...storage,
// to access media with unredacted metadata with scoped storage (Android >=10)
Permission.accessMediaLocation,
];
}

View file

@ -96,9 +96,9 @@ extension ExtraAvesEntryProps on AvesEntry {
final gcd = width.gcd(height);
final w = width ~/ gcd;
final h = height ~/ gcd;
return isRotated ? '$h${Unicode.ratio}$w' : '$w${Unicode.ratio}$h';
return isRotated ? '$h${UniChars.ratio}$w' : '$w${UniChars.ratio}$h';
} else {
return '?${Unicode.ratio}?';
return '?${UniChars.ratio}?';
}
}

View file

@ -68,7 +68,7 @@ class RatingFilter extends CollectionFilter {
case 0:
return context.l10n.filterNoRatingLabel;
default:
return Unicode.whiteMediumStar * rating;
return UniChars.whiteMediumStar * rating;
}
}
}

View file

@ -1,5 +1,5 @@
// cf Flutter's `foundation/unicode.dart` for bidi related characters
class Unicode {
class UniChars {
static const noBreakSpace = '\u00A0';
static const multiplicationSign = '\u00D7'; // ×
static const emDash = '\u2014'; //
@ -7,3 +7,88 @@ class Unicode {
static const ratio = '\u2236'; //
static const whiteMediumStar = '\u2B50'; //
}
class UniCodes {
// Block: Basic Latin
static const latinCapitalLetterA = 0x0041;
// Block: Enclosed Alphanumeric Supplement
static const regionalIndicatorSymbolLetterA = 0x1F1E6;
// Block: Miscellaneous Symbols and Pictographs
static const wavingBlackFlag = 0x1F3F4;
// Block: Tags
static const tagLatinSmallLetterA = 0xE0061;
static const cancelTag = 0xE007F;
}
class EmojiStateCodes {
// AU
static const auAustralianCapitalTerritory = 'auact';
static const auNewSouthWales = 'aunsw';
static const auNorthernTerritory = 'aunt';
static const auQueensland = 'auqld';
static const auSouthAustralia = 'ausa';
static const auTasmania = 'autas';
static const auVictoria = 'auvic';
static const auWesternAustralia = 'auwa';
// GB
static const gbEngland = 'gbeng';
static const gbNorthernIreland = 'gbnir';
static const gbScotland = 'gbsct';
static const gbWales = 'gbwls';
// US
static const usAlabama = 'usal';
static const usAlaska = 'usak';
static const usArizona = 'usaz';
static const usArkansas = 'usar';
static const usCalifornia = 'usca';
static const usColorado = 'usco';
static const usConnecticut = 'usct';
static const usDelaware = 'usde';
static const usFlorida = 'usfl';
static const usGeorgia = 'usga';
static const usHawaii = 'ushi';
static const usIdaho = 'usid';
static const usIllinois = 'usil';
static const usIndiana = 'usin';
static const usIowa = 'usia';
static const usKansas = 'usks';
static const usKentucky = 'usky';
static const usLouisiana = 'usla';
static const usMaine = 'usme';
static const usMaryland = 'usmd';
static const usMassachusetts = 'usma';
static const usMichigan = 'usmi';
static const usMinnesota = 'usmn';
static const usMississippi = 'usms';
static const usMissouri = 'usmo';
static const usMontana = 'usmt';
static const usNebraska = 'usne';
static const usNevada = 'usnv';
static const usNewHampshire = 'usnh';
static const usNewJersey = 'usnj';
static const usNewMexico = 'usnm';
static const usNewYork = 'usny';
static const usNorthCarolina = 'usnc';
static const usNorthDakota = 'usnd';
static const usOhio = 'usoh';
static const usOklahoma = 'usok';
static const usOregon = 'usor';
static const usPennsylvania = 'uspa';
static const usRhodeIsland = 'usri';
static const usSouthCarolina = 'ussc';
static const usSouthDakota = 'ussd';
static const usTennessee = 'ustn';
static const usUtah = 'usut';
static const usVermont = 'usvt';
static const usVirginia = 'usva';
static const usWashington = 'uswa';
static const usWashingtonDC = 'usdc';
static const usWestVirginia = 'uswv';
static const usWisconsin = 'uswi';
static const usWyoming = 'uswy';
}

View file

@ -7,6 +7,16 @@ import 'package:flutter/material.dart';
import 'package:palette_generator/palette_generator.dart';
import 'package:provider/provider.dart';
class AColors {
static const starEnabled = Colors.amber;
static const starDisabled = Colors.grey;
static const boraBoraGradient = [
Color(0xff2bc0e4),
Color(0xffeaecc6),
];
}
class AvesColorsProvider extends StatelessWidget {
final Widget child;

View file

@ -1,6 +1,6 @@
import 'dart:ui';
import 'package:flutter/widgets.dart';
import 'package:flutter/material.dart';
class AStyles {
// as of Flutter v2.8.0, overflowing `Text` miscalculates height and some text (e.g. 'Å') is clipped
@ -19,4 +19,11 @@ class AStyles {
final smcp = locale.languageCode != 'el';
unknownTitleText = smcp ? knownTitleText : knownTitleText.copyWith(fontFeatures: []);
}
static const embossShadows = [
Shadow(
color: Colors.black,
offset: Offset(0.5, 1.0),
)
];
}

View file

@ -1,7 +1,7 @@
import 'package:aves/ref/unicode.dart';
class AText {
static const separator = ' ${Unicode.bullet} ';
static const resolutionSeparator = ' ${Unicode.multiplicationSign} ';
static const valueNotAvailable = Unicode.emDash;
static const separator = ' ${UniChars.bullet} ';
static const resolutionSeparator = ' ${UniChars.multiplicationSign} ';
static const valueNotAvailable = UniChars.emDash;
}

View file

@ -1,27 +0,0 @@
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
class Constants {
static const storagePermissions = [
Permission.storage,
// for media access on Android >=13
Permission.photos,
Permission.videos,
];
static const double colorPickerRadius = 16;
static const embossShadows = [
Shadow(
color: Colors.black,
offset: Offset(0.5, 1.0),
)
];
static const boraBoraGradientColors = [
Color(0xff2bc0e4),
Color(0xffeaecc6),
];
static const int infoGroupMaxValueLength = 140;
}

View file

@ -1,15 +1,10 @@
import 'package:aves/ref/unicode.dart';
class EmojiUtils {
// U+0041 Latin Capital letter A
static const _capitalLetterA = 0x0041;
// U+1F1E6 Regional Indicator Symbol Letter A
static const _countryCodeToFlagDiff = 0x1F1E6 - _capitalLetterA;
// U+E0061 Tag Latin Small Letter a
static const _stateCodeToFlagDiff = 0xE0061 - _capitalLetterA;
static const _blackFlag = 0x1F3F4;
static const _cancel = 0xE007F;
static const _countryCodeToFlagDiff = UniCodes.regionalIndicatorSymbolLetterA - UniCodes.latinCapitalLetterA;
static const _stateCodeToFlagDiff = UniCodes.tagLatinSmallLetterA - UniCodes.latinCapitalLetterA;
static const _subFlagStart = UniCodes.wavingBlackFlag;
static const _subFlagEnd = UniCodes.cancelTag;
static String? countryCodeToFlag(String? code) {
if (code == null || code.length != 2) return null;
@ -18,76 +13,10 @@ class EmojiUtils {
static String? stateCodeToFlag(String? code) {
if (code == null) return null;
return String.fromCharCodes([_blackFlag, ...code.toUpperCase().codeUnits.map((letter) => letter += _stateCodeToFlagDiff), _cancel]);
return String.fromCharCodes([
_subFlagStart,
...code.toUpperCase().codeUnits.map((letter) => letter += _stateCodeToFlagDiff),
_subFlagEnd,
]);
}
}
class StateCodes {
// AU
static const auAustralianCapitalTerritory = 'auact';
static const auNewSouthWales = 'aunsw';
static const auNorthernTerritory = 'aunt';
static const auQueensland = 'auqld';
static const auSouthAustralia = 'ausa';
static const auTasmania = 'autas';
static const auVictoria = 'auvic';
static const auWesternAustralia = 'auwa';
// GB
static const gbEngland = 'gbeng';
static const gbNorthernIreland = 'gbnir';
static const gbScotland = 'gbsct';
static const gbWales = 'gbwls';
// US
static const usAlabama = 'usal';
static const usAlaska = 'usak';
static const usArizona = 'usaz';
static const usArkansas = 'usar';
static const usCalifornia = 'usca';
static const usColorado = 'usco';
static const usConnecticut = 'usct';
static const usDelaware = 'usde';
static const usFlorida = 'usfl';
static const usGeorgia = 'usga';
static const usHawaii = 'ushi';
static const usIdaho = 'usid';
static const usIllinois = 'usil';
static const usIndiana = 'usin';
static const usIowa = 'usia';
static const usKansas = 'usks';
static const usKentucky = 'usky';
static const usLouisiana = 'usla';
static const usMaine = 'usme';
static const usMaryland = 'usmd';
static const usMassachusetts = 'usma';
static const usMichigan = 'usmi';
static const usMinnesota = 'usmn';
static const usMississippi = 'usms';
static const usMissouri = 'usmo';
static const usMontana = 'usmt';
static const usNebraska = 'usne';
static const usNevada = 'usnv';
static const usNewHampshire = 'usnh';
static const usNewJersey = 'usnj';
static const usNewMexico = 'usnm';
static const usNewYork = 'usny';
static const usNorthCarolina = 'usnc';
static const usNorthDakota = 'usnd';
static const usOhio = 'usoh';
static const usOklahoma = 'usok';
static const usOregon = 'usor';
static const usPennsylvania = 'uspa';
static const usRhodeIsland = 'usri';
static const usSouthCarolina = 'ussc';
static const usSouthDakota = 'ussd';
static const usTennessee = 'ustn';
static const usUtah = 'usut';
static const usVermont = 'usvt';
static const usVirginia = 'usva';
static const usWashington = 'uswa';
static const usWashingtonDC = 'usdc';
static const usWestVirginia = 'uswv';
static const usWisconsin = 'uswi';
static const usWyoming = 'uswy';
}

View file

@ -2,7 +2,7 @@ import 'package:aves/app_flavor.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/ref/brand_colors.dart';
import 'package:aves/theme/colors.dart';
import 'package:aves/model/dependencies.dart';
import 'package:aves/model/app/dependencies.dart';
import 'package:aves/widgets/about/title.dart';
import 'package:aves/widgets/about/tv_license_page.dart';
import 'package:aves/widgets/common/basic/link_chip.dart';

View file

@ -1,5 +1,6 @@
import 'dart:math';
import 'package:aves/model/app/contributors.dart';
import 'package:aves/theme/text.dart';
import 'package:aves/widgets/about/title.dart';
import 'package:aves/widgets/common/basic/text/change_highlight.dart';
@ -10,58 +11,6 @@ import 'package:flutter/material.dart';
class AboutTranslators extends StatelessWidget {
const AboutTranslators({super.key});
static const translators = {
Contributor('D3ZOXY', 'its.ghost.message@gmail.com'),
Contributor('JanWaldhorn', 'weblate@jwh.anonaddy.com'),
Contributor('n-berenice', null),
Contributor('Jonatas de Almeida Barros', 'ajonatas56@gmail.com'),
Contributor('MeFinity', 'me.dot.finity@gmail.com'),
Contributor('Maki', null),
Contributor('HiSubway', 'shenyusoftware@gmail.com'),
Contributor('glemco', 'glemco@posteo.net'),
Contributor('Aerowolf', null),
Contributor('小默', 'duzhe163908@gmail.com'),
Contributor('metezd', 'itoldyouthat@protonmail.com'),
Contributor('Martijn Fabrie', null),
Contributor('Koen Koppens', 'koenkoppens@proton.me'),
Contributor('Emmanouil Papavergis', null),
Contributor('kha84', 'khalukhin@gmail.com'),
Contributor('gallegonovato', 'fran-carro@hotmail.es'),
Contributor('Havokdan', 'havokdan@yahoo.com.br'),
Contributor('Jean Mareilles', 'waged1266@tutanota.com'),
Contributor('이정희', 'daemul72@gmail.com'),
Contributor('Translator-3000', 'weblate.m1d0h@8shield.net'),
Contributor('Ralea Adrian Vicențiu', 'ralea.adrian@gmail.com'),
Contributor('Igor Sorocean', 'sorocean.igor@gmail.com'),
Contributor('JY3', 'GeeyunJY3@gmail.com'),
Contributor('Gediminas Murauskas', 'muziejusinfo@gmail.com'),
Contributor('Oğuz Ersen', 'oguz@ersen.moe'),
Contributor('Allan Nordhøy', 'epost@anotheragency.no'),
Contributor('pemibe', 'pemibe4634@dmonies.com'),
Contributor('Linerly', 'linerly@protonmail.com'),
Contributor('Skrripy', 'rozihrash.ya6w7@simplelogin.com'),
Contributor('vesp', 'vesp@post.cz'),
Contributor('Dan', 'denqwerta@gmail.com'),
Contributor('Tijolinho', 'pedrohenrique29.alfenas@gmail.com'),
Contributor('Piotr K', '1337.kelt@gmail.com'),
Contributor('rehork', 'cooky@e.email'),
Contributor('Eric', 'hamburger2048@users.noreply.hosted.weblate.org'),
Contributor('Aitor Salaberria', 'trslbrr@gmail.com'),
Contributor('Felipe Nogueira', 'contato.fnog@gmail.com'),
Contributor('kaajjo', 'claymanoff@gmail.com'),
Contributor('Eduardo Malaspina', 'vaio0@swismail.com'),
// Contributor('SAMIRAH AIL', 'samiratalzahrani@gmail.com'), // Arabic
// Contributor('Salih Ail', 'rrrfff444@gmail.com'), // Arabic
// Contributor('امیر جهانگرد', 'ijahangard.a@gmail.com'), // Persian
// Contributor('slasb37', 'p84haghi@gmail.com'), // Persian
// Contributor('tryvseu', 'tryvseu@tuta.io'), // Nynorsk
// Contributor('Nattapong K', 'mixer5056@gmail.com'), // Thai
// Contributor('Idj', 'joneltmp+goahn@gmail.com'), // Hebrew
// Contributor('Martin Frandel', 'martinko.fr@gmail.com'), // Slovak
// Contributor('GoRaN', 'gorangharib.909@gmail.com'), // Kurdish (Central)
// Contributor('Rohit Burman', 'rohitburman31p@rediffmail.com'), // Hindi
};
@override
Widget build(BuildContext context) {
return Padding(
@ -72,7 +21,7 @@ class AboutTranslators extends StatelessWidget {
AboutSectionTitle(text: context.l10n.aboutTranslatorsSectionTitle),
const SizedBox(height: 8),
_RandomTextSpanHighlighter(
spans: translators.map((v) => v.name).toList(),
spans: Contributors.translators.map((v) => v.name).toList(),
color: Theme.of(context).colorScheme.onPrimary,
),
const SizedBox(height: 16),
@ -163,10 +112,3 @@ class _RandomTextSpanHighlighterState extends State<_RandomTextSpanHighlighter>
);
}
}
class Contributor {
final String name;
final String? weblateEmail;
const Contributor(this.name, this.weblateEmail);
}

View file

@ -1,6 +1,7 @@
import 'dart:async';
import 'package:aves/app_mode.dart';
import 'package:aves/model/app/permissions.dart';
import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/favourites.dart';
import 'package:aves/model/filters/favourite.dart';
@ -14,7 +15,6 @@ import 'package:aves/model/source/section_keys.dart';
import 'package:aves/ref/mime_types.dart';
import 'package:aves/theme/durations.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/widgets/collection/app_bar.dart';
import 'package:aves/widgets/collection/draggable_thumb_label.dart';
import 'package:aves/widgets/collection/grid/list_details_theme.dart';
@ -716,5 +716,5 @@ class _CollectionScrollViewState extends State<_CollectionScrollView> with Widge
return crumbs;
}
Future<bool> get _isStoragePermissionGranted => Future.wait(Constants.storagePermissions.map((v) => v.status)).then((v) => v.any((status) => status.isGranted));
Future<bool> get _isStoragePermissionGranted => Future.wait(Permissions.storage.map((v) => v.status)).then((v) => v.any((status) => status.isGranted));
}

View file

@ -1,5 +1,6 @@
import 'dart:async';
import 'package:aves/theme/colors.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/widgets/common/action_controls/quick_choosers/common/quick_chooser.dart';
import 'package:flutter/material.dart';
@ -72,7 +73,7 @@ class _RateQuickChooserState extends State<RateQuickChooser> {
padding: const EdgeInsets.all(4),
child: Icon(
_rating < thisRating ? AIcons.rating : AIcons.ratingFull,
color: _rating < thisRating ? Colors.grey : Colors.amber,
color: _rating < thisRating ? AColors.starDisabled : AColors.starEnabled,
),
);
}).toList(),

View file

@ -0,0 +1,30 @@
import 'package:aves/widgets/common/fx/borders.dart';
import 'package:flutter/widgets.dart';
class ColorIndicator extends StatelessWidget {
final Color? value;
final Widget? child;
static const double radius = 16;
const ColorIndicator({
super.key,
required this.value,
this.child,
});
@override
Widget build(BuildContext context) {
const dimension = radius * 2;
return Container(
height: dimension,
width: dimension,
decoration: BoxDecoration(
color: value,
border: AvesBorder.border(context),
shape: BoxShape.circle,
),
child: child,
);
}
}

View file

@ -1,9 +1,8 @@
import 'package:aves/model/settings/settings.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/widgets/common/basic/color_indicator.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/fx/borders.dart';
import 'package:aves/widgets/dialogs/aves_dialog.dart';
import 'package:flex_color_picker/flex_color_picker.dart';
import 'package:flex_color_picker/flex_color_picker.dart' show ColorPicker, ColorPickerType;
import 'package:flutter/material.dart';
class ColorListTile extends StatelessWidget {
@ -11,8 +10,6 @@ class ColorListTile extends StatelessWidget {
final Color value;
final ValueSetter<Color> onChanged;
static const radius = Constants.colorPickerRadius;
const ColorListTile({
super.key,
required this.title,
@ -24,16 +21,10 @@ class ColorListTile extends StatelessWidget {
Widget build(BuildContext context) {
return ListTile(
title: Text(title),
trailing: Container(
height: radius * 2,
width: radius * 2,
decoration: BoxDecoration(
color: value,
border: AvesBorder.border(context),
shape: BoxShape.circle,
trailing: ColorIndicator(
value: value,
),
),
contentPadding: const EdgeInsetsDirectional.only(start: 16, end: 36 - radius),
contentPadding: const EdgeInsetsDirectional.only(start: 16, end: 36 - ColorIndicator.radius),
onTap: () async {
final color = await showDialog<Color>(
context: context,

View file

@ -1,4 +1,5 @@
import 'package:aves/model/entry/entry.dart';
import 'package:aves/theme/colors.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/providers/media_query_data_provider.dart';
@ -73,7 +74,7 @@ class _EditEntryRatingDialogState extends State<EditEntryRatingDialog> {
padding: const EdgeInsets.all(4),
child: Icon(
_rating < thisRating ? AIcons.rating : AIcons.ratingFull,
color: _rating < thisRating ? Colors.grey : Colors.amber,
color: _rating < thisRating ? AColors.starDisabled : AColors.starEnabled,
),
),
);

View file

@ -9,7 +9,7 @@ import 'package:aves/model/settings/settings.dart';
import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/model/source/collection_source.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/widgets/common/basic/color_indicator.dart';
import 'package:aves/widgets/common/basic/list_tiles/color.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/fx/borders.dart';
@ -56,7 +56,6 @@ class _CoverSelectionDialogState extends State<CoverSelectionDialog> {
static const double itemPickerExtent = 46;
static const double appPickerExtent = 32;
static const double colorPickerRadius = Constants.colorPickerRadius;
double tabBarHeight(BuildContext context) => 64 * max(1, MediaQuery.textScaleFactorOf(context));
@ -323,14 +322,8 @@ class _CoverSelectionDialogState extends State<CoverSelectionDialog> {
if (_customColor != null)
GestureDetector(
onTap: _pickColor,
child: Container(
height: colorPickerRadius * 2,
width: colorPickerRadius * 2,
decoration: BoxDecoration(
color: _customColor,
border: AvesBorder.border(context),
shape: BoxShape.circle,
),
child: ColorIndicator(
value: _customColor,
),
),
],

View file

@ -1,6 +1,7 @@
import 'dart:async';
import 'package:aves/app_mode.dart';
import 'package:aves/model/app/permissions.dart';
import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/entry/extensions/catalog.dart';
import 'package:aves/model/filters/album.dart';
@ -17,7 +18,6 @@ import 'package:aves/services/global_search.dart';
import 'package:aves/services/intent_service.dart';
import 'package:aves/services/widget_service.dart';
import 'package:aves/utils/android_file_utils.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/widgets/collection/collection_page.dart';
import 'package:aves/widgets/common/basic/scaffold.dart';
import 'package:aves/widgets/common/behaviour/routes.dart';
@ -97,11 +97,7 @@ class _HomePageState extends State<HomePage> {
if (await windowService.isActivity()) {
// do not check whether permission was granted, because some app stores
// hide in some countries apps that force quit on permission denial
await [
...Constants.storagePermissions,
// to access media with unredacted metadata with scoped storage (Android >=10)
Permission.accessMediaLocation,
].request();
await Permissions.mediaAccess.request();
}
var appMode = AppMode.main;

View file

@ -6,7 +6,7 @@ import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/entry/extensions/images.dart';
import 'package:aves/model/settings/enums/enums.dart';
import 'package:aves/model/settings/enums/widget_shape.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/theme/colors.dart';
import 'package:aves/widgets/common/identity/aves_filter_chip.dart';
import 'package:flutter/material.dart';
@ -17,7 +17,7 @@ class HomeWidgetPainter {
static const backgroundGradient = LinearGradient(
begin: Alignment.bottomLeft,
end: Alignment.topRight,
colors: Constants.boraBoraGradientColors,
colors: AColors.boraBoraGradient,
);
HomeWidgetPainter({

View file

@ -1,5 +1,5 @@
import 'package:aves/theme/durations.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/widgets/common/identity/aves_filter_chip.dart';
import 'package:decorated_icon/decorated_icon.dart';
import 'package:flutter/material.dart';
@ -30,7 +30,7 @@ class SettingsTileLeading extends StatelessWidget {
icon,
size: 18,
color: DefaultTextStyle.of(context).style.color,
shadows: Theme.of(context).brightness == Brightness.dark ? Constants.embossShadows : null,
shadows: Theme.of(context).brightness == Brightness.dark ? AStyles.embossShadows : null,
),
);
}

View file

@ -6,10 +6,9 @@ import 'package:aves/model/settings/settings.dart';
import 'package:aves/services/widget_service.dart';
import 'package:aves/theme/durations.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/widgets/common/basic/color_indicator.dart';
import 'package:aves/widgets/common/basic/scaffold.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/fx/borders.dart';
import 'package:aves/widgets/common/identity/buttons/outlined_button.dart';
import 'package:aves/widgets/home_widget.dart';
import 'package:aves/widgets/settings/common/collection_tile.dart';
@ -218,7 +217,6 @@ class HomeWidgetOutlineSelector extends StatefulWidget {
}
class _HomeWidgetOutlineSelectorState extends State<HomeWidgetOutlineSelector> {
static const radius = Constants.colorPickerRadius;
static const List<Color?> options = [
null,
Colors.black,
@ -243,14 +241,8 @@ class _HomeWidgetOutlineSelectorState extends State<HomeWidgetOutlineSelector> {
return options.map((selected) {
return DropdownMenuItem<Color?>(
value: selected,
child: Container(
height: radius * 2,
width: radius * 2,
decoration: BoxDecoration(
color: selected,
border: AvesBorder.border(context),
shape: BoxShape.circle,
),
child: ColorIndicator(
value: selected,
child: selected == null ? const Icon(AIcons.clear) : null,
),
);

View file

@ -1,6 +1,6 @@
import 'package:aves/model/settings/enums/enums.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/theme/colors.dart';
import 'package:aves/widgets/common/basic/text/background_painter.dart';
import 'package:aves/widgets/common/basic/text/outlined.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
@ -35,7 +35,7 @@ class SubtitleSample extends StatelessWidget {
gradient: const LinearGradient(
begin: Alignment.bottomLeft,
end: Alignment.topRight,
colors: Constants.boraBoraGradientColors,
colors: AColors.boraBoraGradient,
),
border: AvesBorder.border(context),
borderRadius: const BorderRadius.all(Radius.circular(24)),

View file

@ -1,7 +1,6 @@
import 'package:aves/model/settings/enums/entry_background.dart';
import 'package:aves/model/settings/enums/enums.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/widgets/common/fx/borders.dart';
import 'package:aves/widgets/common/basic/color_indicator.dart';
import 'package:aves/widgets/common/fx/checkered_decoration.dart';
import 'package:flutter/material.dart';
@ -20,8 +19,6 @@ class EntryBackgroundSelector extends StatefulWidget {
}
class _EntryBackgroundSelectorState extends State<EntryBackgroundSelector> {
static const radius = Constants.colorPickerRadius;
@override
Widget build(BuildContext context) {
return DropdownButtonHideUnderline(
@ -46,19 +43,13 @@ class _EntryBackgroundSelectorState extends State<EntryBackgroundSelector> {
].map((selected) {
return DropdownMenuItem<EntryBackground>(
value: selected,
child: Container(
height: radius * 2,
width: radius * 2,
decoration: BoxDecoration(
color: selected.isColor ? selected.color : null,
border: AvesBorder.border(context),
shape: BoxShape.circle,
),
child: ColorIndicator(
value: selected.isColor ? selected.color : null,
child: selected == EntryBackground.checkered
? ClipOval(
child: CustomPaint(
painter: CheckeredPainter(
checkSize: radius,
checkSize: ColorIndicator.radius,
),
),
)

View file

@ -1,4 +1,4 @@
import 'package:aves/utils/constants.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/widgets/common/basic/text/outlined.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
@ -20,7 +20,7 @@ class LinearPercentIndicatorText extends StatelessWidget {
TextSpan(
text: percentFormat.format(percent),
style: TextStyle(
shadows: theme.brightness == Brightness.dark ? Constants.embossShadows : null,
shadows: theme.brightness == Brightness.dark ? AStyles.embossShadows : null,
),
)
],

View file

@ -7,7 +7,6 @@ import 'package:aves/model/settings/settings.dart';
import 'package:aves/ref/mime_types.dart';
import 'package:aves/services/android_debug_service.dart';
import 'package:aves/services/geocoding_service.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/widgets/common/identity/aves_expansion_tile.dart';
import 'package:aves/widgets/viewer/info/common.dart';
import 'package:flutter/material.dart';
@ -101,10 +100,7 @@ class _MetadataTabState extends State<MetadataTab> {
if (data.isNotEmpty)
Padding(
padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8),
child: InfoRowGroup(
info: data,
maxValueLength: Constants.infoGroupMaxValueLength,
),
child: InfoRowGroup(info: data),
)
],
);

View file

@ -45,8 +45,9 @@ class InfoRowGroup extends StatefulWidget {
final int maxValueLength;
final Map<String, InfoValueSpanBuilder> spanBuilders;
static const keyValuePadding = 16;
static const fontSize = 13.0;
static const int defaultMaxValueLength = 140;
static const double keyValuePadding = 16;
static const double fontSize = 13;
static const valueStyle = TextStyle(fontSize: fontSize);
static final _keyStyle = valueStyle.copyWith(height: 2.0);
@ -55,7 +56,7 @@ class InfoRowGroup extends StatefulWidget {
const InfoRowGroup({
super.key,
required this.info,
this.maxValueLength = 0,
this.maxValueLength = defaultMaxValueLength,
Map<String, InfoValueSpanBuilder>? spanBuilders,
}) : spanBuilders = spanBuilders ?? const {};

View file

@ -4,7 +4,6 @@ import 'package:aves/model/entry/entry.dart';
import 'package:aves/ref/brand_colors.dart';
import 'package:aves/services/metadata/svg_metadata_service.dart';
import 'package:aves/theme/colors.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/identity/aves_expansion_tile.dart';
import 'package:aves/widgets/viewer/info/common.dart';
@ -117,7 +116,6 @@ class MetadataDirTileBody extends StatelessWidget {
padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8),
child: InfoRowGroup(
info: tags,
maxValueLength: Constants.infoGroupMaxValueLength,
spanBuilders: linkHandlers,
),
),

View file

@ -2,7 +2,6 @@ import 'dart:math';
import 'package:aves/theme/durations.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/widgets/common/basic/multi_cross_fader.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/identity/highlight_title.dart';
@ -127,7 +126,6 @@ class _XmpCardState extends State<XmpCard> {
padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8),
child: InfoRowGroup(
info: Map.fromEntries(props.map((prop) => MapEntry(prop.displayKey, widget.formatValue(prop)))),
maxValueLength: Constants.infoGroupMaxValueLength,
spanBuilders: widget.spanBuilders?.call(_isIndexed ? index + 1 : null),
),
),

View file

@ -1,6 +1,5 @@
import 'package:aves/ref/brand_colors.dart';
import 'package:aves/theme/colors.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/utils/string_utils.dart';
import 'package:aves/utils/xmp_utils.dart';
import 'package:aves/widgets/common/identity/highlight_title.dart';
@ -103,7 +102,6 @@ class XmpNamespace extends Equatable {
if (props.isNotEmpty)
InfoRowGroup(
info: Map.fromEntries(props.map((v) => MapEntry(v.displayKey, formatValue(v)))),
maxValueLength: Constants.infoGroupMaxValueLength,
spanBuilders: linkifyValues(props),
),
...cards.where((v) => !v.isEmpty).map((card) {

View file

@ -5,7 +5,7 @@ import 'package:aves/model/metadata/overlay.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/services/common/services.dart';
import 'package:aves/theme/durations.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/widgets/viewer/multipage/controller.dart';
import 'package:aves/widgets/viewer/overlay/details/date.dart';
import 'package:aves/widgets/viewer/overlay/details/description.dart';
@ -135,7 +135,7 @@ class ViewerDetailOverlayContent extends StatelessWidget {
static const double iconPadding = 8.0;
static const double iconSize = 16.0;
static List<Shadow>? shadows(BuildContext context) => Theme.of(context).brightness == Brightness.dark ? Constants.embossShadows : null;
static List<Shadow>? shadows(BuildContext context) => Theme.of(context).brightness == Brightness.dark ? AStyles.embossShadows : null;
const ViewerDetailOverlayContent({
super.key,

View file

@ -3,8 +3,8 @@ import 'dart:async';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/theme/format.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/theme/styles.dart';
import 'package:aves/theme/themes.dart';
import 'package:aves/utils/constants.dart';
import 'package:aves/widgets/common/fx/blurred.dart';
import 'package:aves/widgets/common/fx/borders.dart';
import 'package:aves_video/aves_video.dart';
@ -42,7 +42,7 @@ class _VideoProgressBarState extends State<VideoProgressBar> {
final blurred = settings.enableBlurEffect;
final brightness = Theme.of(context).brightness;
final textStyle = TextStyle(
shadows: brightness == Brightness.dark ? Constants.embossShadows : null,
shadows: brightness == Brightness.dark ? AStyles.embossShadows : null,
);
return SizeTransition(
sizeFactor: widget.scale,

View file

@ -388,7 +388,7 @@ class AssParser {
);
}
static String _replaceChars(String text) => text.replaceAll(r'\h', Unicode.noBreakSpace).replaceAll(r'\N', '\n').trim();
static String _replaceChars(String text) => text.replaceAll(r'\h', UniChars.noBreakSpace).replaceAll(r'\N', '\n').trim();
static int? _parseAlpha(String param) {
final match = alphaPattern.firstMatch(param);