album: improved section headers

This commit is contained in:
Thibault Deckers 2019-07-21 12:58:28 +09:00
parent 10be8b1f2e
commit 4ee06358b9
3 changed files with 35 additions and 9 deletions

View file

@ -59,8 +59,6 @@ public class MediaStoreImageProvider {
try { try {
Cursor cursor = activity.getContentResolver().query(filesUri, PROJECTION, SELECTION, null, orderBy); Cursor cursor = activity.getContentResolver().query(filesUri, PROJECTION, SELECTION, null, orderBy);
if (cursor != null) { if (cursor != null) {
Log.d(LOG_TAG, "fetch query returned " + cursor.getCount() + " entries");
int idColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID); int idColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID);
int pathColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); int pathColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
int mimeTypeColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.MIME_TYPE); int mimeTypeColumn = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.MIME_TYPE);

View file

@ -1,13 +1,14 @@
import 'package:aves/common/draggable_scrollbar.dart'; import 'package:aves/common/draggable_scrollbar.dart';
import 'package:aves/common/outlined_text.dart'; import 'package:aves/common/outlined_text.dart';
import 'package:aves/thumbnail.dart'; import 'package:aves/thumbnail.dart';
import 'package:aves/utils/date_utils.dart';
import "package:collection/collection.dart"; import "package:collection/collection.dart";
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_sticky_header/flutter_sticky_header.dart'; import 'package:flutter_sticky_header/flutter_sticky_header.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
class ThumbnailCollection extends StatelessWidget { class ThumbnailCollection extends StatelessWidget {
final Map<String, List<Map>> sections; final Map<DateTime, List<Map>> sections;
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
ThumbnailCollection(List<Map> entries) : sections = groupBy(entries, getDayTaken); ThumbnailCollection(List<Map> entries) : sections = groupBy(entries, getDayTaken);
@ -22,11 +23,9 @@ class ThumbnailCollection extends StatelessWidget {
return null; return null;
} }
static DateFormat sectionDateFormat = DateFormat('yyyy/MM/dd'); static DateTime getDayTaken(Map entry) {
var d = getBestDate(entry);
static String getDayTaken(Map entry) { return d == null ? null : DateTime(d.year, d.month, d.day);
var date = getBestDate(entry);
return date == null ? 'Unknown' : sectionDateFormat.format(date);
} }
@override @override
@ -48,7 +47,7 @@ class ThumbnailCollection extends StatelessWidget {
floating: true, floating: true,
), ),
...sections.keys.map((sectionKey) => SliverStickyHeader( ...sections.keys.map((sectionKey) => SliverStickyHeader(
header: SectionHeader(sectionKey), header: DaySectionHeader(sectionKey),
sliver: SliverGrid( sliver: SliverGrid(
delegate: SliverChildBuilderDelegate( delegate: SliverChildBuilderDelegate(
(context, index) { (context, index) {
@ -72,6 +71,26 @@ class ThumbnailCollection extends StatelessWidget {
} }
} }
class DaySectionHeader extends StatelessWidget {
final String text;
static DateFormat md = DateFormat.MMMMd();
static DateFormat ymd = DateFormat.yMMMMd();
static formatDate(DateTime date) {
if (isToday(date)) return 'Today';
if (isThisYear(date)) return md.format(date);
return ymd.format(date);
}
DaySectionHeader(DateTime date) : text = formatDate(date);
@override
Widget build(BuildContext context) {
return SectionHeader(text);
}
}
class SectionHeader extends StatelessWidget { class SectionHeader extends StatelessWidget {
final String primaryText; final String primaryText;

View file

@ -0,0 +1,9 @@
bool isAtSameYearAs(DateTime d1, DateTime d2) => d1 != null && d2 != null && d1.year == d2.year;
bool isAtSameMonthAs(DateTime d1, DateTime d2) => isAtSameYearAs(d1, d2) && d1.month == d2.month;
bool isAtSameDayAs(DateTime d1, DateTime d2) => isAtSameMonthAs(d1, d2) && d1.day == d2.day;
bool isToday(DateTime d) => isAtSameDayAs(d, DateTime.now());
bool isThisYear(DateTime d) => isAtSameYearAs(d, DateTime.now());