Skip to content

Commit

Permalink
Add settings and behaviors to choose between dark light or follow sys…
Browse files Browse the repository at this point in the history
…tem theme
  • Loading branch information
mrkrash committed Jan 28, 2025
1 parent 2c924ac commit f92e177
Show file tree
Hide file tree
Showing 10 changed files with 84 additions and 708 deletions.
587 changes: 0 additions & 587 deletions ios/Runner.xcodeproj/project.pbxproj

This file was deleted.

87 changes: 0 additions & 87 deletions ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

This file was deleted.

14 changes: 7 additions & 7 deletions lib/bloc/settings/settings_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class SettingsBloc extends Bloc {
final log = Logger('SettingsBloc');
final SettingsService _settingsService;
final BehaviorSubject<AppSettings> _settings = BehaviorSubject<AppSettings>.seeded(AppSettings.sensibleDefaults());
final BehaviorSubject<bool> _darkMode = BehaviorSubject<bool>();
final BehaviorSubject<String> _themeMode = BehaviorSubject<String>();
final BehaviorSubject<bool> _markDeletedAsPlayed = BehaviorSubject<bool>();
final BehaviorSubject<bool> _deleteDownloadedPlayedEpisodes = BehaviorSubject<bool>();
final BehaviorSubject<bool> _storeDownloadOnSDCard = BehaviorSubject<bool>();
Expand Down Expand Up @@ -43,7 +43,7 @@ class SettingsBloc extends Bloc {
}

_currentSettings = AppSettings(
theme: _settingsService.themeDarkMode ? 'dark' : 'light',
theme: _settingsService.themeMode,
markDeletedEpisodesAsPlayed: _settingsService.markDeletedEpisodesAsPlayed,
deleteDownloadedPlayedEpisodes: _settingsService.deleteDownloadedPlayedEpisodes,
storeDownloadsSDCard: _settingsService.storeDownloadsSDCard,
Expand All @@ -61,10 +61,10 @@ class SettingsBloc extends Bloc {

_settings.add(_currentSettings);

_darkMode.listen((bool darkMode) {
_currentSettings = _currentSettings.copyWith(theme: darkMode ? 'dark' : 'light');
_themeMode.listen((String mode) {
_currentSettings = _currentSettings.copyWith(theme: mode);
_settings.add(_currentSettings);
_settingsService.themeDarkMode = darkMode;
_settingsService.themeMode = mode;
});

_markDeletedAsPlayed.listen((bool mark) {
Expand Down Expand Up @@ -150,7 +150,7 @@ class SettingsBloc extends Bloc {

Stream<AppSettings> get settings => _settings.stream;

void Function(bool) get darkMode => _darkMode.add;
void Function(String) get themeMode => _themeMode.add;

void Function(bool) get storeDownloadonSDCard => _storeDownloadOnSDCard.add;

Expand Down Expand Up @@ -180,7 +180,7 @@ class SettingsBloc extends Bloc {

@override
void dispose() {
_darkMode.close();
_themeMode.close();
_markDeletedAsPlayed.close();
_deleteDownloadedPlayedEpisodes.close();
_storeDownloadOnSDCard.close();
Expand Down
36 changes: 33 additions & 3 deletions lib/l10n/L.dart
Original file line number Diff line number Diff line change
Expand Up @@ -507,11 +507,41 @@ class L {
);
}

String get settings_theme_switch_label {
return message('settings_theme_switch_label') ??
String get settings_theme_dropdown_label {
return message('settings_theme_dropdown_label') ??
Intl.message(
'Dark/Light theme',
name: 'settings_theme_dropdown_label',
desc: 'Dark/Light theme',
locale: localeName,
);
}

String get settings_theme_value_auto {
return message('settings_theme_value_auto') ??
Intl.message(
'Auto',
name: 'settings_theme_value_auto',
desc: 'Based on System theme',
locale: localeName,
);
}

String get settings_theme_value_light {
return message('settings_theme_value_light') ??
Intl.message(
'Light theme',
name: 'settings_theme_value_light',
desc: 'Light theme',
locale: localeName,
);
}

String get settings_theme_value_dark {
return message('settings_theme_value_dark') ??
Intl.message(
'Dark theme',
name: 'settings_theme_switch_label',
name: 'settings_theme_value_dark',
desc: 'Dark theme',
locale: localeName,
);
Expand Down
22 changes: 16 additions & 6 deletions lib/services/settings/mobile_settings_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import 'dart:math';
import 'package:anytime/core/environment.dart';
import 'package:anytime/entities/app_settings.dart';
import 'package:anytime/services/settings/settings_service.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:rxdart/rxdart.dart';
import 'package:shared_preferences/shared_preferences.dart';

Expand Down Expand Up @@ -58,16 +60,24 @@ class MobileSettingsService extends SettingsService {
}

@override
bool get themeDarkMode {
var theme = _sharedPreferences.getString('theme') ?? 'dark';

return theme == 'dark';
String get themeMode {
var value = _sharedPreferences.getString('theme') ?? ThemeMode.system.name;
if (value == ThemeMode.system.name) {
var brightness = SchedulerBinding.instance.platformDispatcher
.platformBrightness;
return brightness == Brightness.dark ? ThemeMode.dark.name : ThemeMode.light.name;
}
return value;
}

@override
set themeDarkMode(bool value) {
_sharedPreferences.setString('theme', value ? 'dark' : 'light');
set themeMode(String mode) {
bool followSystem = _sharedPreferences.getString('theme') == ThemeMode.system.name;
_sharedPreferences.setString('theme', mode);
settingsNotifier.sink.add('theme');
if (followSystem) {
_sharedPreferences.setString('theme', ThemeMode.system.name);
}
}

@override
Expand Down
4 changes: 2 additions & 2 deletions lib/services/settings/settings_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ abstract class SettingsService {

set settings(AppSettings? settings);

bool get themeDarkMode;
String get themeMode;

set themeDarkMode(bool value);
set themeMode(String mode);

bool get markDeletedEpisodesAsPlayed;

Expand Down
14 changes: 8 additions & 6 deletions lib/ui/anytime_podcast_app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,16 @@ import 'package:anytime/ui/widgets/search_slide_route.dart';
import 'package:app_links/app_links.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:flutter_dialogs/flutter_dialogs.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:logging/logging.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';

import '../services/settings/settings_service.dart';

var theme = Themes.lightTheme().themeData;

/// Anytime is a Podcast player. You can search and subscribe to podcasts,
Expand Down Expand Up @@ -128,12 +131,6 @@ class AnytimePodcastAppState extends State<AnytimePodcastApp> {
}
});
});

if (widget.mobileSettingsService.themeDarkMode) {
theme = Themes.darkTheme().themeData;
} else {
theme = Themes.lightTheme().themeData;
}
}

@override
Expand Down Expand Up @@ -317,6 +314,11 @@ class _AnytimeHomePageState extends State<AnytimeHomePage> with WidgetsBindingOb
switch (state) {
case AppLifecycleState.resumed:
audioBloc.transitionLifecycleState(LifecycleState.resume);
if (context.mounted) {
SettingsService? settings = await MobileSettingsService.instance();
var settingsBloc = Provider.of<SettingsBloc>(context, listen: false);
settingsBloc.themeMode(settings!.themeMode);
}
break;
case AppLifecycleState.paused:
audioBloc.transitionLifecycleState(LifecycleState.pause);
Expand Down
18 changes: 12 additions & 6 deletions lib/ui/settings/settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,18 @@ class _SettingsState extends State<Settings> {
MergeSemantics(
child: ListTile(
shape: const RoundedRectangleBorder(side: BorderSide.none),
title: Text(L.of(context)!.settings_theme_switch_label),
trailing: Switch.adaptive(
value: snapshot.data!.theme == 'dark',
onChanged: (value) {
settingsBloc.darkMode(value);
}),
title: Text(L.of(context)!.settings_theme_dropdown_label),
trailing: DropdownMenu<String>(
initialSelection: snapshot.data!.theme,
onSelected: (value) {
settingsBloc.themeMode(value!);
},
dropdownMenuEntries: [
DropdownMenuEntry(value: ThemeMode.system.name, label: L.of(context)!.settings_theme_value_auto),
DropdownMenuEntry(value: ThemeMode.light.name, label: L.of(context)!.settings_theme_value_light),
DropdownMenuEntry(value: ThemeMode.dark.name, label: L.of(context)!.settings_theme_value_dark),
]
),
),
),
SettingsDividerLabel(label: L.of(context)!.settings_episodes_divider_label),
Expand Down
4 changes: 3 additions & 1 deletion test/unit/mocks/mock_settings_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
// found in the LICENSE file.
import 'package:anytime/entities/app_settings.dart';
import 'package:anytime/services/settings/settings_service.dart';
import 'package:anytime/ui/themes.dart';
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';

class MockSettingsService extends SettingsService {
Expand Down Expand Up @@ -40,7 +42,7 @@ class MockSettingsService extends SettingsService {
bool storeDownloadsSDCard = false;

@override
bool themeDarkMode = true;
String themeMode = ThemeMode.dark.name;

@override
bool trimSilence = false;
Expand Down
6 changes: 3 additions & 3 deletions test/unit/services/settings_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ void main() {
}, timeout: const Timeout(Duration(milliseconds: timeout)));

test('Test dark mode', () async {
expect(mobileSettingsService?.themeDarkMode, true);
expect(mobileSettingsService?.themeMode, 'dark');
expectLater(settingsListener, emits('theme'));
mobileSettingsService?.themeDarkMode = false;
expect(mobileSettingsService?.themeDarkMode, false);
mobileSettingsService?.themeMode = 'light';
expect(mobileSettingsService?.themeMode, 'light');
}, timeout: const Timeout(Duration(milliseconds: timeout)));

test('Test playback speed', () async {
Expand Down

0 comments on commit f92e177

Please sign in to comment.