Skip to content

Commit

Permalink
feat(android): Filter Device To Force High Frame Rate (#880)
Browse files Browse the repository at this point in the history
* fix(android): filter device to force HFR

* fix(android): add failsafe in setHighRefreshRate
  • Loading branch information
brianabdl authored Apr 12, 2024
1 parent 22a49e5 commit 6e41b10
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 2 deletions.
5 changes: 3 additions & 2 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:catcher_2/catcher_2.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:dart_discord_rpc/dart_discord_rpc.dart';
import 'package:device_preview/device_preview.dart';
import 'package:flutter/foundation.dart';
Expand Down Expand Up @@ -38,7 +39,7 @@ import 'package:path_provider/path_provider.dart';
import 'package:spotube/hooks/configurators/use_init_sys_tray.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:flutter_displaymode/flutter_displaymode.dart';
import 'package:spotube/utils/android_utils.dart';

Future<void> main(List<String> rawArgs) async {
final arguments = await startCLI(rawArgs);
Expand All @@ -53,7 +54,7 @@ Future<void> main(List<String> rawArgs) async {

// force High Refresh Rate on some Android devices (like One Plus)
if (DesktopTools.platform.isAndroid) {
await FlutterDisplayMode.setHighRefreshRate();
await AndroidUtils.setHighRefreshRate();
}

if (DesktopTools.platform.isDesktop) {
Expand Down
39 changes: 39 additions & 0 deletions lib/utils/android_utils.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import 'package:flutter_displaymode/flutter_displaymode.dart';

abstract class AndroidUtils {

/// Sets the device's display to the highest refresh rate available.
///
/// This method retrieves the list of supported display modes and the currently active display mode.
/// It then selects the display mode with the highest refresh rate that matches the current resolution.
/// The selected display mode is set as the preferred mode using the FlutterDisplayMode plugin.
/// After setting the new mode, it checks if the system is using the new mode.
/// If the system is not using the new mode, it reverts back to the original mode and returns false.
/// Otherwise, it returns true to indicate that the high refresh rate has been successfully set.
///
/// Returns true if the high refresh rate is set successfully, false otherwise.
static Future<bool> setHighRefreshRate() async {
final List<DisplayMode> modes = await FlutterDisplayMode.supported;
final DisplayMode activeMode = await FlutterDisplayMode.active;

DisplayMode newMode = activeMode;
for (final DisplayMode mode in modes) {
if (mode.height == newMode.height &&
mode.width == newMode.width &&
mode.refreshRate > newMode.refreshRate) {
newMode = mode;
}
}

await FlutterDisplayMode.setPreferredMode(newMode);

final display = await FlutterDisplayMode.active; // possibly altered by system

if (display.refreshRate < newMode.refreshRate) {
await FlutterDisplayMode.setPreferredMode(display);
return false;
}

return true;
}
}

0 comments on commit 6e41b10

Please sign in to comment.