album: improved section headers
This commit is contained in:
parent
10be8b1f2e
commit
4ee06358b9
3 changed files with 35 additions and 9 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
9
lib/utils/date_utils.dart
Normal file
9
lib/utils/date_utils.dart
Normal 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());
|
Loading…
Reference in a new issue