Skip to content

Commit

Permalink
chore: performance improvements and fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
MSOB7YY committed Dec 12, 2023
1 parent 3362ba8 commit 628ba9b
Show file tree
Hide file tree
Showing 12 changed files with 130 additions and 73 deletions.
8 changes: 3 additions & 5 deletions lib/controller/json_to_history_parser.dart
Original file line number Diff line number Diff line change
Expand Up @@ -601,18 +601,16 @@ class JsonToHistoryParser {
final oldestDay = oldestDate?.toDaysSince1970();
final newestDay = newestDate?.toDaysSince1970();

totalJsonToParse.value = file.readAsLinesSync().length;
final lines = await file.readAsLines();
totalJsonToParse.value = lines.length;
isLoadingFile.value = false;

final stream = file.openRead();
final lines = stream.transform(utf8.decoder).transform(const LineSplitter());

final totalDaysToSave = <int>[];
final tracksToAdd = <TrackWithDate>[];

// used for cases where date couldnt be parsed, so it uses this one as a reference
int? lastDate;
await for (final line in lines) {
for (final line in lines) {
parsedHistoryJson.value++;

/// updates history every 10 tracks
Expand Down
1 change: 1 addition & 0 deletions lib/controller/scroll_search_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ class ScrollSearchController {

void _assignScrollController(LibraryTab tab) {
scrollController.removeListener(() {});
scrollController.dispose();
scrollController = ScrollController(initialScrollOffset: tab.scrollPosition);
scrollController.addListener(() {
isBarVisibleMap[tab]?.value = scrollController.positions.lastOrNull?.userScrollDirection == ScrollDirection.forward;
Expand Down
13 changes: 12 additions & 1 deletion lib/core/extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,7 @@ extension FunctionsExecuter<T> on Iterable<Future<T>?> {
extension DirectoryUtils on Directory {
List<FileSystemEntity> listSyncSafe({bool recursive = false, bool followLinks = true}) {
try {
return listSyncSafe(recursive: recursive, followLinks: followLinks);
return listSync(recursive: recursive, followLinks: followLinks);
} catch (e) {
return [];
}
Expand Down Expand Up @@ -468,6 +468,17 @@ extension NavigatorUtils on BuildContext? {
}
}

extension DisposingScrollUtils on ScrollController {
Future<void> disposeAfterAnimation({int durationMS = 2000, void Function()? also}) async {
void fn() {
dispose();
if (also != null) also();
}

await fn.executeDelayed(Duration(milliseconds: durationMS));
}
}

extension DisposingUtils on TextEditingController {
Future<void> disposeAfterAnimation({int durationMS = 2000, void Function()? also}) async {
void fn() {
Expand Down
9 changes: 8 additions & 1 deletion lib/core/functions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,14 @@ class NamidaOnTaps {
HistoryController.inst.indexToHighlight.value = indexToHighlight;
HistoryController.inst.dayOfHighLight.value = dayOfHighLight;

void jump() => HistoryController.inst.scrollController.jumpTo(initialScrollOffset);
void jump() {
if (HistoryController.inst.scrollController.hasClients) {
final p = HistoryController.inst.scrollController.positions.firstOrNull;
if (p != null && p.hasContentDimensions) {
HistoryController.inst.scrollController.jumpTo(initialScrollOffset);
}
}
}

if (NamidaNavigator.inst.currentRoute?.route == RouteType.SUBPAGE_historyTracks) {
NamidaNavigator.inst.closeAllDialogs();
Expand Down
5 changes: 3 additions & 2 deletions lib/ui/dialogs/setting_dialog_with_text_field.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import 'package:namida/core/icon_fonts/broken_icons.dart';
import 'package:namida/core/translations/language.dart';
import 'package:namida/ui/widgets/custom_widgets.dart';

void showSettingDialogWithTextField({
Future<void> showSettingDialogWithTextField({
Widget? topWidget,
String title = '',
Widget? iconWidgets,
Expand Down Expand Up @@ -51,7 +51,7 @@ void showSettingDialogWithTextField({

void onTTSetChange() => onTrackTileSettingsChanged?.call();

NamidaNavigator.inst.navigateDialog(
await NamidaNavigator.inst.navigateDialog(
dialog: Form(
key: formKey,
child: CustomBlurryDialog(
Expand Down Expand Up @@ -202,4 +202,5 @@ void showSettingDialogWithTextField({
),
),
);
controller.disposeAfterAnimation();
}
5 changes: 3 additions & 2 deletions lib/ui/pages/home_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ class _HomePageState extends State<HomePage> with SingleTickerProviderStateMixin
);
}

void showReorderHomeItemsDialog() {
void showReorderHomeItemsDialog() async {
final subList = <HomePageItems>[].obs;
HomePageItems.values.loop((e, index) {
if (!settings.homePageItems.contains(e)) {
Expand All @@ -319,7 +319,7 @@ class _HomePageState extends State<HomePage> with SingleTickerProviderStateMixin
jumpToLast();
});

NamidaNavigator.inst.navigateDialog(
await NamidaNavigator.inst.navigateDialog(
dialog: CustomBlurryDialog(
title: "${lang.CONFIGURE} (${lang.REORDERABLE})",
actions: [
Expand Down Expand Up @@ -406,6 +406,7 @@ class _HomePageState extends State<HomePage> with SingleTickerProviderStateMixin
),
),
);
mainListController.disposeAfterAnimation();
}

void _navigateToRecentlyListened() {
Expand Down
6 changes: 6 additions & 0 deletions lib/ui/pages/onboarding.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,12 @@ class _FirstRunConfigureScreenState extends State<FirstRunConfigureScreen> {
_requestPermission(request: false); // just to set it to true only if granted.
}

@override
void dispose() {
c.dispose();
super.dispose();
}

Future<void> _requestPermission({bool request = true}) async {
didGrantStoragePermission = await requestStoragePermission(request: request);
if (request) didDenyStoragePermission = !didGrantStoragePermission; // if user denied permission after requested
Expand Down
6 changes: 2 additions & 4 deletions lib/ui/pages/queues_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,10 @@ class QueuesPage extends StatelessWidget {
const QueuesPage({super.key});
@override
Widget build(BuildContext context) {
final sc = ScrollController();
return AnimationLimiter(
child: BackgroundWrapper(
child: NamidaScrollbar(
controller: sc,
child: CustomScrollView(
child: NamidaScrollbarWithController(
child: (sc) => CustomScrollView(
controller: sc,
slivers: [
const SliverPadding(padding: EdgeInsets.only(top: Dimensions.tileBottomMargin6)),
Expand Down
8 changes: 3 additions & 5 deletions lib/ui/pages/search_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ class SearchPage extends StatelessWidget {

@override
Widget build(BuildContext context) {
final ScrollController scrollController = ScrollController();
final albumDimensions = Dimensions.inst.getAlbumCardDimensions(Dimensions.albumSearchGridCount);
final artistDimensions = Dimensions.inst.getArtistCardDimensions(Dimensions.artistSearchGridCount);
final genreDimensions = Dimensions.inst.getArtistCardDimensions(Dimensions.genreSearchGridCount);
Expand Down Expand Up @@ -183,9 +182,8 @@ class SearchPage extends StatelessWidget {
)
: AnimationLimiter(
key: const Key('fullsearch'),
child: NamidaScrollbar(
controller: scrollController,
child: Obx(
child: NamidaScrollbarWithController(
child: (sc) => Obx(
() {
final activeList = settings.activeSearchMediaTypes;

Expand All @@ -196,7 +194,7 @@ class SearchPage extends StatelessWidget {
final folderSearchTemp = SearchSortController.inst.folderSearchTemp.where((f) => Folder(f).tracks.isNotEmpty).toList();

return CustomScrollView(
controller: scrollController,
controller: sc,
slivers: [
// == Albums ==
if (activeList.contains(MediaType.album) && albumSearchTemp.isNotEmpty) ...[
Expand Down
43 changes: 38 additions & 5 deletions lib/ui/widgets/custom_widgets.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2191,18 +2191,17 @@ class NamidaListView extends StatelessWidget {

@override
Widget build(BuildContext context) {
final sc = scrollController ?? ScrollController();
return AnimationLimiter(
child: NamidaScrollbar(
controller: sc,
controller: scrollController,
child: Column(
children: [
if (widgetsInColumn != null) ...widgetsInColumn!,
Expanded(
child: itemExtents != null
? KnownExtentsReorderableListView.builder(
itemExtents: itemExtents!,
scrollController: sc,
scrollController: scrollController,
padding: padding ?? EdgeInsets.only(bottom: Dimensions.inst.globalBottomPaddingTotal),
itemBuilder: itemBuilder,
itemCount: itemCount,
Expand All @@ -2216,7 +2215,7 @@ class NamidaListView extends StatelessWidget {
)
: ReorderableListView.builder(
itemExtent: itemExtents?.firstOrNull,
scrollController: sc,
scrollController: scrollController,
padding: padding ?? EdgeInsets.only(bottom: Dimensions.inst.globalBottomPaddingTotal),
itemBuilder: itemBuilder,
itemCount: itemCount,
Expand Down Expand Up @@ -2661,7 +2660,7 @@ class LazyLoadListView extends StatefulWidget {
}

class _LazyLoadListViewState extends State<LazyLoadListView> {
late ScrollController controller;
late final ScrollController controller;
bool isExecuting = false;

void _scrollListener() async {
Expand All @@ -2683,6 +2682,9 @@ class _LazyLoadListViewState extends State<LazyLoadListView> {
@override
void dispose() {
controller.removeListener(_scrollListener);
if (widget.scrollController == null) {
controller.dispose();
}
super.dispose();
}

Expand Down Expand Up @@ -3028,6 +3030,37 @@ class NamidaScrollbar extends StatelessWidget {
}
}

class NamidaScrollbarWithController extends StatefulWidget {
final Widget Function(ScrollController sc) child;
const NamidaScrollbarWithController({super.key, required this.child});

@override
State<NamidaScrollbarWithController> createState() => _NamidaScrollbarWithControllerState();
}

class _NamidaScrollbarWithControllerState extends State<NamidaScrollbarWithController> {
late final ScrollController _sc;
@override
void initState() {
_sc = ScrollController();
super.initState();
}

@override
void dispose() {
_sc.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return CupertinoScrollbar(
controller: _sc,
child: widget.child(_sc),
);
}
}

class NamidaAZScrollbar extends StatefulWidget {
final Widget child;
final ScrollController? controller;
Expand Down
98 changes: 50 additions & 48 deletions lib/ui/widgets/settings/customization_settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -236,59 +236,61 @@ class CustomizationSettings extends SettingSubpageProvider {
icon: Broken.calendar_edit,
title: lang.DATE_TIME_FORMAT,
trailingText: "${settings.dateTimeFormat}",
onTap: () {
final ScrollController scrollController = ScrollController();
onTap: () async {
final scrollController = ScrollController();

showSettingDialogWithTextField(
title: lang.DATE_TIME_FORMAT,
icon: Broken.calendar_edit,
dateTimeFormat: true,
topWidget: SizedBox(
height: Get.height * 0.4,
child: Padding(
padding: const EdgeInsets.only(bottom: 58.0),
child: Stack(
children: [
SingleChildScrollView(
controller: scrollController,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
...kDefaultDateTimeStrings.entries.map(
(e) => SmallListTile(
title: e.value,
active: settings.dateTimeFormat.value == e.key,
onTap: () {
settings.save(dateTimeFormat: e.key);
NamidaNavigator.inst.closeDialog();
},
),
await showSettingDialogWithTextField(
title: lang.DATE_TIME_FORMAT,
icon: Broken.calendar_edit,
dateTimeFormat: true,
topWidget: SizedBox(
height: Get.height * 0.4,
child: Padding(
padding: const EdgeInsets.only(bottom: 58.0),
child: Stack(
children: [
SingleChildScrollView(
controller: scrollController,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
...kDefaultDateTimeStrings.entries.map(
(e) => SmallListTile(
title: e.value,
active: settings.dateTimeFormat.value == e.key,
onTap: () {
settings.save(dateTimeFormat: e.key);
NamidaNavigator.inst.closeDialog();
},
),
],
),
),
Positioned(
bottom: 20,
right: 0,
child: Container(
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(color: Get.theme.cardTheme.color, shape: BoxShape.circle),
child: NamidaIconButton(
icon: Broken.arrow_circle_down,
onPressed: () {
scrollController.animateTo(
scrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
);
},
),
],
),
),
Positioned(
bottom: 20,
right: 0,
child: Container(
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(color: Get.theme.cardTheme.color, shape: BoxShape.circle),
child: NamidaIconButton(
icon: Broken.arrow_circle_down,
onPressed: () {
scrollController.animateTo(
scrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
);
},
),
)
],
),
),
)
],
),
));
),
),
);
scrollController.disposeAfterAnimation();
},
),
),
Expand Down
1 change: 1 addition & 0 deletions lib/youtube/pages/yt_playlist_subpage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@ class _YTHostedPlaylistSubpageState extends State<YTHostedPlaylistSubpage> {
@override
void dispose() {
controller.removeListener(_scrollListener);
controller.dispose();
super.dispose();
}

Expand Down

0 comments on commit 628ba9b

Please sign in to comment.