blob: 6393e816415f8fe341cc4016252690d33da3ca86 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:convert' show json;
import 'package:lib.app.dart/logging.dart';
import 'package:lib.schemas.dart/entity_codec.dart';
import 'media_progress_entity_data.dart';
const String _kDurationKey = 'duration_msec';
const String _kProgressKey = 'normalized_progress';
/// Codec for reading/writing MediaProgress Entities to a Link.
// TODO(MS-1319): move to //topaz/public/lib/schemas
class MediaProgressEntityCodec extends EntityCodec<MediaProgressEntityData> {
/// Constuctor assigns the proper values to en/decode MediaProgress objects.
MediaProgressEntityCodec()
: super(
type: 'com.fuchsia.media.progress',
encode: _encode,
decode: _decode,
);
// Create a MediaProgress from a json string previously output by encode()
static MediaProgressEntityData _decode(Object data) {
log.finer('Convert to MediaProgressEntityData from JSON: $data');
if (data == null) {
return null;
}
if (data is! String) {
throw const FormatException('Decoding Entity with unsupported type');
}
String encoded = data;
if (encoded.isEmpty) {
throw const FormatException('Decoding Entity with empty string');
}
if (encoded == 'null') {
return null;
}
dynamic decode = json.decode(encoded);
if (decode == null || decode is! Map) {
throw const FormatException('Decoding Entity with invalid data');
}
Map<String, dynamic> map = decode.cast<String, dynamic>();
if (map[_kDurationKey] == null ||
map[_kDurationKey] is! int ||
map[_kProgressKey] == null ||
map[_kProgressKey] is! double) {
throw const FormatException('Converting Entity with invalid values');
}
return MediaProgressEntityData(map[_kDurationKey], map[_kProgressKey]);
}
// Convert to a json string suitable for sending over a Link
static String _encode(MediaProgressEntityData progress) {
log.finer('Convert MediaProgressEntityData to JSON: $progress');
if (progress == null) {
return 'null';
}
return json.encode(<String, dynamic>{
_kDurationKey: progress.durationMsec,
_kProgressKey: progress.normalizedProgress,
});
}
}