Skip to content

Commit

Permalink
refactor!: prevent from confusing and conflicting class names (#1465)
Browse files Browse the repository at this point in the history
# Description

As some of the classes introduced in #1352 are quite generic and could
conflict with other packages, we should rename them to be more specific
to the package:

- Refactor `GlobalEvent` to `GlobalAudioEvent`
- Refactor `PlayerEvent` to `AudioEvent`
- Refactor `Logger` to `AudioLogger`
- Refactor `LogLevel` to `AudioLogLevel`

PlayerEvent was renamed to have the same scheme as `GlobalAudioEvent`
and so that it is more applicable to Audio and not to all players in
general (e.g. media or video player).

## Breaking Change

This is a breaking change regarding the current master channel, but not
the published versions.

**audioplayers**
| Before | After |
|---|---|
| `GlobalEvent` | `GlobalAudioEvent` |
| `PlayerEvent` | `AudioEvent` |
| `Logger` | `AudioLogger` |
| `LogLevel` | `AudioLogLevel` |

**audioplayers_platform_interface**
| Before | After |
|---|---|
| `GlobalEvent` | `GlobalAudioEvent` |
| `PlayerEvent` | `AudioEvent` |

## Related Issues
#1352
  • Loading branch information
Gustl22 committed Apr 9, 2023
1 parent b54a445 commit 7cdb858
Show file tree
Hide file tree
Showing 25 changed files with 190 additions and 174 deletions.
6 changes: 3 additions & 3 deletions getting_started.md
Expand Up @@ -164,7 +164,7 @@ Normally you want to use `.mediaPlayer` unless you care about performance and yo
You can globally control the amount of log messages that are emitted by this package:

```dart
Logger.logLevel = LogLevel.info;
AudioLogger.logLevel = AudioLogLevel.info;
```

You can pick one of 3 options:
Expand Down Expand Up @@ -290,15 +290,15 @@ Or to handle global logs:
All mentioned events can also be obtained by a combined event stream.

```dart
player.eventStream.listen((PlayerEvent event) {
player.eventStream.listen((AudioEvent event) {
print(event.eventType);
});
```

Or to handle global events:

```dart
AudioPlayer.global.eventStream.listen((GlobalEvent event) {
AudioPlayer.global.eventStream.listen((GlobalAudioEvent event) {
print(event.eventType);
});
```
Expand Down
35 changes: 19 additions & 16 deletions packages/audioplayers/example/lib/tabs/logger.dart
Expand Up @@ -13,10 +13,10 @@ class LoggerTab extends StatefulWidget {

class _LoggerTabState extends State<LoggerTab>
with AutomaticKeepAliveClientMixin<LoggerTab> {
LogLevel get currentLogLevel => Logger.logLevel;
AudioLogLevel get currentLogLevel => AudioLogger.logLevel;

set currentLogLevel(LogLevel level) {
Logger.logLevel = level;
set currentLogLevel(AudioLogLevel level) {
AudioLogger.logLevel = level;
}

List<Log> logs = [];
Expand All @@ -27,41 +27,44 @@ class _LoggerTabState extends State<LoggerTab>
super.initState();
AudioPlayer.global.onLog.listen(
(message) {
if (LogLevel.info.level <= currentLogLevel.level) {
if (AudioLogLevel.info.level <= currentLogLevel.level) {
setState(() {
globalLogs.add(Log(message, level: LogLevel.info));
globalLogs.add(Log(message, level: AudioLogLevel.info));
});
}
},
onError: (Object o, [StackTrace? stackTrace]) {
if (LogLevel.error.level <= currentLogLevel.level) {
if (AudioLogLevel.error.level <= currentLogLevel.level) {
setState(() {
globalLogs.add(
Log(Logger.errorToString(o, stackTrace), level: LogLevel.error),
Log(
AudioLogger.errorToString(o, stackTrace),
level: AudioLogLevel.error,
),
);
});
}
},
);
widget.player.onLog.listen(
(message) {
if (LogLevel.info.level <= currentLogLevel.level) {
if (AudioLogLevel.info.level <= currentLogLevel.level) {
final msg = '$message\nSource: ${widget.player.source}';
setState(() {
logs.add(Log(msg, level: LogLevel.info));
logs.add(Log(msg, level: AudioLogLevel.info));
});
}
},
onError: (Object o, [StackTrace? stackTrace]) {
if (LogLevel.error.level <= currentLogLevel.level) {
if (AudioLogLevel.error.level <= currentLogLevel.level) {
setState(() {
logs.add(
Log(
Logger.errorToString(
AudioLogger.errorToString(
AudioPlayerException(widget.player, cause: o),
stackTrace,
),
level: LogLevel.error,
level: AudioLogLevel.error,
),
);
});
Expand All @@ -83,10 +86,10 @@ class _LoggerTabState extends State<LoggerTab>
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: LogLevel.values
children: AudioLogLevel.values
.map(
(level) => Btn(
txt: level.toString().replaceAll('LogLevel.', ''),
txt: level.toString().replaceAll('AudioLogLevel.', ''),
onPressed: () {
setState(() => currentLogLevel = level);
},
Expand Down Expand Up @@ -155,7 +158,7 @@ class LogView extends StatelessWidget {
children: [
SelectableText(
'${log.level}: ${log.message}',
style: log.level == LogLevel.error
style: log.level == AudioLogLevel.error
? const TextStyle(color: Colors.red)
: null,
),
Expand All @@ -174,6 +177,6 @@ class LogView extends StatelessWidget {
class Log {
Log(this.message, {required this.level});

final LogLevel level;
final AudioLogLevel level;
final String message;
}
8 changes: 4 additions & 4 deletions packages/audioplayers/lib/audioplayers.dart
@@ -1,15 +1,15 @@
export 'package:audioplayers_platform_interface/src/api/audio_context.dart';
export 'package:audioplayers_platform_interface/src/api/audio_context_config.dart';
export 'package:audioplayers_platform_interface/src/api/global_event.dart';
export 'package:audioplayers_platform_interface/src/api/player_event.dart';
export 'package:audioplayers_platform_interface/src/api/audio_event.dart';
export 'package:audioplayers_platform_interface/src/api/global_audio_event.dart';
export 'package:audioplayers_platform_interface/src/api/player_mode.dart';
export 'package:audioplayers_platform_interface/src/api/player_state.dart';
export 'package:audioplayers_platform_interface/src/api/release_mode.dart';

export 'src/audio_cache.dart';
export 'src/audio_log_level.dart';
export 'src/audio_logger.dart';
export 'src/audio_pool.dart';
export 'src/audioplayer.dart';
export 'src/global_audio_scope.dart';
export 'src/log_level.dart';
export 'src/logger.dart';
export 'src/source.dart';
16 changes: 16 additions & 0 deletions packages/audioplayers/lib/src/audio_log_level.dart
@@ -0,0 +1,16 @@
enum AudioLogLevel implements Comparable<AudioLogLevel> {
none(0),
error(1),
info(2);

const AudioLogLevel(this.level);

factory AudioLogLevel.fromInt(int level) {
return values.firstWhere((e) => e.level == level);
}

final int level;

@override
int compareTo(AudioLogLevel other) => level - other.level;
}
@@ -1,17 +1,17 @@
import 'package:audioplayers/audioplayers.dart';

class Logger {
static LogLevel logLevel = LogLevel.error;
class AudioLogger {
static AudioLogLevel logLevel = AudioLogLevel.error;

static void log(String message) {
if (LogLevel.info.level <= logLevel.level) {
if (AudioLogLevel.info.level <= logLevel.level) {
// ignore: avoid_print
print('AudioPlayers Log: $message');
}
}

static void error(Object o, [StackTrace? stacktrace]) {
if (LogLevel.error.level <= logLevel.level) {
if (AudioLogLevel.error.level <= logLevel.level) {
// ignore: avoid_print
print(_errorColor(errorToString(o, stacktrace)));
}
Expand Down
18 changes: 9 additions & 9 deletions packages/audioplayers/lib/src/audioplayer.dart
Expand Up @@ -52,10 +52,10 @@ class AudioPlayer {

/// Stream controller to be able to get a stream on initialization, before the
/// native event stream is ready via [_create] method.
final _eventStreamController = StreamController<PlayerEvent>.broadcast();
final _eventStreamController = StreamController<AudioEvent>.broadcast();
late final StreamSubscription _eventStreamSubscription;

Stream<PlayerEvent> get eventStream => _eventStreamController.stream;
Stream<AudioEvent> get eventStream => _eventStreamController.stream;

final StreamController<PlayerState> _playerStateController =
StreamController<PlayerState>.broadcast();
Expand All @@ -70,15 +70,15 @@ class AudioPlayer {
///
/// You can use it on a progress bar, for instance.
Stream<Duration> get onPositionChanged => eventStream
.where((event) => event.eventType == PlayerEventType.position)
.where((event) => event.eventType == AudioEventType.position)
.map((event) => event.position!);

/// Stream of changes on audio duration.
///
/// An event is going to be sent as soon as the audio duration is available
/// (it might take a while to download or buffer it).
Stream<Duration> get onDurationChanged => eventStream
.where((event) => event.eventType == PlayerEventType.duration)
.where((event) => event.eventType == AudioEventType.duration)
.map((event) => event.duration!);

/// Stream of player completions.
Expand All @@ -88,17 +88,17 @@ class AudioPlayer {
///
/// [ReleaseMode.loop] also sends events to this stream.
Stream<void> get onPlayerComplete =>
eventStream.where((event) => event.eventType == PlayerEventType.complete);
eventStream.where((event) => event.eventType == AudioEventType.complete);

/// Stream of seek completions.
///
/// An event is going to be sent as soon as the audio seek is finished.
Stream<void> get onSeekComplete => eventStream
.where((event) => event.eventType == PlayerEventType.seekComplete);
.where((event) => event.eventType == AudioEventType.seekComplete);

/// Stream of log events.
Stream<String> get onLog => eventStream
.where((event) => event.eventType == PlayerEventType.log)
.where((event) => event.eventType == AudioEventType.log)
.map((event) => event.logMessage!);

/// An unique ID generated for this instance of [AudioPlayer].
Expand All @@ -119,8 +119,8 @@ class AudioPlayer {
/// Creates a new instance and assigns an unique id to it.
AudioPlayer({String? playerId}) : playerId = playerId ?? _uuid.v4() {
_onLogStreamSubscription = onLog.listen(
(log) => Logger.log('$log\nSource: $_source'),
onError: (Object e, [StackTrace? stackTrace]) => Logger.error(
(log) => AudioLogger.log('$log\nSource: $_source'),
onError: (Object e, [StackTrace? stackTrace]) => AudioLogger.error(
AudioPlayerException(this, cause: e),
stackTrace,
),
Expand Down
46 changes: 25 additions & 21 deletions packages/audioplayers/lib/src/global_audio_scope.dart
@@ -1,52 +1,56 @@
import 'dart:async';

import 'package:audioplayers/src/log_level.dart';
import 'package:audioplayers/src/logger.dart';
import 'package:audioplayers/src/audio_log_level.dart';
import 'package:audioplayers/src/audio_logger.dart';
import 'package:audioplayers_platform_interface/audioplayers_platform_interface.dart';

/// Handle global audio scope like calls and events concerning all AudioPlayers.
class GlobalAudioScope {
final _platform = GlobalAudioplayersPlatformInterface.instance;

/// Stream of global events.
late final Stream<GlobalEvent> eventStream;
late final Stream<GlobalAudioEvent> eventStream;

/// Stream of global log events.
Stream<String> get onLog => eventStream
.where((event) => event.eventType == GlobalEventType.log)
.where((event) => event.eventType == GlobalAudioEventType.log)
.map((event) => event.logMessage!);

@Deprecated('Use `Logger.logLevel` instead. This will be removed in v5.0.0.')
LogLevel get logLevel => Logger.logLevel;
@Deprecated('Use `AudioLogger.logLevel` instead. '
'This will be removed in v5.0.0.')
AudioLogLevel get logLevel => AudioLogger.logLevel;

GlobalAudioScope() {
eventStream = _platform.getGlobalEventStream();
onLog.listen(
Logger.log,
onError: Logger.error,
AudioLogger.log,
onError: AudioLogger.error,
);
}

@Deprecated('Set `Logger.logLevel` instead. This will be removed in v5.0.0.')
Future<void> changeLogLevel(LogLevel level) async {
Logger.logLevel = level;
@Deprecated('Set `AudioLogger.logLevel` instead. '
'This will be removed in v5.0.0.')
Future<void> changeLogLevel(AudioLogLevel level) async {
AudioLogger.logLevel = level;
}

@Deprecated('Use `Logger.log()` or `Logger.error()` instead. '
@Deprecated('Use `AudioLogger.log()` or `AudioLogger.error()` instead. '
'This will be removed in v5.0.0.')
void log(LogLevel level, String message) {
if (level == LogLevel.info) {
Logger.log(message);
} else if (level == LogLevel.error) {
Logger.error(message);
void log(AudioLogLevel level, String message) {
if (level == AudioLogLevel.info) {
AudioLogger.log(message);
} else if (level == AudioLogLevel.error) {
AudioLogger.error(message);
}
}

@Deprecated('Use `Logger.log()` instead. This will be removed in v5.0.0.')
void info(String message) => Logger.log(message);
@Deprecated('Use `AudioLogger.log()` instead. '
'This will be removed in v5.0.0.')
void info(String message) => AudioLogger.log(message);

@Deprecated('Use `Logger.error()` instead. This will be removed in v5.0.0.')
void error(String message) => Logger.error(message);
@Deprecated('Use `AudioLogger.error()` instead. '
'This will be removed in v5.0.0.')
void error(String message) => AudioLogger.error(message);

Future<void> setAudioContext(AudioContext ctx) =>
_platform.setGlobalAudioContext(ctx);
Expand Down
16 changes: 0 additions & 16 deletions packages/audioplayers/lib/src/log_level.dart

This file was deleted.

26 changes: 13 additions & 13 deletions packages/audioplayers/test/audioplayers_test.dart
Expand Up @@ -101,33 +101,33 @@ void main() {
});

test('event stream', () async {
final playerEvents = <PlayerEvent>[
const PlayerEvent(
eventType: PlayerEventType.duration,
final audioEvents = <AudioEvent>[
const AudioEvent(
eventType: AudioEventType.duration,
duration: Duration(milliseconds: 98765),
),
const PlayerEvent(
eventType: PlayerEventType.position,
const AudioEvent(
eventType: AudioEventType.position,
position: Duration(milliseconds: 8765),
),
const PlayerEvent(
eventType: PlayerEventType.log,
const AudioEvent(
eventType: AudioEventType.log,
logMessage: 'someLogMessage',
),
const PlayerEvent(
eventType: PlayerEventType.complete,
const AudioEvent(
eventType: AudioEventType.complete,
),
const PlayerEvent(
eventType: PlayerEventType.seekComplete,
const AudioEvent(
eventType: AudioEventType.seekComplete,
),
];

expect(
player.eventStream,
emitsInOrder(playerEvents),
emitsInOrder(audioEvents),
);

playerEvents.forEach(platform.eventStreamController.add);
audioEvents.forEach(platform.eventStreamController.add);
await platform.eventStreamController.close();
});
});
Expand Down

0 comments on commit 7cdb858

Please sign in to comment.