[imp]: Better Error handling for Shizuku #36

This commit is contained in:
nahnah
2026-02-11 20:46:02 +00:00
parent f5f149e3bb
commit f873374f30
2 changed files with 141 additions and 1 deletions
+140
View File
@@ -17,6 +17,7 @@ import '../models/fdroid_app.dart';
import '../providers/app_provider.dart';
import '../providers/download_provider.dart';
import '../providers/repositories_provider.dart';
import '../providers/settings_provider.dart';
import '../services/izzy_stats_service.dart';
class AppDetailsScreen extends StatefulWidget {
@@ -174,6 +175,11 @@ class _AppDetailsScreenState extends State<AppDetailsScreen> {
final hasPermission = await downloadProvider
.requestInstallPermission();
if (!hasPermission) {
final settings = context.read<SettingsProvider>();
if (settings.installMethod == InstallMethod.shizuku) {
await _handleShizukuUnavailable(context, settings);
return;
}
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
@@ -302,6 +308,69 @@ class _AppDetailsScreenState extends State<AppDetailsScreen> {
}
}
Future<void> _handleShizukuUnavailable(
BuildContext context,
SettingsProvider settings,
) async {
final action = await showDialog<_ShizukuAction>(
context: context,
builder: (context) => SimpleDialog(
contentPadding: EdgeInsets.all(24),
title: const Text('Shizuku is not running'),
children: [
Text(
'Start the Shizuku app to continue, or switch to the system installer instead.',
),
SizedBox(height: 16),
Column(
spacing: 2.0,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
FilledButton(
onPressed: () async {
try {
final appProvider = context.read<AppProvider>();
await appProvider.openInstalledApp(
'moe.shizuku.privileged.api',
);
} catch (e) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Unable to open Shizuku app'),
),
);
}
}
},
child: const Text('Open Shizuku'),
),
FilledButton.tonal(
onPressed: () =>
Navigator.of(context).pop(_ShizukuAction.switchToSystem),
child: const Text('Use System Installer'),
),
TextButton(
onPressed: () =>
Navigator.of(context).pop(_ShizukuAction.cancel),
child: const Text('Cancel'),
),
],
),
],
),
);
if (action == _ShizukuAction.switchToSystem) {
await settings.setInstallMethod(InstallMethod.system);
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Switched to system installer')),
);
}
}
}
Future<void> _showRepositorySelection(
BuildContext context,
DownloadProvider downloadProvider,
@@ -2531,9 +2600,14 @@ class _VersionDownloadButton extends StatelessWidget {
if (isDownloaded) {
return FilledButton.icon(
onPressed: () async {
final settings = context.read<SettingsProvider>();
final hasPermission = await downloadProvider
.requestInstallPermission();
if (!hasPermission) {
if (settings.installMethod == InstallMethod.shizuku) {
await _handleShizukuUnavailable(context, settings);
return;
}
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
@@ -2606,6 +2680,72 @@ class _VersionDownloadButton extends StatelessWidget {
}
}
enum _ShizukuAction { openApp, switchToSystem, cancel }
Future<void> _handleShizukuUnavailable(
BuildContext context,
SettingsProvider settings,
) async {
final action = await showDialog<_ShizukuAction>(
context: context,
builder: (context) => SimpleDialog(
alignment: Alignment.bottomCenter,
// icon: const Icon(Symbols.warning, size: 48),
contentPadding: EdgeInsets.all(24),
title: const Text('Shizuku is not running'),
children: [
Text(
'Start the Shizuku app to continue, or switch to the system installer instead.',
),
SizedBox(height: 16),
Column(
spacing: 2.0,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
FilledButton(
onPressed: () async {
try {
final appProvider = context.read<AppProvider>();
await appProvider.openInstalledApp(
'moe.shizuku.privileged.api',
);
} catch (e) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Unable to open Shizuku app'),
),
);
}
}
},
child: const Text('Open Shizuku'),
),
FilledButton.tonal(
onPressed: () =>
Navigator.of(context).pop(_ShizukuAction.switchToSystem),
child: const Text('Use System Installer'),
),
TextButton(
onPressed: () => Navigator.of(context).pop(_ShizukuAction.cancel),
child: const Text('Cancel'),
),
],
),
],
),
);
if (action == _ShizukuAction.switchToSystem) {
await settings.setInstallMethod(InstallMethod.system);
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Switched to system installer')),
);
}
}
}
class _ScreenshotsSection extends StatefulWidget {
final FDroidApp app;
final List<String> screenshots;