From 3210302ecd04ef134aaa081f3c19bd491036dd54 Mon Sep 17 00:00:00 2001
From: martyfuhry <martyfuhry@gmail.com>
Date: Sun, 29 Jan 2023 23:36:26 -0500
Subject: [PATCH] fix(mobile): Fix back button closing the app from
 multiselection in Android (#1477)

* fixes back button multiselection on android in main timeline

* back button on multiselect in album clears selection

* fixed homepage back and refactor future

* not a futureOr
---
 .../album/views/album_viewer_page.dart        | 59 ++++++++++------
 mobile/lib/modules/home/views/home_page.dart  | 68 +++++++++++--------
 2 files changed, 77 insertions(+), 50 deletions(-)

diff --git a/mobile/lib/modules/album/views/album_viewer_page.dart b/mobile/lib/modules/album/views/album_viewer_page.dart
index 03b6581f56..7e2dfac83e 100644
--- a/mobile/lib/modules/album/views/album_viewer_page.dart
+++ b/mobile/lib/modules/album/views/album_viewer_page.dart
@@ -1,3 +1,5 @@
+import 'dart:async';
+
 import 'package:auto_route/auto_route.dart';
 import 'package:easy_localization/easy_localization.dart';
 import 'package:flutter/material.dart';
@@ -248,32 +250,45 @@ class AlbumViewerPage extends HookConsumerWidget {
       );
     }
 
+    Future<bool> onWillPop() async {
+      final isMultiselectEnable = ref.read(assetSelectionProvider).selectedAssetsInAlbumViewer.isNotEmpty;
+      if (isMultiselectEnable) {
+        ref.watch(assetSelectionProvider.notifier).removeAll();
+        return false;
+      }
+
+      return true;
+    }
+
     Widget buildBody(AlbumResponseDto albumInfo) {
-      return GestureDetector(
-        onTap: () {
-          titleFocusNode.unfocus();
-        },
-        child: DraggableScrollbar.semicircle(
-          backgroundColor: Theme.of(context).hintColor,
-          controller: scrollController,
-          heightScrollThumb: 48.0,
-          child: CustomScrollView(
+      return WillPopScope(
+        onWillPop: onWillPop,
+        child: GestureDetector(
+          onTap: () {
+            titleFocusNode.unfocus();
+          },
+          child: DraggableScrollbar.semicircle(
+            backgroundColor: Theme.of(context).hintColor,
             controller: scrollController,
-            slivers: [
-              buildHeader(albumInfo),
-              SliverPersistentHeader(
-                pinned: true,
-                delegate: ImmichSliverPersistentAppBarDelegate(
-                  minHeight: 50,
-                  maxHeight: 50,
-                  child: Container(
-                    color: Theme.of(context).scaffoldBackgroundColor,
-                    child: buildControlButton(albumInfo),
+            heightScrollThumb: 48.0,
+            child: CustomScrollView(
+              controller: scrollController,
+              slivers: [
+                buildHeader(albumInfo),
+                SliverPersistentHeader(
+                  pinned: true,
+                  delegate: ImmichSliverPersistentAppBarDelegate(
+                    minHeight: 50,
+                    maxHeight: 50,
+                    child: Container(
+                      color: Theme.of(context).scaffoldBackgroundColor,
+                      child: buildControlButton(albumInfo),
+                    ),
                   ),
                 ),
-              ),
-              buildImageGrid(albumInfo)
-            ],
+                buildImageGrid(albumInfo)
+              ],
+            ),
           ),
         ),
       );
diff --git a/mobile/lib/modules/home/views/home_page.dart b/mobile/lib/modules/home/views/home_page.dart
index d032a61651..5b1ac7cd14 100644
--- a/mobile/lib/modules/home/views/home_page.dart
+++ b/mobile/lib/modules/home/views/home_page.dart
@@ -200,34 +200,46 @@ class HomePage extends HookConsumerWidget {
         );
       }
 
-      return SafeArea(
-        bottom: !multiselectEnabled.state,
-        top: true,
-        child: Stack(
-          children: [
-            ref.watch(assetProvider).renderList == null ||
-                    ref.watch(assetProvider).allAssets.isEmpty
-                ? buildLoadingIndicator()
-                : ImmichAssetGrid(
-                    renderList: ref.watch(assetProvider).renderList!,
-                    allAssets: ref.watch(assetProvider).allAssets,
-                    assetsPerRow: appSettingService
-                        .getSetting(AppSettingsEnum.tilesPerRow),
-                    showStorageIndicator: appSettingService
-                        .getSetting(AppSettingsEnum.storageIndicator),
-                    listener: selectionListener,
-                    selectionActive: selectionEnabledHook.value,
-                  ),
-            if (selectionEnabledHook.value)
-              ControlBottomAppBar(
-                onShare: onShareAssets,
-                onDelete: onDelete,
-                onAddToAlbum: onAddToAlbum,
-                albums: albums,
-                sharedAlbums: sharedAlbums,
-                onCreateNewAlbum: onCreateNewAlbum,
-              ),
-          ],
+      Future<bool> onWillPop() async {
+        if (multiselectEnabled.state) {
+          selectionEnabledHook.value = false;
+          return false;
+        }
+
+        return true;
+      }
+
+      return WillPopScope(
+        onWillPop: onWillPop,
+        child: SafeArea(
+          bottom: !multiselectEnabled.state,
+          top: true,
+          child: Stack(
+            children: [
+              ref.watch(assetProvider).renderList == null ||
+                      ref.watch(assetProvider).allAssets.isEmpty
+                  ? buildLoadingIndicator()
+                  : ImmichAssetGrid(
+                      renderList: ref.watch(assetProvider).renderList!,
+                      allAssets: ref.watch(assetProvider).allAssets,
+                      assetsPerRow: appSettingService
+                          .getSetting(AppSettingsEnum.tilesPerRow),
+                      showStorageIndicator: appSettingService
+                          .getSetting(AppSettingsEnum.storageIndicator),
+                      listener: selectionListener,
+                      selectionActive: selectionEnabledHook.value,
+                    ),
+              if (selectionEnabledHook.value)
+                ControlBottomAppBar(
+                  onShare: onShareAssets,
+                  onDelete: onDelete,
+                  onAddToAlbum: onAddToAlbum,
+                  albums: albums,
+                  sharedAlbums: sharedAlbums,
+                  onCreateNewAlbum: onCreateNewAlbum,
+                ),
+            ],
+          ),
         ),
       );
     }