Added icons logo
| @@ -1,7 +1,7 @@ | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|           package="com.example.immich_mobile"> | ||||
|     <application | ||||
|             android:label="immich_mobile" | ||||
|             android:label="Immich" | ||||
|             android:name="${applicationName}" | ||||
|             android:icon="@mipmap/ic_launcher"> | ||||
|         <activity | ||||
|   | ||||
| Before Width: | Height: | Size: 544 B After Width: | Height: | Size: 7.1 KiB | 
| Before Width: | Height: | Size: 442 B After Width: | Height: | Size: 4.1 KiB | 
| Before Width: | Height: | Size: 721 B After Width: | Height: | Size: 10 KiB | 
| Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 17 KiB | 
| Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 23 KiB | 
| Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 115 KiB | 
| Before Width: | Height: | Size: 564 B After Width: | Height: | Size: 1.2 KiB | 
| Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 3.2 KiB | 
| Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 5.5 KiB | 
| Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 2.1 KiB | 
| Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 5.3 KiB | 
| Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 8.9 KiB | 
| Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 3.2 KiB | 
| Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 8.1 KiB | 
| Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 13 KiB | 
| Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 13 KiB | 
| Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 22 KiB | 
| Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 7.6 KiB | 
| Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 18 KiB | 
| Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 20 KiB | 
| @@ -5,7 +5,7 @@ | ||||
|     <key>CFBundleDevelopmentRegion</key> | ||||
|     <string>$(DEVELOPMENT_LANGUAGE)</string> | ||||
|     <key>CFBundleDisplayName</key> | ||||
|     <string>Immich Mobile</string> | ||||
|     <string>Immich</string> | ||||
|     <key>CFBundleExecutable</key> | ||||
|     <string>$(EXECUTABLE_NAME)</string> | ||||
|     <key>CFBundleIdentifier</key> | ||||
|   | ||||
| @@ -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<DraggableScrollbar> 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; | ||||
|  | ||||
|   | ||||
| @@ -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, | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   | ||||
| @@ -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); | ||||
|           }, | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   | ||||
| @@ -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, | ||||
|                 ), | ||||
|               ), | ||||
|             ), | ||||
|           ], | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -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( | ||||
|   | ||||
| @@ -3,3 +3,6 @@ build: | ||||
|  | ||||
| watch: | ||||
| 	flutter packages pub run build_runner watch | ||||
|  | ||||
| create_app_icon: | ||||
| 	flutter pub run flutter_launcher_icons:main | ||||
| @@ -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: | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||