ente/lib/ui/file_info_dialog.dart

357 lines
9.8 KiB
Dart
Raw Normal View History

import 'package:exif/exif.dart';
import 'package:flutter/cupertino.dart';
2021-07-06 11:50:35 +00:00
import 'package:flutter/material.dart';
import 'package:photo_manager/photo_manager.dart';
import 'package:photos/models/file.dart';
import 'package:photos/models/file_type.dart';
import 'package:photos/services/collections_service.dart';
2021-07-06 16:03:39 +00:00
import 'package:photos/ui/exif_info_dialog.dart';
2021-07-06 11:50:35 +00:00
import 'package:photos/utils/date_time_util.dart';
import 'package:photos/utils/file_util.dart';
2021-07-06 11:50:35 +00:00
2021-07-06 16:03:39 +00:00
class FileInfoWidget extends StatelessWidget {
2021-07-06 11:50:35 +00:00
final File file;
final AssetEntity entity;
final int fileSize;
2021-07-06 11:51:51 +00:00
const FileInfoWidget(
this.file,
this.entity,
this.fileSize, {
Key key,
}) : super(key: key);
2021-07-06 11:50:35 +00:00
@override
Widget build(BuildContext context) {
bool isImage = file.fileType == FileType.image;
2021-07-06 11:50:35 +00:00
var items = <Widget>[
Row(
children: [
Icon(
Icons.calendar_today_outlined,
color: Colors.white.withOpacity(0.85),
),
2021-07-06 11:50:35 +00:00
Padding(padding: EdgeInsets.all(4)),
Text(
getFormattedTime(
DateTime.fromMicrosecondsSinceEpoch(file.creationTime),
),
style: TextStyle(
color: Colors.white.withOpacity(0.85),
),
),
2021-07-06 11:50:35 +00:00
],
),
Padding(padding: EdgeInsets.all(6)),
2021-07-06 11:50:35 +00:00
Row(
children: [
Icon(
Icons.folder_outlined,
color: Colors.white.withOpacity(0.85),
),
2021-07-06 11:50:35 +00:00
Padding(padding: EdgeInsets.all(4)),
Text(
file.deviceFolder ??
CollectionsService.instance
.getCollectionByID(file.collectionID)
.name,
style: TextStyle(
color: Colors.white.withOpacity(0.85),
),
),
2021-07-06 11:50:35 +00:00
],
),
Padding(padding: EdgeInsets.all(6)),
2021-07-06 11:50:35 +00:00
];
2021-07-06 16:03:39 +00:00
if (file.localID != null) {
2021-07-07 00:41:49 +00:00
items.addAll(
[
2021-07-06 12:18:39 +00:00
Row(
children: [
Icon(
2021-07-07 00:41:49 +00:00
Icons.sd_storage_outlined,
color: Colors.white.withOpacity(0.85),
),
2021-07-06 12:18:39 +00:00
Padding(padding: EdgeInsets.all(4)),
Text(
2021-07-07 00:41:49 +00:00
(fileSize / (1024 * 1024)).toStringAsFixed(2) + " MB",
style: TextStyle(
color: Colors.white.withOpacity(0.85),
),
),
2021-07-06 12:18:39 +00:00
],
),
2021-07-07 00:41:49 +00:00
Padding(padding: EdgeInsets.all(6)),
],
);
if (!isImage) {
items.addAll(
[
Row(
children: [
Icon(
Icons.timer_outlined,
color: Colors.white.withOpacity(0.85),
),
2021-07-07 00:41:49 +00:00
Padding(padding: EdgeInsets.all(4)),
Text(
entity.videoDuration.toString().split(".")[0],
style: TextStyle(
color: Colors.white.withOpacity(0.85),
),
),
],
),
Padding(padding: EdgeInsets.all(6)),
],
2021-07-06 12:02:45 +00:00
);
2021-07-06 11:50:35 +00:00
}
}
if (isImage) {
2021-07-06 12:18:39 +00:00
items.add(
FutureBuilder(
future: _getExif(),
builder: (c, snapshot) {
if (snapshot.hasData) {
return _getExifWidgets(snapshot.data);
} else {
return Container();
}
},
2021-07-06 12:18:39 +00:00
),
);
}
if (file.uploadedFileID != null) {
items.addAll(
[
Row(
children: [
Icon(
Icons.cloud_upload_outlined,
color: Colors.white.withOpacity(0.85),
),
Padding(padding: EdgeInsets.all(4)),
Text(
getFormattedTime(
DateTime.fromMicrosecondsSinceEpoch(file.updationTime)),
style: TextStyle(
color: Colors.white.withOpacity(0.85),
),
),
],
),
],
);
}
2021-07-06 12:18:39 +00:00
items.add(
Padding(padding: EdgeInsets.all(12)),
);
2021-07-06 20:49:46 +00:00
final List<Widget> actions = [];
if (isImage) {
2021-07-06 20:49:46 +00:00
actions.add(
TextButton(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Icon(
Icons.feed_outlined,
color: Colors.white.withOpacity(0.85),
2021-07-06 20:49:46 +00:00
),
Padding(padding: EdgeInsets.all(4)),
Text(
"view exif",
style: TextStyle(
color: Colors.white.withOpacity(0.85),
2021-07-06 12:18:39 +00:00
),
),
2021-07-06 20:49:46 +00:00
],
2021-07-06 12:18:39 +00:00
),
2021-07-06 20:49:46 +00:00
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return ExifInfoDialog(file);
},
barrierColor: Colors.black87,
);
},
),
);
}
actions.add(
TextButton(
child: Text(
"close",
style: TextStyle(
color: Colors.white.withOpacity(0.8),
),
),
onPressed: () {
Navigator.of(context, rootNavigator: true).pop('dialog');
},
),
);
items.add(
Row(
mainAxisAlignment:
isImage ? MainAxisAlignment.spaceBetween : MainAxisAlignment.end,
2021-07-06 20:49:46 +00:00
children: actions,
2021-07-06 12:18:39 +00:00
),
);
2021-07-06 11:50:35 +00:00
return AlertDialog(
2021-07-06 16:03:39 +00:00
title: Text(file.title),
2021-07-06 11:50:35 +00:00
content: SingleChildScrollView(
child: ListBody(
children: items,
),
),
);
}
Widget _getExifWidgets(Map<String, IfdTag> exif) {
final focalLength = exif["EXIF FocalLength"] != null
? (exif["EXIF FocalLength"].values.toList()[0] as Ratio).numerator /
(exif["EXIF FocalLength"].values.toList()[0] as Ratio).denominator
: null;
final fNumber = exif["EXIF FNumber"] != null
? (exif["EXIF FNumber"].values.toList()[0] as Ratio).numerator /
(exif["EXIF FNumber"].values.toList()[0] as Ratio).denominator
: null;
final List<Widget> children = [];
2021-07-07 00:41:49 +00:00
if (exif["EXIF ExifImageWidth"] != null &&
exif["EXIF ExifImageLength"] != null) {
children.addAll([
Row(
children: [
Icon(
Icons.photo_size_select_actual_outlined,
color: Colors.white.withOpacity(0.85),
),
Padding(padding: EdgeInsets.all(4)),
Text(
exif["EXIF ExifImageWidth"].toString() +
" x " +
exif["EXIF ExifImageLength"].toString(),
style: TextStyle(
color: Colors.white.withOpacity(0.85),
),
),
],
),
Padding(padding: EdgeInsets.all(6)),
]);
} else if (exif["Image ImageWidth"] != null &&
exif["Image ImageLength"] != null) {
children.addAll([
Row(
children: [
Icon(
Icons.photo_size_select_actual_outlined,
color: Colors.white.withOpacity(0.85),
),
Padding(padding: EdgeInsets.all(4)),
Text(
exif["Image ImageWidth"].toString() +
" x " +
exif["Image ImageLength"].toString(),
style: TextStyle(
color: Colors.white.withOpacity(0.85),
),
),
],
),
Padding(padding: EdgeInsets.all(6)),
]);
}
if (exif["Image Make"] != null && exif["Image Model"] != null) {
children.addAll(
[
Row(
children: [
Icon(
Icons.camera_outlined,
color: Colors.white.withOpacity(0.85),
),
Padding(padding: EdgeInsets.all(4)),
Text(
exif["Image Make"].toString() +
" " +
exif["Image Model"].toString(),
style: TextStyle(
color: Colors.white.withOpacity(0.85),
),
),
],
),
Padding(padding: EdgeInsets.all(6)),
],
);
}
if (fNumber != null) {
children.addAll([
Row(
children: [
Icon(
CupertinoIcons.f_cursive,
color: Colors.white.withOpacity(0.85),
),
Padding(padding: EdgeInsets.all(4)),
Text(
fNumber.toString(),
style: TextStyle(
color: Colors.white.withOpacity(0.85),
),
),
],
),
Padding(padding: EdgeInsets.all(6)),
]);
}
if (focalLength != null) {
children.addAll([
Row(
children: [
Icon(
Icons.center_focus_strong_outlined,
color: Colors.white.withOpacity(0.85),
),
Padding(padding: EdgeInsets.all(4)),
Text(focalLength.toString() + " mm",
style: TextStyle(
color: Colors.white.withOpacity(0.85),
)),
],
),
Padding(padding: EdgeInsets.all(6)),
]);
}
if (exif["EXIF ExposureTime"] != null) {
children.addAll([
Row(
children: [
Icon(
Icons.shutter_speed,
color: Colors.white.withOpacity(0.85),
),
Padding(padding: EdgeInsets.all(4)),
Text(
exif["EXIF ExposureTime"].toString(),
style: TextStyle(
color: Colors.white.withOpacity(0.85),
),
),
],
),
Padding(padding: EdgeInsets.all(6)),
]);
}
return Column(
children: children,
);
}
Future<Map<String, IfdTag>> _getExif() async {
return await readExifFromFile(await getFile(file));
}
2021-07-06 11:50:35 +00:00
}