mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-11-03 23:03:29 +01:00 
			
		
		
		
	Neat slider ✨
This commit is contained in:
		@@ -1,5 +1,6 @@
 | 
			
		||||
import 'package:device_info_plus/device_info_plus.dart';
 | 
			
		||||
import 'package:easy_localization/easy_localization.dart';
 | 
			
		||||
import 'package:equations/equations.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:obtainium/components/custom_app_bar.dart';
 | 
			
		||||
import 'package:obtainium/components/generated_form.dart';
 | 
			
		||||
@@ -23,14 +24,64 @@ class SettingsPage extends StatefulWidget {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class _SettingsPageState extends State<SettingsPage> {
 | 
			
		||||
  List<int> updateIntervalNodes = [
 | 
			
		||||
    15, 30, 60, 120, 180, 360, 720, 1440, 4320, 10080, 20160, 43200];
 | 
			
		||||
  int updateInterval = 0;
 | 
			
		||||
  late SplineInterpolation updateIntervalInterpolator;  // 🤓
 | 
			
		||||
  String updateIntervalLabel = tr('neverManualOnly');
 | 
			
		||||
  bool showIntervalLabel = true;
 | 
			
		||||
 | 
			
		||||
  void initUpdateIntervalInterpolator() {
 | 
			
		||||
    List<InterpolationNode> nodes = [];
 | 
			
		||||
    for (final (index, element) in updateIntervalNodes.indexed) {
 | 
			
		||||
      nodes.add(InterpolationNode(x: index.toDouble()+1, y: element.toDouble()));
 | 
			
		||||
    }
 | 
			
		||||
    updateIntervalInterpolator = SplineInterpolation(nodes: nodes);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void processIntervalSliderValue(double val) {
 | 
			
		||||
    if (val < 0.5) {
 | 
			
		||||
      updateInterval = 0;
 | 
			
		||||
      updateIntervalLabel = tr('neverManualOnly');
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    int valInterpolated = 0;
 | 
			
		||||
    if (val < 1) {
 | 
			
		||||
      valInterpolated = 15;
 | 
			
		||||
    } else {
 | 
			
		||||
      valInterpolated = updateIntervalInterpolator.compute(val).round();
 | 
			
		||||
    }
 | 
			
		||||
    if (valInterpolated < 60) {
 | 
			
		||||
      updateInterval = valInterpolated;
 | 
			
		||||
      updateIntervalLabel = plural('minute', valInterpolated);
 | 
			
		||||
    } else if (valInterpolated < 8 * 60) {
 | 
			
		||||
      int valRounded = (valInterpolated / 15).ceil() * 15;
 | 
			
		||||
      updateInterval = valRounded;
 | 
			
		||||
      updateIntervalLabel = plural('hour', valRounded ~/ 60);
 | 
			
		||||
      int mins = valRounded % 60;
 | 
			
		||||
      if (mins != 0) updateIntervalLabel += " ${plural('minute', mins)}";
 | 
			
		||||
    } else if (valInterpolated < 24 * 60) {
 | 
			
		||||
      int valRounded = (valInterpolated / 30).ceil() * 30;
 | 
			
		||||
      updateInterval = valRounded;
 | 
			
		||||
      updateIntervalLabel = plural('hour', valRounded / 60);
 | 
			
		||||
    } else if (valInterpolated < 7 * 24 * 60){
 | 
			
		||||
      int valRounded = (valInterpolated / (12 * 60)).ceil() * 12 * 60;
 | 
			
		||||
      updateInterval = valRounded;
 | 
			
		||||
      updateIntervalLabel = plural('day', valRounded / (24 * 60));
 | 
			
		||||
    } else {
 | 
			
		||||
      int valRounded = (valInterpolated / (24 * 60)).ceil() * 24 * 60;
 | 
			
		||||
      updateInterval = valRounded;
 | 
			
		||||
      updateIntervalLabel = plural('day', valRounded ~/ (24 * 60));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
    SettingsProvider settingsProvider = context.watch<SettingsProvider>();
 | 
			
		||||
    SourceProvider sourceProvider = SourceProvider();
 | 
			
		||||
    if (settingsProvider.prefs == null) {
 | 
			
		||||
      settingsProvider.initializeSettings();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (settingsProvider.prefs == null) settingsProvider.initializeSettings();
 | 
			
		||||
    initUpdateIntervalInterpolator();
 | 
			
		||||
    processIntervalSliderValue(settingsProvider.updateIntervalSliderVal);
 | 
			
		||||
    var themeDropdown = DropdownButtonFormField(
 | 
			
		||||
        decoration: InputDecoration(labelText: tr('theme')),
 | 
			
		||||
        value: settingsProvider.theme,
 | 
			
		||||
@@ -143,7 +194,7 @@ class _SettingsPageState extends State<SettingsPage> {
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    var intervalDropdown = DropdownButtonFormField(
 | 
			
		||||
    /*var intervalDropdown = DropdownButtonFormField(
 | 
			
		||||
        decoration: InputDecoration(labelText: tr('bgUpdateCheckInterval')),
 | 
			
		||||
        value: settingsProvider.updateInterval,
 | 
			
		||||
        items: updateIntervals.map((e) {
 | 
			
		||||
@@ -166,7 +217,31 @@ class _SettingsPageState extends State<SettingsPage> {
 | 
			
		||||
          if (value != null) {
 | 
			
		||||
            settingsProvider.updateInterval = value;
 | 
			
		||||
          }
 | 
			
		||||
        });*/
 | 
			
		||||
 | 
			
		||||
    var intervalSlider = Slider(
 | 
			
		||||
      value: settingsProvider.updateIntervalSliderVal,
 | 
			
		||||
      max: updateIntervalNodes.length.toDouble(),
 | 
			
		||||
      divisions: updateIntervalNodes.length * 20,
 | 
			
		||||
      label: updateIntervalLabel,
 | 
			
		||||
      onChanged: (double value) {
 | 
			
		||||
        setState(() {
 | 
			
		||||
          settingsProvider.updateIntervalSliderVal = value;
 | 
			
		||||
          processIntervalSliderValue(value);
 | 
			
		||||
        });
 | 
			
		||||
      },
 | 
			
		||||
      onChangeStart: (double value) {
 | 
			
		||||
        setState(() {
 | 
			
		||||
          showIntervalLabel = false;
 | 
			
		||||
        });
 | 
			
		||||
      },
 | 
			
		||||
      onChangeEnd: (double value) {
 | 
			
		||||
        setState(() {
 | 
			
		||||
          showIntervalLabel = true;
 | 
			
		||||
          settingsProvider.updateInterval = updateInterval;
 | 
			
		||||
        });
 | 
			
		||||
      },
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    var sourceSpecificFields = sourceProvider.sources.map((e) {
 | 
			
		||||
      if (e.sourceConfigSettingFormItems.isNotEmpty) {
 | 
			
		||||
@@ -217,15 +292,19 @@ class _SettingsPageState extends State<SettingsPage> {
 | 
			
		||||
                                  fontWeight: FontWeight.bold,
 | 
			
		||||
                                  color: Theme.of(context).colorScheme.primary),
 | 
			
		||||
                            ),
 | 
			
		||||
                            intervalDropdown,
 | 
			
		||||
                            //intervalDropdown,
 | 
			
		||||
                            height16,
 | 
			
		||||
                            if (showIntervalLabel) SizedBox(
 | 
			
		||||
                                child: Text("${tr('bgUpdateCheckInterval')}: $updateIntervalLabel")
 | 
			
		||||
                            ) else const SizedBox(height: 16),
 | 
			
		||||
                            intervalSlider,
 | 
			
		||||
                            FutureBuilder(
 | 
			
		||||
                                builder: (ctx, val) {
 | 
			
		||||
                                  return (val.data?.version.sdkInt ?? 0) >= 30
 | 
			
		||||
                                  return ((val.data?.version.sdkInt ?? 0) >= 30) || settingsProvider.useShizuku
 | 
			
		||||
                                      ? Column(
 | 
			
		||||
                                          crossAxisAlignment:
 | 
			
		||||
                                              CrossAxisAlignment.start,
 | 
			
		||||
                                          children: [
 | 
			
		||||
                                            height16,
 | 
			
		||||
                                            Row(
 | 
			
		||||
                                              mainAxisAlignment:
 | 
			
		||||
                                                  MainAxisAlignment
 | 
			
		||||
 
 | 
			
		||||
@@ -28,27 +28,6 @@ enum SortOrderSettings { ascending, descending }
 | 
			
		||||
 | 
			
		||||
const maxAPIRateLimitMinutes = 30;
 | 
			
		||||
const minUpdateIntervalMinutes = maxAPIRateLimitMinutes + 30;
 | 
			
		||||
const maxUpdateIntervalMinutes = 43200;
 | 
			
		||||
List<int> updateIntervals = [
 | 
			
		||||
  15,
 | 
			
		||||
  30,
 | 
			
		||||
  60,
 | 
			
		||||
  120,
 | 
			
		||||
  180,
 | 
			
		||||
  360,
 | 
			
		||||
  720,
 | 
			
		||||
  1440,
 | 
			
		||||
  4320,
 | 
			
		||||
  10080,
 | 
			
		||||
  20160,
 | 
			
		||||
  43200,
 | 
			
		||||
  0
 | 
			
		||||
]
 | 
			
		||||
    .where((element) =>
 | 
			
		||||
        (element >= minUpdateIntervalMinutes &&
 | 
			
		||||
            element <= maxUpdateIntervalMinutes) ||
 | 
			
		||||
        element == 0)
 | 
			
		||||
    .toList();
 | 
			
		||||
 | 
			
		||||
class SettingsProvider with ChangeNotifier {
 | 
			
		||||
  SharedPreferences? prefs;
 | 
			
		||||
@@ -121,21 +100,20 @@ class SettingsProvider with ChangeNotifier {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int get updateInterval {
 | 
			
		||||
    var min = prefs?.getInt('updateInterval') ?? 360;
 | 
			
		||||
    if (!updateIntervals.contains(min)) {
 | 
			
		||||
      var temp = updateIntervals[0];
 | 
			
		||||
      for (var i in updateIntervals) {
 | 
			
		||||
        if (min > i && i != 0) {
 | 
			
		||||
          temp = i;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      min = temp;
 | 
			
		||||
    }
 | 
			
		||||
    return min;
 | 
			
		||||
    return prefs?.getInt('updateInterval') ?? 360;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  set updateInterval(int min) {
 | 
			
		||||
    prefs?.setInt('updateInterval', (min < 15 && min != 0) ? 15 : min);
 | 
			
		||||
    prefs?.setInt('updateInterval', min);
 | 
			
		||||
    notifyListeners();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  double get updateIntervalSliderVal {
 | 
			
		||||
    return prefs?.getDouble('updateIntervalSliderVal') ?? 6.0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  set updateIntervalSliderVal(double val) {
 | 
			
		||||
    prefs?.setDouble('updateIntervalSliderVal', val);
 | 
			
		||||
    notifyListeners();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								pubspec.lock
									
									
									
									
									
								
							@@ -235,6 +235,14 @@ packages:
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.0.2"
 | 
			
		||||
  equations:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
      name: equations
 | 
			
		||||
      sha256: ae30e977d601e19aa1fc3409736c5eac01559d1d653a4c30141fbc4e86aa605c
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "5.0.2"
 | 
			
		||||
  fake_async:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -345,10 +353,10 @@ packages:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
      name: flutter_markdown
 | 
			
		||||
      sha256: "31c12de79262b5431c5492e9c89948aa789158435f707d3519a7fdef6af28af7"
 | 
			
		||||
      sha256: "04c4722cc36ec5af38acc38ece70d22d3c2123c61305d555750a091517bbe504"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.6.22+1"
 | 
			
		||||
    version: "0.6.23"
 | 
			
		||||
  flutter_plugin_android_lifecycle:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -375,6 +383,14 @@ packages:
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "8.2.5"
 | 
			
		||||
  fraction:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: fraction
 | 
			
		||||
      sha256: "09e9504c9177bbd77df56e5d147abfbb3b43360e64bf61510059c14d6a82d524"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "5.0.2"
 | 
			
		||||
  gtk:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -643,10 +659,10 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: petitparser
 | 
			
		||||
      sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
 | 
			
		||||
      sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "6.0.2"
 | 
			
		||||
    version: "5.4.0"
 | 
			
		||||
  platform:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
@@ -1025,10 +1041,10 @@ packages:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: xml
 | 
			
		||||
      sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
 | 
			
		||||
      sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "6.5.0"
 | 
			
		||||
    version: "6.3.0"
 | 
			
		||||
  yaml:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
 
 | 
			
		||||
@@ -68,6 +68,7 @@ dependencies:
 | 
			
		||||
  crypto: ^3.0.3
 | 
			
		||||
  app_links: ^4.0.0
 | 
			
		||||
  background_fetch: ^1.2.1
 | 
			
		||||
  equations: ^5.0.2
 | 
			
		||||
  android_system_font:
 | 
			
		||||
    git:
 | 
			
		||||
      url: https://github.com/re7gog/android_system_font
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user