Skip to content

Commit 561c18b

Browse files
committed
chore: improve settings search for displaying unavailable settings
ref: #778
1 parent 80224d2 commit 561c18b

16 files changed

+305
-192
lines changed

lib/base/audio_handler.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2176,7 +2176,7 @@ class NamidaAudioVideoHandler<Q extends Playable> extends BasicAudioHandler<Q> {
21762176

21772177
@override
21782178
MediaControlsProvider get mediaControls => _mediaControls;
2179-
static final _mediaControls = Platform.isAndroid && NamidaDeviceInfo.sdkVersion >= 33
2179+
static final _mediaControls = Platform.isAndroid && NamidaFeaturesAvailablity.android13and_plus.resolve()
21802180
? MediaControlsProvider.android13plus() // can crash on android below 13
21812181
: MediaControlsProvider.main();
21822182

lib/base/setting_subpage_provider.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'package:namida/core/extensions.dart';
88

99
abstract class SettingSubpageProvider extends StatelessWidget {
1010
SettingSubpageEnum get settingPage;
11-
Map<Enum, List<String>> get lookupMap;
11+
Map<SettingKeysBase, List<String>> get lookupMap;
1212
final Enum? initialItem;
1313

1414
const SettingSubpageProvider({super.key, this.initialItem});
@@ -22,6 +22,11 @@ abstract class SettingSubpageProvider extends StatelessWidget {
2222
}
2323

2424
Widget getItemWrapper({required Enum key, required Widget child}) {
25+
final availability = (key as SettingKeysBase).availability;
26+
27+
final isAvailable = availability?.resolve();
28+
if (isAvailable == false) return const SizedBox();
29+
2530
return Stack(
2631
key: getSettingWidgetGlobalKey(key),
2732
children: [

lib/controller/settings_search_controller.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
33
import 'package:namida/base/setting_subpage_provider.dart';
44
import 'package:namida/class/route.dart';
55
import 'package:namida/controller/navigator_controller.dart';
6+
import 'package:namida/core/constants.dart';
67
import 'package:namida/core/enums.dart';
78
import 'package:namida/core/extensions.dart';
89
import 'package:namida/core/icon_fonts/broken_icons.dart';
@@ -18,6 +19,10 @@ import 'package:namida/ui/widgets/settings/playback_settings.dart';
1819
import 'package:namida/ui/widgets/settings/theme_settings.dart';
1920
import 'package:namida/ui/widgets/settings/youtube_settings.dart';
2021

22+
mixin SettingKeysBase {
23+
NamidaFeaturesAvailablity? get availability => null;
24+
}
25+
2126
extension _SettSearcherUtils on SettingSubpageEnum {
2227
CustomCollapsedListTile? toSettingSubPageDetails({Enum? initialItem}) {
2328
switch (this) {
@@ -102,7 +107,7 @@ class SettingsSearchController {
102107
SettingsSearchController._internal();
103108

104109
final _map = <SettingSubpageEnum, Map<int, GlobalKey>>{};
105-
var _allWidgets = <(SettingSubpageProvider, Map<Enum, List<String>>)>[];
110+
var _allWidgets = <(SettingSubpageProvider, Map<SettingKeysBase, List<String>>)>[];
106111
final searchResults = <SettingSubpageEnum, List<SettingSearchResultItem>>{}.obs;
107112
final subpagesDetails = <SettingSubpageEnum, CustomCollapsedListTile?>{};
108113

@@ -165,7 +170,7 @@ class SettingsSearchController {
165170
p,
166171
SettingSearchResultItem(
167172
page: p,
168-
key: e.key,
173+
key: e.key as Enum,
169174
titles: e.value,
170175
),
171176
);

lib/core/constants.dart

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -846,17 +846,44 @@ extension PathTypeUtils on String {
846846
bool isVideo() => NamidaFileExtensionsWrapper.video.isPathValid(this);
847847
}
848848

849+
enum NamidaFeaturesAvailablity {
850+
android('Android'),
851+
windows('Windows'),
852+
android13and_plus('Android 13+'), // >= 33
853+
android12and_plus('Android S/12+'), // >= 31
854+
android12and_below('Android <= 12'), // <= 32
855+
android11and_plus('Android 11+'), // >=30
856+
android11and_below('Android <= 11'), // <=30
857+
;
858+
859+
final String text;
860+
const NamidaFeaturesAvailablity(this.text);
861+
862+
bool resolve() {
863+
final isAndroid = NamidaFeaturesVisibility._isAndroid;
864+
return switch (this) {
865+
NamidaFeaturesAvailablity.android => isAndroid,
866+
NamidaFeaturesAvailablity.windows => NamidaFeaturesVisibility._isWindows,
867+
NamidaFeaturesAvailablity.android13and_plus => isAndroid && NamidaDeviceInfo.sdkVersion >= 33,
868+
NamidaFeaturesAvailablity.android12and_plus => isAndroid && NamidaDeviceInfo.sdkVersion >= 31,
869+
NamidaFeaturesAvailablity.android12and_below => isAndroid && NamidaDeviceInfo.sdkVersion <= 32,
870+
NamidaFeaturesAvailablity.android11and_plus => isAndroid && NamidaDeviceInfo.sdkVersion >= 30,
871+
NamidaFeaturesAvailablity.android11and_below => isAndroid && NamidaDeviceInfo.sdkVersion <= 30,
872+
};
873+
}
874+
}
875+
849876
class NamidaFeaturesVisibility {
850877
static final _platform = defaultTargetPlatform;
851878
static final _isAndroid = _platform == TargetPlatform.android;
852879
static final _isWindows = _platform == TargetPlatform.windows;
853880

854-
static final wallpaperColors = _isAndroid && NamidaDeviceInfo.sdkVersion >= 31;
855-
static final displayArtworkOnLockscreen = _isAndroid && NamidaDeviceInfo.sdkVersion < 33;
881+
static final wallpaperColors = NamidaFeaturesAvailablity.android12and_plus.resolve();
882+
static final displayArtworkOnLockscreen = NamidaFeaturesAvailablity.android12and_below.resolve();
856883
static final displayFavButtonInNotif = _isAndroid;
857-
static final displayFavButtonInNotifMightCauseIssue = displayFavButtonInNotif && NamidaDeviceInfo.sdkVersion < 31;
884+
static final displayFavButtonInNotifMightCauseIssue = displayFavButtonInNotif && NamidaFeaturesAvailablity.android11and_below.resolve();
858885
static final displayStopButtonInNotif = _isAndroid;
859-
static final shouldRequestManageAllFilesPermission = _isAndroid && NamidaDeviceInfo.sdkVersion >= 30;
886+
static final shouldRequestManageAllFilesPermission = NamidaFeaturesAvailablity.android11and_plus.resolve();
860887
static final displayAppIcons = _isAndroid;
861888
static final showEqualizerBands = _isAndroid;
862889
static final showToggleMediaStore = onAudioQueryAvailable;

lib/core/translations/keys.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ abstract class LanguageKeys {
459459
String get NORMALIZE_AUDIO => _getKey('NORMALIZE_AUDIO');
460460
String get NORMALIZE_AUDIO_SUBTITLE => _getKey('NORMALIZE_AUDIO_SUBTITLE');
461461
String get NOTIFICATION => _getKey('NOTIFICATION');
462+
String get NOT_AVAILABLE_FOR_YOUR_DEVICE => _getKey('NOT_AVAILABLE_FOR_YOUR_DEVICE');
462463
String get NO_CHANGES_FOUND => _getKey('NO_CHANGES_FOUND');
463464
String get NO_ENOUGH_TRACKS => _getKey('NO_ENOUGH_TRACKS');
464465
String get NO_EXCLUDED_FOLDERS => _getKey('NO_EXCLUDED_FOLDERS');

lib/ui/pages/onboarding.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ class _FirstRunConfigureScreenState extends State<FirstRunConfigureScreen> {
182182
languageTile,
183183
performanceTile,
184184
libraryTabsTile,
185-
if (useMediaStore != null) useMediaStore,
185+
useMediaStore,
186186
includeVideosWidget,
187187
groupArtworksByAlbum,
188188
foldersToScan,

lib/ui/pages/settings_search_page.dart

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import 'package:super_sliver_list/super_sliver_list.dart';
44

55
import 'package:namida/controller/settings_search_controller.dart';
66
import 'package:namida/core/dimensions.dart';
7+
import 'package:namida/core/extensions.dart';
8+
import 'package:namida/core/icon_fonts/broken_icons.dart';
9+
import 'package:namida/core/translations/language.dart';
710
import 'package:namida/core/utils.dart';
811
import 'package:namida/ui/widgets/custom_widgets.dart';
912

@@ -50,13 +53,43 @@ class SettingsSearchPage extends StatelessWidget {
5053
final index = indexPre - 1;
5154
final item = res[index];
5255

56+
final availability = (item.key as SettingKeysBase).availability;
57+
final isNotAvailable = availability?.resolve() == false;
58+
5359
final title = item.titles.firstOrNull ?? '';
54-
final subtitle = item.titles.length >= 2 ? item.titles[1] : null;
60+
final subtitleParts = [
61+
if (item.titles.length >= 2) item.titles[1],
62+
if (isNotAvailable) '${lang.NOT_AVAILABLE_FOR_YOUR_DEVICE} (${availability?.text})',
63+
];
64+
final subtitle = subtitleParts.isNotEmpty ? subtitleParts.join('\n') : null;
5565

56-
return CustomListTile(
66+
Widget tileWidget = CustomListTile(
67+
enabled: true,
5768
borderR: 16.0,
5869
visualDensity: VisualDensity.compact,
59-
title: "${index + 1}. $title",
70+
leading: ConstrainedBox(
71+
constraints: const BoxConstraints(minWidth: 24.0),
72+
child: isNotAvailable
73+
? const Icon(
74+
Broken.slash,
75+
size: 22.0,
76+
)
77+
: DecoratedBox(
78+
decoration: BoxDecoration(
79+
color: context.theme.cardColor,
80+
borderRadius: BorderRadius.circular(6.0.multipliedRadius),
81+
),
82+
child: Padding(
83+
padding: const EdgeInsets.symmetric(horizontal: 4.0, vertical: 3.0),
84+
child: Text(
85+
'${index + 1}',
86+
style: textTheme.displaySmall,
87+
textAlign: TextAlign.center,
88+
),
89+
),
90+
),
91+
),
92+
title: title,
6093
subtitle: subtitle,
6194
onTap: () {
6295
SettingsSearchController.inst.onResultTap(
@@ -66,6 +99,17 @@ class SettingsSearchPage extends StatelessWidget {
6699
);
67100
},
68101
);
102+
103+
if (isNotAvailable) {
104+
tileWidget = IgnorePointer(
105+
child: Opacity(
106+
opacity: 0.7,
107+
child: tileWidget,
108+
),
109+
);
110+
}
111+
112+
return tileWidget;
69113
},
70114
);
71115
},

lib/ui/widgets/settings/advanced_settings.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'package:namida/controller/history_controller.dart';
1616
import 'package:namida/controller/indexer_controller.dart';
1717
import 'package:namida/controller/navigator_controller.dart';
1818
import 'package:namida/controller/settings_controller.dart';
19+
import 'package:namida/controller/settings_search_controller.dart';
1920
import 'package:namida/controller/storage_cache_manager.dart';
2021
import 'package:namida/controller/video_controller.dart';
2122
import 'package:namida/core/constants.dart';
@@ -33,7 +34,7 @@ import 'package:namida/ui/widgets/settings/theme_settings.dart';
3334
import 'package:namida/ui/widgets/settings_card.dart';
3435
import 'package:namida/youtube/controller/youtube_history_controller.dart';
3536

36-
enum _AdvancedSettingKeys {
37+
enum _AdvancedSettingKeys with SettingKeysBase {
3738
performanceMode,
3839
rescanVideos,
3940
removeSourceHistory,
@@ -55,7 +56,7 @@ class AdvancedSettings extends SettingSubpageProvider {
5556
SettingSubpageEnum get settingPage => SettingSubpageEnum.advanced;
5657

5758
@override
58-
Map<Enum, List<String>> get lookupMap => {
59+
Map<SettingKeysBase, List<String>> get lookupMap => {
5960
_AdvancedSettingKeys.performanceMode: [lang.PERFORMANCE_MODE],
6061
_AdvancedSettingKeys.rescanVideos: [lang.RESCAN_VIDEOS],
6162
_AdvancedSettingKeys.removeSourceHistory: [lang.REMOVE_SOURCE_FROM_HISTORY],

lib/ui/widgets/settings/backup_restore_settings.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:namida/controller/json_to_history_parser.dart';
1010
import 'package:namida/controller/navigator_controller.dart';
1111
import 'package:namida/controller/platform/namida_channel/namida_channel.dart';
1212
import 'package:namida/controller/settings_controller.dart';
13+
import 'package:namida/controller/settings_search_controller.dart';
1314
import 'package:namida/core/constants.dart';
1415
import 'package:namida/core/enums.dart';
1516
import 'package:namida/core/extensions.dart';
@@ -23,7 +24,7 @@ import 'package:namida/ui/widgets/settings/extra_settings.dart';
2324
import 'package:namida/ui/widgets/settings_card.dart';
2425
import 'package:namida/youtube/controller/youtube_history_controller.dart';
2526

26-
enum _BackupAndRestoreKeys {
27+
enum _BackupAndRestoreKeys with SettingKeysBase {
2728
create,
2829
restore,
2930
defaultLocation,
@@ -40,7 +41,7 @@ class BackupAndRestore extends SettingSubpageProvider {
4041
SettingSubpageEnum get settingPage => SettingSubpageEnum.backupRestore;
4142

4243
@override
43-
Map<Enum, List<String>> get lookupMap => {
44+
Map<SettingKeysBase, List<String>> get lookupMap => {
4445
_BackupAndRestoreKeys.create: [lang.CREATE_BACKUP],
4546
_BackupAndRestoreKeys.restore: [lang.RESTORE_BACKUP],
4647
_BackupAndRestoreKeys.defaultLocation: [lang.DEFAULT_BACKUP_LOCATION],

0 commit comments

Comments
 (0)