diff --git a/mobile/android/app/src/main/AndroidManifest.xml b/mobile/android/app/src/main/AndroidManifest.xml index 71267f848f..5f93e37958 100644 --- a/mobile/android/app/src/main/AndroidManifest.xml +++ b/mobile/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Immich Mobile + Immich CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/mobile/lib/modules/home/ui/draggable_scrollbar.dart b/mobile/lib/modules/home/ui/draggable_scrollbar.dart index 2b8f1315f3..80b8a69dd0 100644 --- a/mobile/lib/modules/home/ui/draggable_scrollbar.dart +++ b/mobile/lib/modules/home/ui/draggable_scrollbar.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; /// Build the Scroll Thumb and label using the current configuration @@ -166,7 +165,7 @@ class DraggableScrollbar extends StatefulWidget { }) { final scrollThumb = CustomPaint( key: scrollThumbKey, - foregroundPainter: ArrowCustomPainter(Colors.grey), + foregroundPainter: ArrowCustomPainter(Colors.white), child: Material( elevation: 4.0, child: Container( @@ -348,7 +347,7 @@ class _DraggableScrollbarState extends State with TickerProv double get barMaxScrollExtent => context.size!.height - widget.heightScrollThumb; - double get barMinScrollExtent => 0.0; + double get barMinScrollExtent => 0; double get viewMaxScrollExtent => widget.controller.position.maxScrollExtent; diff --git a/mobile/lib/modules/home/ui/immich_sliver_appbar.dart b/mobile/lib/modules/home/ui/immich_sliver_appbar.dart index f009a6f443..ad9bda06bd 100644 --- a/mobile/lib/modules/home/ui/immich_sliver_appbar.dart +++ b/mobile/lib/modules/home/ui/immich_sliver_appbar.dart @@ -105,8 +105,8 @@ class ImmichSliverAppBar extends ConsumerWidget { statusBarColor: Colors.indigo, // Status bar brightness (optional) - statusBarIconBrightness: Brightness.dark, // For Android (dark icons) - statusBarBrightness: Brightness.light, // For iOS (dark icons) + statusBarIconBrightness: Brightness.light, // For Android (dark icons) + statusBarBrightness: Brightness.dark, ), ), ); diff --git a/mobile/lib/modules/home/ui/thumbnail_image.dart b/mobile/lib/modules/home/ui/thumbnail_image.dart index 257ad20ffc..ca8ae1d6a7 100644 --- a/mobile/lib/modules/home/ui/thumbnail_image.dart +++ b/mobile/lib/modules/home/ui/thumbnail_image.dart @@ -5,7 +5,6 @@ import 'package:hive_flutter/hive_flutter.dart'; import 'package:immich_mobile/constants/hive_box.dart'; import 'package:immich_mobile/shared/models/immich_asset.model.dart'; import 'package:immich_mobile/routing/router.dart'; -import 'package:transparent_image/transparent_image.dart'; class ThumbnailImage extends StatelessWidget { final ImmichAsset asset; @@ -17,7 +16,6 @@ class ThumbnailImage extends StatelessWidget { var box = Hive.box(userInfoBox); var thumbnailRequestUrl = '${box.get(serverEndpointKey)}/asset/file?aid=${asset.deviceAssetId}&did=${asset.deviceId}&isThumb=true'; - return GestureDetector( onTap: () { AutoRouter.of(context).push( @@ -44,7 +42,10 @@ class ThumbnailImage extends StatelessWidget { scale: 0.2, child: CircularProgressIndicator(value: downloadProgress.progress), ), - errorWidget: (context, url, error) => const Icon(Icons.error), + errorWidget: (context, url, error) { + debugPrint("Error Loading Thumbnail Widget $error"); + return const Icon(Icons.error); + }, ), ), ); diff --git a/mobile/lib/modules/home/views/home_page.dart b/mobile/lib/modules/home/views/home_page.dart index eea2d2ef87..4ef968870e 100644 --- a/mobile/lib/modules/home/views/home_page.dart +++ b/mobile/lib/modules/home/views/home_page.dart @@ -84,6 +84,7 @@ class HomePage extends HookConsumerWidget { int? currentMonth = DateTime.tryParse(dateTitle)?.month; int? previousMonth = DateTime.tryParse(lastGroupDate)?.month; + // Add Monthly Title Group if started at the beginning of the month if ((currentMonth! - previousMonth!) != 0) { var monthTitleText = DateFormat('MMMM, y').format(DateTime.parse(dateTitle)); @@ -92,10 +93,12 @@ class HomePage extends HookConsumerWidget { ); } + // Add Daily Title Group imageGridGroup.add( - _buildDateGroupTitle(dateTitle), + DailyTitleText(dateTitle: dateTitle), ); + // Add Image Group imageGridGroup.add( ImageGrid(assetGroup: assetGroup), ); @@ -121,8 +124,9 @@ class HomePage extends HookConsumerWidget { // return Text(scrollLabelText.value); // }, // labelConstraints: const BoxConstraints.tightFor(width: 200.0, height: 30.0), + backgroundColor: Theme.of(context).primaryColor, controller: _scrollController, - heightScrollThumb: 40.0, + heightScrollThumb: 48.0, child: CustomScrollView( controller: _scrollController, slivers: [ @@ -166,3 +170,41 @@ class MonthlyTitleText extends StatelessWidget { ); } } + +class DailyTitleText extends StatelessWidget { + const DailyTitleText({ + Key? key, + required this.dateTitle, + }) : super(key: key); + + final String dateTitle; + + @override + Widget build(BuildContext context) { + var currentYear = DateTime.now().year; + var groupYear = DateTime.parse(dateTitle).year; + var formatDateTemplate = currentYear == groupYear ? 'E, MMM dd' : 'E, MMM dd, yyyy'; + var dateText = DateFormat(formatDateTemplate).format(DateTime.parse(dateTitle)); + + return SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.only(top: 24.0, bottom: 24.0, left: 3.0), + child: Row( + children: [ + Padding( + padding: const EdgeInsets.only(left: 8.0, bottom: 5.0, top: 5.0), + child: Text( + dateText, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black87, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/mobile/lib/modules/login/ui/login_form.dart b/mobile/lib/modules/login/ui/login_form.dart index 0b6b13a71d..9757d476ee 100644 --- a/mobile/lib/modules/login/ui/login_form.dart +++ b/mobile/lib/modules/login/ui/login_form.dart @@ -12,7 +12,7 @@ class LoginForm extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final usernameController = useTextEditingController(text: 'testuser@email.com'); final passwordController = useTextEditingController(text: 'password'); - final serverEndpointController = useTextEditingController(text: 'http://192.168.1.103:3000'); + final serverEndpointController = useTextEditingController(text: 'http://192.168.1.216:3000'); return Center( child: ConstrainedBox( diff --git a/mobile/makefile b/mobile/makefile index c68be08444..abd6772374 100644 --- a/mobile/makefile +++ b/mobile/makefile @@ -2,4 +2,7 @@ build: flutter packages pub run build_runner build watch: - flutter packages pub run build_runner watch \ No newline at end of file + flutter packages pub run build_runner watch + +create_app_icon: + flutter pub run flutter_launcher_icons:main \ No newline at end of file diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index b00996822c..2b015d255c 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -15,6 +15,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.2.0" + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.11" args: dependency: transitive description: @@ -321,6 +328,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.18.2" + flutter_launcher_icons: + dependency: "direct main" + description: + name: flutter_launcher_icons + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.2" flutter_lints: dependency: "direct dev" description: @@ -429,6 +443,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" + image: + dependency: transitive + description: + name: image + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" intl: dependency: "direct main" description: @@ -478,6 +499,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.12.11" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" meta: dependency: transitive description: @@ -576,6 +604,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.4.0" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" photo_manager: dependency: "direct main" description: @@ -755,7 +790,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.4.8" timing: dependency: transitive description: @@ -840,6 +875,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.0" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "5.3.1" yaml: dependency: transitive description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 2585dd0dd0..e1978e0cc2 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -26,6 +26,7 @@ dependencies: exif: ^3.1.1 transparent_image: ^2.0.0 visibility_detector: ^0.2.2 + flutter_launcher_icons: "^0.9.2" dev_dependencies: flutter_test: @@ -39,3 +40,9 @@ flutter: uses-material-design: true assets: - assets/ + +flutter_icons: + image_path_android: "assets/immich-logo-no-outline.png" + image_path_ios: "assets/immich-logo-no-outline.png" + android: true # can specify file name here e.g. "ic_launcher" + ios: true # can specify file name here e.g. "My-Launcher-Icon