Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 0 additions & 132 deletions lib/about_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,29 +14,15 @@
* limitations under the License.
*/

import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:logging/logging.dart';
import 'package:material_symbols_icons/symbols.dart';

import 'android/state.dart';
import 'app/app_url_launcher.dart';
import 'app/logging.dart';
import 'app/message.dart';
import 'app/state.dart';
import 'app/views/keys.dart';
import 'core/state.dart';
import 'desktop/state.dart';
import 'generated/l10n/app_localizations.dart';
import 'version.dart';
import 'widgets/choice_filter_chip.dart';
import 'widgets/responsive_dialog.dart';

final _log = Logger('about');

class AboutPage extends ConsumerWidget {
const AboutPage({super.key});

Expand Down Expand Up @@ -145,127 +131,9 @@ class AboutPage extends ConsumerWidget {
),
],
),
const Padding(
padding: EdgeInsets.only(top: 24.0, bottom: 8.0),
child: Divider(),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: Text(
l10n.s_troubleshooting,
style: Theme.of(context).textTheme.titleMedium,
),
),
const LoggingPanel(),

// Diagnostics (desktop only)
if (isDesktop) ...[
const SizedBox(height: 12.0),
ActionChip(
key: diagnosticsChip,
avatar: const Icon(Symbols.bug_report),
label: Text(l10n.s_run_diagnostics),
onPressed: () async {
_log.info('Running diagnostics...');
final response = await ref
.read(rpcProvider)
.requireValue
.command('diagnose', []);
final data = response['diagnostics'] as List;
data.insert(0, {
'app_version': version,
'dart': Platform.version,
'os': Platform.operatingSystem,
'os_version': Platform.operatingSystemVersion,
});
data.insert(
data.length - 1,
ref.read(featureFlagProvider),
);
final text = const JsonEncoder.withIndent(
' ',
).convert(data);
await ref.read(clipboardProvider).setText(text);
await ref.read(withContextProvider)((context) async {
showMessage(context, l10n.l_diagnostics_copied);
});
},
),
],

// Enable screenshots (Android only)
if (isAndroid) ...[
const SizedBox(height: 12.0),
FilterChip(
key: screenshotChip,
label: Text(l10n.s_allow_screenshots),
selected: ref.watch(androidAllowScreenshotsProvider),
onSelected: (value) async {
ref
.read(androidAllowScreenshotsProvider.notifier)
.setAllowScreenshots(value);
},
),
],
],
),
),
);
}
}

class LoggingPanel extends ConsumerWidget {
const LoggingPanel({super.key});

@override
Widget build(BuildContext context, WidgetRef ref) {
final l10n = AppLocalizations.of(context);
final logLevel = ref.watch(logLevelProvider);
return Wrap(
alignment: WrapAlignment.center,
spacing: 4.0,
runSpacing: 8.0,
children: [
ChoiceFilterChip<Level>(
avatar: Icon(
Symbols.insights,
color: Theme.of(context).colorScheme.primary,
),
value: logLevel,
items: Levels.LEVELS,
selected: logLevel != Level.INFO,
labelBuilder:
(value) => Text(
l10n.s_log_level(
value.name[0] + value.name.substring(1).toLowerCase(),
),
),
itemBuilder:
(value) => Text(
'${value.name[0]}${value.name.substring(1).toLowerCase()}',
),
onChanged: (level) {
ref.read(logLevelProvider.notifier).setLogLevel(level);
_log.debug('Log level set to $level');
},
),
ActionChip(
key: logChip,
avatar: const Icon(Symbols.content_copy),
label: Text(l10n.s_copy_log),
onPressed: () async {
_log.info('Copying log to clipboard ($version)...');
final logs = await ref.read(logLevelProvider.notifier).getLogs();
var clipboard = ref.read(clipboardProvider);
await clipboard.setText(logs.join('\n'));
if (!clipboard.platformGivesFeedback()) {
await ref.read(withContextProvider)((context) async {
showMessage(context, l10n.l_log_copied);
});
}
},
),
],
);
}
}
3 changes: 3 additions & 0 deletions lib/android/init.dart
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ Future<Widget> initialize() async {
clipboardProvider.overrideWith(
(ref) => ref.watch(androidClipboardProvider),
),
logPanelVisibilityProvider.overrideWith(
(ref) => LogPanelVisibilityNotifier(kDebugMode),
),
androidSdkVersionProvider.overrideWithValue(await getAndroidSdkVersion()),
androidNfcSupportProvider.overrideWithValue(await getHasNfc()),
supportedSectionsProvider.overrideWithValue([
Expand Down
1 change: 1 addition & 0 deletions lib/android/keys.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ const readFromImage = Key('$_prefix.read_image_file');
const nfcBypassTouchSetting = Key('$_prefix.nfc_bypass_touch');
const nfcSilenceSoundsSettings = Key('$_prefix.nfc_silence_sounds');
const usbOpenApp = Key('$_prefix.usb_open_app');
const allowScreenshotsSetting = Key('$_prefix.allow_screenshots');

const nfcTapSetting = Key('$_prefix.nfc_tap');
Key nfcTapOption(NfcTapAction action) =>
Expand Down
21 changes: 21 additions & 0 deletions lib/android/views/settings_views.dart
Original file line number Diff line number Diff line change
Expand Up @@ -204,3 +204,24 @@ class UsbOpenAppView extends ConsumerWidget {
);
}
}

class AllowScreenshotsView extends ConsumerWidget {
const AllowScreenshotsView({super.key});

@override
Widget build(BuildContext context, WidgetRef ref) {
final l10n = AppLocalizations.of(context);
final allowScreenshots = ref.watch(androidAllowScreenshotsProvider);
return SwitchListTile(
title: Text(l10n.s_allow_screenshots),
subtitle: Text(l10n.l_allow_screenshots_desc),
value: allowScreenshots,
key: keys.allowScreenshotsSetting,
onChanged: (value) {
ref
.read(androidAllowScreenshotsProvider.notifier)
.setAllowScreenshots(value);
},
);
}
}
43 changes: 20 additions & 23 deletions lib/app/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';

import '../generated/l10n/app_localizations.dart';
import '../theme.dart';
import 'logging.dart';
import 'shortcuts.dart';
import 'state.dart';

Expand All @@ -31,28 +30,26 @@ class YubicoAuthenticatorApp extends StatelessWidget {

@override
Widget build(BuildContext context) => GlobalShortcuts(
child: LogWarningOverlay(
child: Consumer(
builder: (context, ref, _) {
final primaryColor = ref.watch(primaryColorProvider);
return MaterialApp(
title: ref.watch(l10nProvider).app_name,
theme: AppTheme.getLightTheme(primaryColor),
darkTheme: AppTheme.getDarkTheme(primaryColor),
themeMode: ref.watch(themeModeProvider),
home: page,
debugShowCheckedModeBanner: false,
locale: ref.watch(currentLocaleProvider),
supportedLocales: AppLocalizations.supportedLocales,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
);
},
),
child: Consumer(
builder: (context, ref, _) {
final primaryColor = ref.watch(primaryColorProvider);
return MaterialApp(
title: ref.watch(l10nProvider).app_name,
theme: AppTheme.getLightTheme(primaryColor),
darkTheme: AppTheme.getDarkTheme(primaryColor),
themeMode: ref.watch(themeModeProvider),
home: page,
debugShowCheckedModeBanner: false,
locale: ref.watch(currentLocaleProvider),
supportedLocales: AppLocalizations.supportedLocales,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
);
},
),
);
}
Loading
Loading