mirror of
https://github.com/immich-app/immich.git
synced 2026-05-23 07:22:31 -04:00
refactor: yeet old timeline (#27666)
* refactor: yank old timeline # Conflicts: # mobile/lib/presentation/pages/editing/drift_edit.page.dart # mobile/lib/providers/websocket.provider.dart # mobile/lib/routing/router.dart * more cleanup * remove native code * chore: bump sqlite-data version * remove old background tasks from BGTaskSchedulerPermittedIdentifiers * rebase --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
@@ -1,204 +0,0 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
||||
import 'package:immich_mobile/providers/backup/backup.provider.dart';
|
||||
import 'package:immich_mobile/providers/backup/ios_background_settings.provider.dart';
|
||||
import 'package:immich_mobile/widgets/backup/ios_debug_info_tile.dart';
|
||||
import 'package:immich_mobile/widgets/settings/settings_button_list_tile.dart';
|
||||
import 'package:immich_mobile/widgets/settings/settings_slider_list_tile.dart';
|
||||
import 'package:immich_mobile/widgets/settings/settings_switch_list_tile.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
class BackgroundBackupSettings extends ConsumerWidget {
|
||||
const BackgroundBackupSettings({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final isBackgroundEnabled = ref.watch(backupProvider.select((s) => s.backgroundBackup));
|
||||
final iosSettings = ref.watch(iOSBackgroundSettingsProvider);
|
||||
|
||||
void showErrorToUser(String msg) {
|
||||
final snackBar = SnackBar(
|
||||
content: Text(msg.tr(), style: context.textTheme.bodyLarge?.copyWith(color: context.primaryColor)),
|
||||
backgroundColor: Colors.red,
|
||||
);
|
||||
context.scaffoldMessenger.showSnackBar(snackBar);
|
||||
}
|
||||
|
||||
void showBatteryOptimizationInfoToUser() {
|
||||
showDialog<void>(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
builder: (BuildContext ctx) {
|
||||
return AlertDialog(
|
||||
title: const Text('backup_controller_page_background_battery_info_title').tr(),
|
||||
content: SingleChildScrollView(
|
||||
child: const Text('backup_controller_page_background_battery_info_message').tr(),
|
||||
),
|
||||
actions: [
|
||||
ElevatedButton(
|
||||
onPressed: () =>
|
||||
launchUrl(Uri.parse('https://dontkillmyapp.com'), mode: LaunchMode.externalApplication),
|
||||
child: const Text(
|
||||
"backup_controller_page_background_battery_info_link",
|
||||
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12),
|
||||
).tr(),
|
||||
),
|
||||
ElevatedButton(
|
||||
child: const Text(
|
||||
'backup_controller_page_background_battery_info_ok',
|
||||
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12),
|
||||
).tr(),
|
||||
onPressed: () => ctx.pop(),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
if (!isBackgroundEnabled) {
|
||||
return SettingsButtonListTile(
|
||||
icon: Icons.cloud_sync_outlined,
|
||||
title: 'backup_controller_page_background_is_off'.tr(),
|
||||
subtileText: 'backup_controller_page_background_description'.tr(),
|
||||
buttonText: 'backup_controller_page_background_turn_on'.tr(),
|
||||
onButtonTap: () => ref
|
||||
.read(backupProvider.notifier)
|
||||
.configureBackgroundBackup(
|
||||
enabled: true,
|
||||
onError: showErrorToUser,
|
||||
onBatteryInfo: showBatteryOptimizationInfoToUser,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
if (!Platform.isIOS || iosSettings?.appRefreshEnabled == true)
|
||||
_BackgroundSettingsEnabled(onError: showErrorToUser, onBatteryInfo: showBatteryOptimizationInfoToUser),
|
||||
if (Platform.isIOS && iosSettings?.appRefreshEnabled != true) const _IOSBackgroundRefreshDisabled(),
|
||||
if (Platform.isIOS && iosSettings != null) IosDebugInfoTile(settings: iosSettings),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _IOSBackgroundRefreshDisabled extends StatelessWidget {
|
||||
const _IOSBackgroundRefreshDisabled();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SettingsButtonListTile(
|
||||
icon: Icons.task_outlined,
|
||||
title: 'backup_controller_page_background_app_refresh_disabled_title'.tr(),
|
||||
subtileText: 'backup_controller_page_background_app_refresh_disabled_content'.tr(),
|
||||
buttonText: 'backup_controller_page_background_app_refresh_enable_button_text'.tr(),
|
||||
onButtonTap: () => openAppSettings(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _BackgroundSettingsEnabled extends HookConsumerWidget {
|
||||
final void Function(String msg) onError;
|
||||
final void Function() onBatteryInfo;
|
||||
|
||||
const _BackgroundSettingsEnabled({required this.onError, required this.onBatteryInfo});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final isWifiRequired = ref.watch(backupProvider.select((s) => s.backupRequireWifi));
|
||||
final isWifiRequiredNotifier = useValueNotifier(isWifiRequired);
|
||||
useValueChanged(
|
||||
isWifiRequired,
|
||||
(_, __) => WidgetsBinding.instance.addPostFrameCallback((_) => isWifiRequiredNotifier.value = isWifiRequired),
|
||||
);
|
||||
|
||||
final isChargingRequired = ref.watch(backupProvider.select((s) => s.backupRequireCharging));
|
||||
final isChargingRequiredNotifier = useValueNotifier(isChargingRequired);
|
||||
useValueChanged(
|
||||
isChargingRequired,
|
||||
(_, __) =>
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) => isChargingRequiredNotifier.value = isChargingRequired),
|
||||
);
|
||||
|
||||
int backupDelayToSliderValue(int ms) => switch (ms) {
|
||||
5000 => 0,
|
||||
30000 => 1,
|
||||
120000 => 2,
|
||||
_ => 3,
|
||||
};
|
||||
|
||||
int backupDelayToMilliseconds(int v) => switch (v) {
|
||||
0 => 5000,
|
||||
1 => 30000,
|
||||
2 => 120000,
|
||||
_ => 600000,
|
||||
};
|
||||
|
||||
String formatBackupDelaySliderValue(int v) => switch (v) {
|
||||
0 => 'setting_notifications_notify_seconds'.tr(namedArgs: {'count': '5'}),
|
||||
1 => 'setting_notifications_notify_seconds'.tr(namedArgs: {'count': '30'}),
|
||||
2 => 'setting_notifications_notify_minutes'.tr(namedArgs: {'count': '2'}),
|
||||
_ => 'setting_notifications_notify_minutes'.tr(namedArgs: {'count': '10'}),
|
||||
};
|
||||
|
||||
final backupTriggerDelay = ref.watch(backupProvider.select((s) => s.backupTriggerDelay));
|
||||
final triggerDelay = useState(backupDelayToSliderValue(backupTriggerDelay));
|
||||
useValueChanged(
|
||||
triggerDelay.value,
|
||||
(_, __) => ref
|
||||
.read(backupProvider.notifier)
|
||||
.configureBackgroundBackup(
|
||||
triggerDelay: backupDelayToMilliseconds(triggerDelay.value),
|
||||
onError: onError,
|
||||
onBatteryInfo: onBatteryInfo,
|
||||
),
|
||||
);
|
||||
|
||||
return SettingsButtonListTile(
|
||||
icon: Icons.cloud_sync_rounded,
|
||||
iconColor: context.primaryColor,
|
||||
title: 'backup_controller_page_background_is_on'.tr(),
|
||||
buttonText: 'backup_controller_page_background_turn_off'.tr(),
|
||||
onButtonTap: () => ref
|
||||
.read(backupProvider.notifier)
|
||||
.configureBackgroundBackup(enabled: false, onError: onError, onBatteryInfo: onBatteryInfo),
|
||||
subtitle: Column(
|
||||
children: [
|
||||
SettingsSwitchListTile(
|
||||
valueNotifier: isWifiRequiredNotifier,
|
||||
title: 'backup_controller_page_background_wifi'.tr(),
|
||||
icon: Icons.wifi,
|
||||
onChanged: (enabled) => ref
|
||||
.read(backupProvider.notifier)
|
||||
.configureBackgroundBackup(requireWifi: enabled, onError: onError, onBatteryInfo: onBatteryInfo),
|
||||
),
|
||||
SettingsSwitchListTile(
|
||||
valueNotifier: isChargingRequiredNotifier,
|
||||
title: 'backup_controller_page_background_charging'.tr(),
|
||||
icon: Icons.charging_station,
|
||||
onChanged: (enabled) => ref
|
||||
.read(backupProvider.notifier)
|
||||
.configureBackgroundBackup(requireCharging: enabled, onError: onError, onBatteryInfo: onBatteryInfo),
|
||||
),
|
||||
if (Platform.isAndroid)
|
||||
SettingsSliderListTile(
|
||||
valueNotifier: triggerDelay,
|
||||
text: 'backup_controller_page_background_delay'.tr(
|
||||
namedArgs: {'duration': formatBackupDelaySliderValue(triggerDelay.value)},
|
||||
),
|
||||
maxValue: 3.0,
|
||||
noDivisons: 3,
|
||||
label: formatBackupDelaySliderValue(triggerDelay.value),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:immich_mobile/providers/backup/backup_verification.provider.dart';
|
||||
import 'package:immich_mobile/services/app_settings.service.dart';
|
||||
import 'package:immich_mobile/services/asset.service.dart';
|
||||
import 'package:immich_mobile/widgets/settings/backup_settings/background_settings.dart';
|
||||
import 'package:immich_mobile/widgets/settings/backup_settings/foreground_settings.dart';
|
||||
import 'package:immich_mobile/widgets/settings/settings_button_list_tile.dart';
|
||||
import 'package:immich_mobile/widgets/settings/settings_sub_page_scaffold.dart';
|
||||
import 'package:immich_mobile/widgets/settings/settings_switch_list_tile.dart';
|
||||
import 'package:immich_mobile/utils/hooks/app_settings_update_hook.dart';
|
||||
|
||||
class BackupSettings extends HookConsumerWidget {
|
||||
const BackupSettings({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final ignoreIcloudAssets = useAppSettingsState(AppSettingsEnum.ignoreIcloudAssets);
|
||||
final isAdvancedTroubleshooting = useAppSettingsState(AppSettingsEnum.advancedTroubleshooting);
|
||||
final albumSync = useAppSettingsState(AppSettingsEnum.syncAlbums);
|
||||
final isCorruptCheckInProgress = ref.watch(backupVerificationProvider);
|
||||
final isAlbumSyncInProgress = useState(false);
|
||||
|
||||
syncAlbums() async {
|
||||
isAlbumSyncInProgress.value = true;
|
||||
try {
|
||||
await ref.read(assetServiceProvider).syncUploadedAssetToAlbums();
|
||||
} catch (_) {
|
||||
} finally {
|
||||
Future.delayed(const Duration(seconds: 1), () {
|
||||
isAlbumSyncInProgress.value = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
final backupSettings = [
|
||||
const ForegroundBackupSettings(),
|
||||
const BackgroundBackupSettings(),
|
||||
if (Platform.isIOS)
|
||||
SettingsSwitchListTile(
|
||||
valueNotifier: ignoreIcloudAssets,
|
||||
title: 'ignore_icloud_photos'.tr(),
|
||||
subtitle: 'ignore_icloud_photos_description'.tr(),
|
||||
),
|
||||
if (Platform.isAndroid && isAdvancedTroubleshooting.value)
|
||||
SettingsButtonListTile(
|
||||
icon: Icons.warning_rounded,
|
||||
title: 'check_corrupt_asset_backup'.tr(),
|
||||
subtitle: isCorruptCheckInProgress
|
||||
? const Column(
|
||||
children: [
|
||||
SizedBox(height: 20),
|
||||
Center(child: CircularProgressIndicator()),
|
||||
SizedBox(height: 20),
|
||||
],
|
||||
)
|
||||
: null,
|
||||
subtileText: !isCorruptCheckInProgress ? 'check_corrupt_asset_backup_description'.tr() : null,
|
||||
buttonText: 'check_corrupt_asset_backup_button'.tr(),
|
||||
onButtonTap: !isCorruptCheckInProgress
|
||||
? () => ref.read(backupVerificationProvider.notifier).performBackupCheck(context)
|
||||
: null,
|
||||
),
|
||||
if (albumSync.value)
|
||||
SettingsButtonListTile(
|
||||
icon: Icons.photo_album_outlined,
|
||||
title: 'sync_albums'.tr(),
|
||||
subtitle: Text("sync_albums_manual_subtitle".tr()),
|
||||
buttonText: 'sync_albums'.tr(),
|
||||
child: isAlbumSyncInProgress.value
|
||||
? const CircularProgressIndicator()
|
||||
: ElevatedButton(onPressed: syncAlbums, child: Text('sync'.tr())),
|
||||
),
|
||||
];
|
||||
|
||||
return SettingsSubPageScaffold(settings: backupSettings, showDivider: true);
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
||||
import 'package:immich_mobile/providers/backup/backup.provider.dart';
|
||||
import 'package:immich_mobile/widgets/settings/settings_button_list_tile.dart';
|
||||
|
||||
class ForegroundBackupSettings extends ConsumerWidget {
|
||||
const ForegroundBackupSettings({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final isAutoBackup = ref.watch(backupProvider.select((s) => s.autoBackup));
|
||||
|
||||
void onButtonTap() => ref.read(backupProvider.notifier).setAutoBackup(!isAutoBackup);
|
||||
|
||||
if (isAutoBackup) {
|
||||
return SettingsButtonListTile(
|
||||
icon: Icons.cloud_done_rounded,
|
||||
iconColor: context.primaryColor,
|
||||
title: 'backup_controller_page_status_on'.tr(),
|
||||
buttonText: 'backup_controller_page_turn_off'.tr(),
|
||||
onButtonTap: onButtonTap,
|
||||
);
|
||||
}
|
||||
|
||||
return SettingsButtonListTile(
|
||||
icon: Icons.cloud_off_rounded,
|
||||
title: 'backup_controller_page_status_off'.tr(),
|
||||
subtileText: 'backup_controller_page_desc_backup'.tr(),
|
||||
buttonText: 'backup_controller_page_turn_on'.tr(),
|
||||
onButtonTap: onButtonTap,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user