Remove in-app updater and open_filex integration
This commit is contained in:
@@ -1,65 +0,0 @@
|
|||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:refilc/api/client.dart';
|
|
||||||
import 'package:refilc/models/release.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:package_info_plus/package_info_plus.dart';
|
|
||||||
|
|
||||||
class UpdateProvider extends ChangeNotifier {
|
|
||||||
// Private
|
|
||||||
late List<Release> _releases;
|
|
||||||
bool _available = false;
|
|
||||||
bool get available => _available && _releases.isNotEmpty;
|
|
||||||
|
|
||||||
// Public
|
|
||||||
List<Release> get releases => _releases;
|
|
||||||
|
|
||||||
UpdateProvider({
|
|
||||||
List<Release> initialReleases = const [],
|
|
||||||
required BuildContext context,
|
|
||||||
}) {
|
|
||||||
_releases = List.castFrom(initialReleases);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> fetch() async {
|
|
||||||
late String currentVersion;
|
|
||||||
PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
|
||||||
currentVersion = packageInfo.version;
|
|
||||||
|
|
||||||
if (!Platform.isAndroid) return;
|
|
||||||
|
|
||||||
_releases = await FilcAPI.getReleases() ?? [];
|
|
||||||
_releases.sort((a, b) => -a.version.compareTo(b.version));
|
|
||||||
|
|
||||||
// Check for new releases
|
|
||||||
if (_releases.isNotEmpty) {
|
|
||||||
if (!_releases.first.prerelease) {
|
|
||||||
_available = _releases.first.version
|
|
||||||
.compareTo(Version.fromString(currentVersion)) ==
|
|
||||||
1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ignore: avoid_print
|
|
||||||
if (_available) print("INFO: New update: ${releases.first.version}");
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Map> installedVersion() async {
|
|
||||||
PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
|
||||||
|
|
||||||
String appName = packageInfo.appName;
|
|
||||||
String packageName = packageInfo.packageName;
|
|
||||||
String version = packageInfo.version;
|
|
||||||
String buildNumber = packageInfo.buildNumber;
|
|
||||||
|
|
||||||
Map<String, String> release = {
|
|
||||||
"app_name": appName,
|
|
||||||
"package_name": packageName,
|
|
||||||
"version": version,
|
|
||||||
"build_number": buildNumber,
|
|
||||||
};
|
|
||||||
|
|
||||||
return release;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -73,7 +73,6 @@ import 'package:refilc_kreta_api/providers/message_provider.dart';
|
|||||||
import 'package:refilc_kreta_api/providers/note_provider.dart';
|
import 'package:refilc_kreta_api/providers/note_provider.dart';
|
||||||
import 'package:refilc_kreta_api/providers/timetable_provider.dart';
|
import 'package:refilc_kreta_api/providers/timetable_provider.dart';
|
||||||
import 'package:refilc/api/providers/user_provider.dart';
|
import 'package:refilc/api/providers/user_provider.dart';
|
||||||
import 'package:refilc/api/providers/update_provider.dart';
|
|
||||||
import 'package:refilc_mobile_ui/pages/grades/calculator/grade_calculator_provider.dart';
|
import 'package:refilc_mobile_ui/pages/grades/calculator/grade_calculator_provider.dart';
|
||||||
import 'package:flutter_displaymode/flutter_displaymode.dart';
|
import 'package:flutter_displaymode/flutter_displaymode.dart';
|
||||||
import 'package:refilc_plus/providers/plus_provider.dart';
|
import 'package:refilc_plus/providers/plus_provider.dart';
|
||||||
@@ -129,9 +128,6 @@ class App extends StatelessWidget {
|
|||||||
ChangeNotifierProvider<NewsProvider>(
|
ChangeNotifierProvider<NewsProvider>(
|
||||||
create: (context) => NewsProvider(context: context),
|
create: (context) => NewsProvider(context: context),
|
||||||
),
|
),
|
||||||
ChangeNotifierProvider<UpdateProvider>(
|
|
||||||
create: (context) => UpdateProvider(context: context),
|
|
||||||
),
|
|
||||||
ChangeNotifierProvider<AdProvider>(
|
ChangeNotifierProvider<AdProvider>(
|
||||||
create: (context) => AdProvider(context: context),
|
create: (context) => AdProvider(context: context),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import 'package:refilc_kreta_api/client/client.dart';
|
|||||||
import 'package:refilc_kreta_api/models/attachment.dart';
|
import 'package:refilc_kreta_api/models/attachment.dart';
|
||||||
import 'package:refilc_kreta_api/models/homework.dart';
|
import 'package:refilc_kreta_api/models/homework.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:open_filex/open_filex.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
extension AttachmentHelper on Attachment {
|
extension AttachmentHelper on Attachment {
|
||||||
Future<String> download(BuildContext context,
|
Future<String> download(BuildContext context,
|
||||||
@@ -32,8 +32,10 @@ extension AttachmentHelper on Attachment {
|
|||||||
String downloads = await StorageHelper.downloadsPath();
|
String downloads = await StorageHelper.downloadsPath();
|
||||||
|
|
||||||
if (!await File("$downloads/$name").exists()) await download(context);
|
if (!await File("$downloads/$name").exists()) await download(context);
|
||||||
var result = await OpenFilex.open("$downloads/$name");
|
return launchUrl(
|
||||||
return result.type == ResultType.done;
|
Uri.file("$downloads/$name"),
|
||||||
|
mode: LaunchMode.externalApplication,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,7 +61,9 @@ extension HomeworkAttachmentHelper on HomeworkAttachment {
|
|||||||
String downloads = await StorageHelper.downloadsPath();
|
String downloads = await StorageHelper.downloadsPath();
|
||||||
|
|
||||||
if (!await File("$downloads/$name").exists()) await download(context);
|
if (!await File("$downloads/$name").exists()) await download(context);
|
||||||
var result = await OpenFilex.open("$downloads/$name");
|
return launchUrl(
|
||||||
return result.type == ResultType.done;
|
Uri.file("$downloads/$name"),
|
||||||
|
mode: LaunchMode.externalApplication,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
import 'dart:async';
|
|
||||||
import 'dart:io';
|
|
||||||
import 'dart:typed_data';
|
|
||||||
|
|
||||||
import 'package:refilc/api/client.dart';
|
|
||||||
import 'package:refilc/helpers/storage_helper.dart';
|
|
||||||
import 'package:refilc/models/release.dart';
|
|
||||||
import 'package:open_filex/open_filex.dart';
|
|
||||||
import 'package:permission_handler/permission_handler.dart';
|
|
||||||
|
|
||||||
enum UpdateState { none, preparing, downloading, installing }
|
|
||||||
|
|
||||||
typedef UpdateCallback = Function(double progress, UpdateState state);
|
|
||||||
|
|
||||||
// ignore: todo
|
|
||||||
// TODO: cleanup old apk files
|
|
||||||
|
|
||||||
extension UpdateHelper on Release {
|
|
||||||
Future<void> install({UpdateCallback? updateCallback}) async {
|
|
||||||
updateCallback!(-1, UpdateState.preparing);
|
|
||||||
|
|
||||||
String downloads = await StorageHelper.downloadsPath();
|
|
||||||
File apk = File("$downloads/refilc-v$version.apk");
|
|
||||||
|
|
||||||
if (!await apk.exists()) {
|
|
||||||
updateCallback(-1, UpdateState.downloading);
|
|
||||||
|
|
||||||
var bytes = await download(updateCallback: updateCallback);
|
|
||||||
if (!await StorageHelper.write(apk.path, bytes)) {
|
|
||||||
throw "failed to write apk: permission denied";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
updateCallback(-1, UpdateState.installing);
|
|
||||||
|
|
||||||
var installPerms =
|
|
||||||
(await Permission.manageExternalStorage.request().isGranted &&
|
|
||||||
await Permission.requestInstallPackages.request().isGranted);
|
|
||||||
if (installPerms) {
|
|
||||||
var result = await OpenFilex.open(apk.path);
|
|
||||||
|
|
||||||
if (result.type != ResultType.done) {
|
|
||||||
// ignore: avoid_print
|
|
||||||
print("ERROR: installUpdate.openFile: ${result.message}");
|
|
||||||
throw result.message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
updateCallback(-1, UpdateState.none);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Uint8List> download({UpdateCallback? updateCallback}) async {
|
|
||||||
var response = await FilcAPI.downloadRelease(downloads.first);
|
|
||||||
|
|
||||||
List<List<int>> chunks = [];
|
|
||||||
int downloaded = 0;
|
|
||||||
|
|
||||||
var completer = Completer<Uint8List>();
|
|
||||||
|
|
||||||
response?.stream.listen((List<int> chunk) {
|
|
||||||
updateCallback!(
|
|
||||||
downloaded / (response.contentLength ?? 0), UpdateState.downloading);
|
|
||||||
|
|
||||||
chunks.add(chunk);
|
|
||||||
downloaded += chunk.length;
|
|
||||||
}, onDone: () {
|
|
||||||
// Save the file
|
|
||||||
final Uint8List bytes = Uint8List(response.contentLength ?? 0);
|
|
||||||
int offset = 0;
|
|
||||||
for (List<int> chunk in chunks) {
|
|
||||||
bytes.setRange(offset, offset + chunk.length, chunk);
|
|
||||||
offset += chunk.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
completer.complete(bytes);
|
|
||||||
});
|
|
||||||
|
|
||||||
return completer.future;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
import 'package:refilc/api/providers/ad_provider.dart';
|
import 'package:refilc/api/providers/ad_provider.dart';
|
||||||
import 'package:refilc/api/providers/update_provider.dart';
|
|
||||||
import 'package:refilc/models/settings.dart';
|
import 'package:refilc/models/settings.dart';
|
||||||
import 'package:refilc/ui/date_widget.dart';
|
import 'package:refilc/ui/date_widget.dart';
|
||||||
import 'package:refilc/ui/filter/widgets/grades.dart' as grade_filter;
|
import 'package:refilc/ui/filter/widgets/grades.dart' as grade_filter;
|
||||||
@@ -12,7 +11,6 @@ import 'package:refilc/ui/filter/widgets/exams.dart' as exam_filter;
|
|||||||
import 'package:refilc/ui/filter/widgets/notes.dart' as note_filter;
|
import 'package:refilc/ui/filter/widgets/notes.dart' as note_filter;
|
||||||
import 'package:refilc/ui/filter/widgets/events.dart' as event_filter;
|
import 'package:refilc/ui/filter/widgets/events.dart' as event_filter;
|
||||||
import 'package:refilc/ui/filter/widgets/lessons.dart' as lesson_filter;
|
import 'package:refilc/ui/filter/widgets/lessons.dart' as lesson_filter;
|
||||||
import 'package:refilc/ui/filter/widgets/update.dart' as update_filter;
|
|
||||||
import 'package:refilc/ui/filter/widgets/missed_exams.dart'
|
import 'package:refilc/ui/filter/widgets/missed_exams.dart'
|
||||||
as missed_exam_filter;
|
as missed_exam_filter;
|
||||||
import 'package:refilc/ui/filter/widgets/ads.dart' as ad_filter;
|
import 'package:refilc/ui/filter/widgets/ads.dart' as ad_filter;
|
||||||
@@ -54,7 +52,6 @@ enum FilterType {
|
|||||||
notes,
|
notes,
|
||||||
events,
|
events,
|
||||||
lessons,
|
lessons,
|
||||||
updates,
|
|
||||||
certifications,
|
certifications,
|
||||||
missedExams,
|
missedExams,
|
||||||
ads,
|
ads,
|
||||||
@@ -70,7 +67,6 @@ Future<List<DateWidget>> getFilterWidgets(FilterType activeData,
|
|||||||
final examProvider = Provider.of<ExamProvider>(context);
|
final examProvider = Provider.of<ExamProvider>(context);
|
||||||
final noteProvider = Provider.of<NoteProvider>(context);
|
final noteProvider = Provider.of<NoteProvider>(context);
|
||||||
final eventProvider = Provider.of<EventProvider>(context);
|
final eventProvider = Provider.of<EventProvider>(context);
|
||||||
final updateProvider = Provider.of<UpdateProvider>(context);
|
|
||||||
final settingsProvider = Provider.of<SettingsProvider>(context);
|
final settingsProvider = Provider.of<SettingsProvider>(context);
|
||||||
final adProvider = Provider.of<AdProvider>(context);
|
final adProvider = Provider.of<AdProvider>(context);
|
||||||
|
|
||||||
@@ -87,7 +83,6 @@ Future<List<DateWidget>> getFilterWidgets(FilterType activeData,
|
|||||||
context: context, absencesNoExcused: true),
|
context: context, absencesNoExcused: true),
|
||||||
getFilterWidgets(FilterType.homework, context: context),
|
getFilterWidgets(FilterType.homework, context: context),
|
||||||
getFilterWidgets(FilterType.exams, context: context),
|
getFilterWidgets(FilterType.exams, context: context),
|
||||||
getFilterWidgets(FilterType.updates, context: context),
|
|
||||||
getFilterWidgets(FilterType.certifications, context: context),
|
getFilterWidgets(FilterType.certifications, context: context),
|
||||||
getFilterWidgets(FilterType.missedExams, context: context),
|
getFilterWidgets(FilterType.missedExams, context: context),
|
||||||
getFilterWidgets(FilterType.ads, context: context),
|
getFilterWidgets(FilterType.ads, context: context),
|
||||||
@@ -162,13 +157,6 @@ Future<List<DateWidget>> getFilterWidgets(FilterType activeData,
|
|||||||
.getWidgets(timetableProvider.getWeek(Week.current()) ?? []);
|
.getWidgets(timetableProvider.getWeek(Week.current()) ?? []);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Updates
|
|
||||||
case FilterType.updates:
|
|
||||||
if (updateProvider.available) {
|
|
||||||
items = [update_filter.getWidget(updateProvider.releases.first)];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Missed Exams
|
// Missed Exams
|
||||||
case FilterType.missedExams:
|
case FilterType.missedExams:
|
||||||
items = missed_exam_filter
|
items = missed_exam_filter
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
import 'package:refilc/models/release.dart';
|
|
||||||
import 'package:refilc/ui/date_widget.dart';
|
|
||||||
import 'package:refilc_mobile_ui/common/widgets/update/update_viewable.dart'
|
|
||||||
as mobile;
|
|
||||||
|
|
||||||
DateWidget getWidget(Release providerRelease) {
|
|
||||||
return DateWidget(
|
|
||||||
date: DateTime.now(),
|
|
||||||
widget: mobile.UpdateViewable(providerRelease),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -33,7 +33,6 @@ dependencies:
|
|||||||
http: ^1.3.0
|
http: ^1.3.0
|
||||||
uuid: ^4.5.1
|
uuid: ^4.5.1
|
||||||
html: ^0.15.5
|
html: ^0.15.5
|
||||||
open_filex: ^4.6.0
|
|
||||||
path_provider: ^2.1.5
|
path_provider: ^2.1.5
|
||||||
permission_handler: ^12.0.0
|
permission_handler: ^12.0.0
|
||||||
share_plus: ^10.1.4
|
share_plus: ^10.1.4
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
import 'package:refilc/models/release.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:refilc_mobile_ui/common/panel/panel_button.dart';
|
|
||||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
|
||||||
import 'update_tile.i18n.dart';
|
|
||||||
|
|
||||||
class UpdateTile extends StatelessWidget {
|
|
||||||
const UpdateTile(this.release, {super.key, this.onTap, this.padding});
|
|
||||||
|
|
||||||
final Release release;
|
|
||||||
final Function()? onTap;
|
|
||||||
final EdgeInsetsGeometry? padding;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Padding(
|
|
||||||
padding: padding ?? const EdgeInsets.symmetric(horizontal: 8.0),
|
|
||||||
child: PanelButton(
|
|
||||||
onPressed: onTap,
|
|
||||||
title: Text("update_available".i18n),
|
|
||||||
leading: const Icon(FeatherIcons.download),
|
|
||||||
trailing: Text(
|
|
||||||
release.tag,
|
|
||||||
style: TextStyle(
|
|
||||||
fontWeight: FontWeight.w500,
|
|
||||||
color: Theme.of(context).colorScheme.secondary,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
import 'package:i18n_extension/i18n_extension.dart';
|
|
||||||
|
|
||||||
extension Localization on String {
|
|
||||||
static final _t = Translations.byLocale("hu_hu") +
|
|
||||||
{
|
|
||||||
"en_en": {
|
|
||||||
"update_available": "Update Available",
|
|
||||||
},
|
|
||||||
"hu_hu": {
|
|
||||||
"update_available": "Frissítés elérhető",
|
|
||||||
},
|
|
||||||
"de_de": {
|
|
||||||
"update_available": "Update verfügbar",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
String get i18n => localize(this, _t);
|
|
||||||
String fill(List<Object> params) => localizeFill(this, params);
|
|
||||||
String plural(int value) => localizePlural(value, this, _t);
|
|
||||||
String version(Object modifier) => localizeVersion(modifier, this, _t);
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
import 'package:refilc/models/release.dart';
|
|
||||||
import 'package:refilc_mobile_ui/common/widgets/update/update_tile.dart';
|
|
||||||
import 'package:refilc_mobile_ui/common/widgets/update/updates_view.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class UpdateViewable extends StatelessWidget {
|
|
||||||
const UpdateViewable(this.release, {super.key});
|
|
||||||
|
|
||||||
final Release release;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return UpdateTile(
|
|
||||||
release,
|
|
||||||
onTap: () => UpdateView.show(release, context: context),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,185 +0,0 @@
|
|||||||
import 'package:refilc/api/providers/status_provider.dart';
|
|
||||||
import 'package:refilc/models/release.dart';
|
|
||||||
import 'package:refilc/theme/colors/colors.dart';
|
|
||||||
import 'package:refilc/utils/color.dart';
|
|
||||||
import 'package:refilc_mobile_ui/common/bottom_card.dart';
|
|
||||||
import 'package:refilc_mobile_ui/common/custom_snack_bar.dart';
|
|
||||||
import 'package:refilc_mobile_ui/common/material_action_button.dart';
|
|
||||||
import 'package:refilc/helpers/update_helper.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_custom_tabs/flutter_custom_tabs.dart';
|
|
||||||
import 'package:flutter_markdown/flutter_markdown.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
|
||||||
import 'package:connectivity_plus/connectivity_plus.dart';
|
|
||||||
import 'updates_view.i18n.dart';
|
|
||||||
|
|
||||||
class UpdateView extends StatefulWidget {
|
|
||||||
const UpdateView(this.release, {super.key});
|
|
||||||
|
|
||||||
final Release release;
|
|
||||||
|
|
||||||
static void show(Release release, {required BuildContext context}) =>
|
|
||||||
showBottomCard(context: context, child: UpdateView(release));
|
|
||||||
|
|
||||||
@override
|
|
||||||
UpdateViewState createState() => UpdateViewState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class UpdateViewState extends State<UpdateView> {
|
|
||||||
double progress = 0.0;
|
|
||||||
UpdateState state = UpdateState.none;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.all(12.0),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 12.0),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
"new_update".i18n,
|
|
||||||
style: const TextStyle(
|
|
||||||
fontWeight: FontWeight.w700, fontSize: 18.0),
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
"${widget.release.version}",
|
|
||||||
style: TextStyle(
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
fontSize: 16.0,
|
|
||||||
color:
|
|
||||||
AppColors.of(context).text.withValues(alpha: 0.6),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
ClipRRect(
|
|
||||||
borderRadius: BorderRadius.circular(18.0),
|
|
||||||
child: Image.asset(
|
|
||||||
"assets/images/pixel.png",
|
|
||||||
width: 64.0,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
// Description
|
|
||||||
Container(
|
|
||||||
margin: const EdgeInsets.only(top: 8.0),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.circular(12.0),
|
|
||||||
),
|
|
||||||
child: SizedBox(
|
|
||||||
height: 200.0,
|
|
||||||
child: Markdown(
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 12.0),
|
|
||||||
physics: const BouncingScrollPhysics(),
|
|
||||||
data: widget.release.body,
|
|
||||||
onTapLink: (text, href, title) =>
|
|
||||||
launchUrl(Uri.parse(href ?? "")),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
// Download button
|
|
||||||
Center(
|
|
||||||
child: MaterialActionButton(
|
|
||||||
backgroundColor: AppColors.of(context).filc,
|
|
||||||
onPressed:
|
|
||||||
state == UpdateState.none ? () => downloadPrecheck() : null,
|
|
||||||
child: Row(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
if (state == UpdateState.downloading ||
|
|
||||||
state == UpdateState.preparing)
|
|
||||||
Container(
|
|
||||||
height: 18.0,
|
|
||||||
width: 18.0,
|
|
||||||
margin: const EdgeInsets.only(right: 8.0),
|
|
||||||
child: CircularProgressIndicator(
|
|
||||||
value: progress > 0.05 ? progress : null,
|
|
||||||
color: ColorUtils.foregroundColor(
|
|
||||||
AppColors.of(context).filc),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Text([
|
|
||||||
"download".i18n,
|
|
||||||
"downloading".i18n,
|
|
||||||
"downloading".i18n,
|
|
||||||
"installing".i18n
|
|
||||||
][state.index]
|
|
||||||
.toUpperCase()),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
String fmtSize() =>
|
|
||||||
"${(widget.release.downloads.first.size / 1024 / 1024).toStringAsFixed(1)} MB";
|
|
||||||
|
|
||||||
void downloadPrecheck() {
|
|
||||||
final status = Provider.of<StatusProvider>(context, listen: false);
|
|
||||||
if (status.networkType == ConnectivityResult.mobile) {
|
|
||||||
showDialog(
|
|
||||||
context: context,
|
|
||||||
builder: (context) => AlertDialog(
|
|
||||||
title: Text("mobileAlertTitle".i18n),
|
|
||||||
content: Text("mobileAlertDesc".i18n.fill([fmtSize()])),
|
|
||||||
actions: [
|
|
||||||
TextButton(
|
|
||||||
onPressed: () {
|
|
||||||
Navigator.of(context).pop(false);
|
|
||||||
},
|
|
||||||
child: Text("no".i18n),
|
|
||||||
),
|
|
||||||
TextButton(
|
|
||||||
onPressed: () {
|
|
||||||
Navigator.of(context).pop(true);
|
|
||||||
},
|
|
||||||
child: Text("yes".i18n),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
).then((value) => value ? download() : null);
|
|
||||||
} else {
|
|
||||||
download();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void download() {
|
|
||||||
widget.release
|
|
||||||
.install(updateCallback: (p, s) {
|
|
||||||
if (mounted) {
|
|
||||||
setState(() {
|
|
||||||
progress = p;
|
|
||||||
state = s;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.then((_) => Navigator.of(context).maybePop())
|
|
||||||
.catchError((error, stackTrace) {
|
|
||||||
if (mounted) {
|
|
||||||
Navigator.of(context).maybePop();
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(CustomSnackBar(
|
|
||||||
context: context,
|
|
||||||
content: Text("error".i18n),
|
|
||||||
backgroundColor: AppColors.of(context).red,
|
|
||||||
));
|
|
||||||
setState(() => state = UpdateState.none);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import 'package:i18n_extension/i18n_extension.dart';
|
|
||||||
|
|
||||||
extension Localization on String {
|
|
||||||
static final _t = Translations.byLocale("hu_hu") +
|
|
||||||
{
|
|
||||||
"en_en": {
|
|
||||||
"new_update": "New Update",
|
|
||||||
"download": "download",
|
|
||||||
"downloading": "downloading",
|
|
||||||
"installing": "installing",
|
|
||||||
"error": "Failed to install update!",
|
|
||||||
"no": "No",
|
|
||||||
"yes": "Yes",
|
|
||||||
"mobileAlertTitle": "Hold up!",
|
|
||||||
"mobileAlertDesc": "You're on mobile network trying to download a %s update. Are you sure you want to continue?"
|
|
||||||
},
|
|
||||||
"hu_hu": {
|
|
||||||
"new_update": "Új frissítés",
|
|
||||||
"download": "Letöltés",
|
|
||||||
"downloading": "Letöltés",
|
|
||||||
"installing": "Telepítés",
|
|
||||||
"error": "Nem sikerült telepíteni a frissítést!",
|
|
||||||
"no": "Nem",
|
|
||||||
"yes": "Igen",
|
|
||||||
"mobileAlertTitle": "Figyelem!",
|
|
||||||
"mobileAlertDesc": "Jelenleg mobil interneten vagy, és egy %s méretű frissítést próbálsz letölteni. Biztosan folytatod?"
|
|
||||||
},
|
|
||||||
"de_de": {
|
|
||||||
"new_update": "Neues Update",
|
|
||||||
"download": "herunterladen",
|
|
||||||
"downloading": "Herunterladen",
|
|
||||||
"installing": "Installation",
|
|
||||||
"error": "Update konnte nicht installiert werden!",
|
|
||||||
"no": "Nein",
|
|
||||||
"yes": "Ja",
|
|
||||||
"mobileAlertTitle": "Achtung!",
|
|
||||||
"mobileAlertDesc":
|
|
||||||
"Sie befinden sich gerade im mobilen Internet und versuchen, ein %s Update herunterzuladen. Sind Sie sicher, dass Sie weitermachen wollen?"
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
String get i18n => localize(this, _t);
|
|
||||||
String fill(List<Object> params) => localizeFill(this, params);
|
|
||||||
String plural(int value) => localizePlural(value, this, _t);
|
|
||||||
String version(Object modifier) => localizeVersion(modifier, this, _t);
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,6 @@ import 'dart:math';
|
|||||||
import 'package:animations/animations.dart';
|
import 'package:animations/animations.dart';
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
import 'package:refilc/api/providers/update_provider.dart';
|
|
||||||
import 'package:refilc/models/settings.dart';
|
import 'package:refilc/models/settings.dart';
|
||||||
import 'package:refilc/theme/colors/utils.dart';
|
import 'package:refilc/theme/colors/utils.dart';
|
||||||
import 'package:refilc/ui/date_widget.dart';
|
import 'package:refilc/ui/date_widget.dart';
|
||||||
@@ -59,7 +58,6 @@ class AbsencesPageState extends State<AbsencesPage>
|
|||||||
late AbsenceProvider absenceProvider;
|
late AbsenceProvider absenceProvider;
|
||||||
late TimetableProvider timetableProvider;
|
late TimetableProvider timetableProvider;
|
||||||
late NoteProvider noteProvider;
|
late NoteProvider noteProvider;
|
||||||
late UpdateProvider updateProvider;
|
|
||||||
late String firstName;
|
late String firstName;
|
||||||
late TabController _tabController;
|
late TabController _tabController;
|
||||||
late List<SubjectAbsence> absences = [];
|
late List<SubjectAbsence> absences = [];
|
||||||
@@ -136,7 +134,6 @@ class AbsencesPageState extends State<AbsencesPage>
|
|||||||
user = Provider.of<UserProvider>(context);
|
user = Provider.of<UserProvider>(context);
|
||||||
absenceProvider = Provider.of<AbsenceProvider>(context);
|
absenceProvider = Provider.of<AbsenceProvider>(context);
|
||||||
noteProvider = Provider.of<NoteProvider>(context);
|
noteProvider = Provider.of<NoteProvider>(context);
|
||||||
updateProvider = Provider.of<UpdateProvider>(context);
|
|
||||||
timetableProvider = Provider.of<TimetableProvider>(context);
|
timetableProvider = Provider.of<TimetableProvider>(context);
|
||||||
|
|
||||||
List<String> nameParts = user.displayName?.split(" ") ?? ["?"];
|
List<String> nameParts = user.displayName?.split(" ") ?? ["?"];
|
||||||
@@ -168,7 +165,7 @@ class AbsencesPageState extends State<AbsencesPage>
|
|||||||
backgroundColor: Theme.of(context)
|
backgroundColor: Theme.of(context)
|
||||||
.colorScheme
|
.colorScheme
|
||||||
.tertiary, //ColorUtils.stringToColor(user.displayName ?? "?"),
|
.tertiary, //ColorUtils.stringToColor(user.displayName ?? "?"),
|
||||||
badge: updateProvider.available,
|
badge: false,
|
||||||
role: user.role,
|
role: user.role,
|
||||||
profilePictureString: user.picture,
|
profilePictureString: user.picture,
|
||||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import 'package:collection/collection.dart';
|
|||||||
import 'package:file_picker/file_picker.dart';
|
import 'package:file_picker/file_picker.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
import 'package:refilc/api/providers/update_provider.dart';
|
|
||||||
import 'package:refilc/models/settings.dart';
|
import 'package:refilc/models/settings.dart';
|
||||||
import 'package:refilc/ui/widgets/grade/grade_tile.dart';
|
import 'package:refilc/ui/widgets/grade/grade_tile.dart';
|
||||||
import 'package:refilc_kreta_api/models/exam.dart';
|
import 'package:refilc_kreta_api/models/exam.dart';
|
||||||
@@ -79,7 +78,6 @@ class GradesPageState extends State<GradesPage> {
|
|||||||
|
|
||||||
late UserProvider user;
|
late UserProvider user;
|
||||||
late GradeProvider gradeProvider;
|
late GradeProvider gradeProvider;
|
||||||
late UpdateProvider updateProvider;
|
|
||||||
late GradeCalculatorProvider calculatorProvider;
|
late GradeCalculatorProvider calculatorProvider;
|
||||||
late HomeworkProvider homeworkProvider;
|
late HomeworkProvider homeworkProvider;
|
||||||
late ExamProvider examProvider;
|
late ExamProvider examProvider;
|
||||||
@@ -450,7 +448,6 @@ class GradesPageState extends State<GradesPage> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
user = Provider.of<UserProvider>(context);
|
user = Provider.of<UserProvider>(context);
|
||||||
gradeProvider = Provider.of<GradeProvider>(context);
|
gradeProvider = Provider.of<GradeProvider>(context);
|
||||||
updateProvider = Provider.of<UpdateProvider>(context);
|
|
||||||
calculatorProvider = Provider.of<GradeCalculatorProvider>(context);
|
calculatorProvider = Provider.of<GradeCalculatorProvider>(context);
|
||||||
homeworkProvider = Provider.of<HomeworkProvider>(context);
|
homeworkProvider = Provider.of<HomeworkProvider>(context);
|
||||||
examProvider = Provider.of<ExamProvider>(context);
|
examProvider = Provider.of<ExamProvider>(context);
|
||||||
@@ -587,7 +584,7 @@ class GradesPageState extends State<GradesPage> {
|
|||||||
backgroundColor: Theme.of(context)
|
backgroundColor: Theme.of(context)
|
||||||
.colorScheme
|
.colorScheme
|
||||||
.tertiary, //ColorUtils.stringToColor(user.displayName ?? "?"),
|
.tertiary, //ColorUtils.stringToColor(user.displayName ?? "?"),
|
||||||
badge: updateProvider.available,
|
badge: false,
|
||||||
role: user.role,
|
role: user.role,
|
||||||
profilePictureString: user.picture,
|
profilePictureString: user.picture,
|
||||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import 'package:intl/intl.dart';
|
|||||||
import 'package:refilc_mobile_ui/pages/messages/messages_page.dart';
|
import 'package:refilc_mobile_ui/pages/messages/messages_page.dart';
|
||||||
import 'package:refilc_plus/providers/plus_provider.dart';
|
import 'package:refilc_plus/providers/plus_provider.dart';
|
||||||
import 'package:animated_list_plus/animated_list_plus.dart';
|
import 'package:animated_list_plus/animated_list_plus.dart';
|
||||||
import 'package:refilc/api/providers/update_provider.dart';
|
|
||||||
import 'package:refilc/api/providers/sync.dart';
|
import 'package:refilc/api/providers/sync.dart';
|
||||||
import 'package:confetti/confetti.dart';
|
import 'package:confetti/confetti.dart';
|
||||||
import 'package:refilc/models/settings.dart';
|
import 'package:refilc/models/settings.dart';
|
||||||
@@ -51,7 +50,6 @@ class HomePageState extends State<HomePage> with TickerProviderStateMixin {
|
|||||||
late TabController _tabController;
|
late TabController _tabController;
|
||||||
late UserProvider user;
|
late UserProvider user;
|
||||||
late SettingsProvider settings;
|
late SettingsProvider settings;
|
||||||
late UpdateProvider updateProvider;
|
|
||||||
late StatusProvider statusProvider;
|
late StatusProvider statusProvider;
|
||||||
late GradeProvider gradeProvider;
|
late GradeProvider gradeProvider;
|
||||||
late TimetableProvider timetableProvider;
|
late TimetableProvider timetableProvider;
|
||||||
@@ -174,7 +172,6 @@ class HomePageState extends State<HomePage> with TickerProviderStateMixin {
|
|||||||
user = Provider.of<UserProvider>(context);
|
user = Provider.of<UserProvider>(context);
|
||||||
settings = Provider.of<SettingsProvider>(context);
|
settings = Provider.of<SettingsProvider>(context);
|
||||||
statusProvider = Provider.of<StatusProvider>(context, listen: false);
|
statusProvider = Provider.of<StatusProvider>(context, listen: false);
|
||||||
updateProvider = Provider.of<UpdateProvider>(context);
|
|
||||||
_liveCard = Provider.of<LiveCardProvider>(context);
|
_liveCard = Provider.of<LiveCardProvider>(context);
|
||||||
gradeProvider = Provider.of<GradeProvider>(context);
|
gradeProvider = Provider.of<GradeProvider>(context);
|
||||||
context.watch<PlusProvider>();
|
context.watch<PlusProvider>();
|
||||||
@@ -335,7 +332,7 @@ class HomePageState extends State<HomePage> with TickerProviderStateMixin {
|
|||||||
.tertiary, //!settings.presentationMode
|
.tertiary, //!settings.presentationMode
|
||||||
//? ColorUtils.stringToColor(user.displayName ?? "?")
|
//? ColorUtils.stringToColor(user.displayName ?? "?")
|
||||||
//: Theme.of(context).colorScheme.secondary,
|
//: Theme.of(context).colorScheme.secondary,
|
||||||
badge: updateProvider.available,
|
badge: false,
|
||||||
role: user.role,
|
role: user.role,
|
||||||
profilePictureString: user.picture,
|
profilePictureString: user.picture,
|
||||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
import 'package:refilc/api/providers/update_provider.dart';
|
|
||||||
import 'package:refilc/models/settings.dart';
|
import 'package:refilc/models/settings.dart';
|
||||||
import 'package:refilc/ui/date_widget.dart';
|
import 'package:refilc/ui/date_widget.dart';
|
||||||
import 'package:refilc_kreta_api/providers/message_provider.dart';
|
import 'package:refilc_kreta_api/providers/message_provider.dart';
|
||||||
@@ -35,7 +34,6 @@ class MessagesPageState extends State<MessagesPage>
|
|||||||
|
|
||||||
late UserProvider user;
|
late UserProvider user;
|
||||||
late MessageProvider messageProvider;
|
late MessageProvider messageProvider;
|
||||||
late UpdateProvider updateProvider;
|
|
||||||
late String firstName;
|
late String firstName;
|
||||||
late TabController tabController;
|
late TabController tabController;
|
||||||
|
|
||||||
@@ -50,7 +48,6 @@ class MessagesPageState extends State<MessagesPage>
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
user = Provider.of<UserProvider>(context);
|
user = Provider.of<UserProvider>(context);
|
||||||
messageProvider = Provider.of<MessageProvider>(context);
|
messageProvider = Provider.of<MessageProvider>(context);
|
||||||
updateProvider = Provider.of<UpdateProvider>(context);
|
|
||||||
|
|
||||||
List<String> nameParts = user.displayName?.split(" ") ?? ["?"];
|
List<String> nameParts = user.displayName?.split(" ") ?? ["?"];
|
||||||
firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0];
|
firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0];
|
||||||
@@ -108,7 +105,7 @@ class MessagesPageState extends State<MessagesPage>
|
|||||||
backgroundColor: Theme.of(context)
|
backgroundColor: Theme.of(context)
|
||||||
.colorScheme
|
.colorScheme
|
||||||
.tertiary, //ColorUtils.stringToColor(user.displayName ?? "?"),
|
.tertiary, //ColorUtils.stringToColor(user.displayName ?? "?"),
|
||||||
badge: updateProvider.available,
|
badge: false,
|
||||||
role: user.role,
|
role: user.role,
|
||||||
profilePictureString: user.picture,
|
profilePictureString: user.picture,
|
||||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
|||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
import 'package:refilc/api/providers/database_provider.dart';
|
import 'package:refilc/api/providers/database_provider.dart';
|
||||||
import 'package:refilc/api/providers/self_note_provider.dart';
|
import 'package:refilc/api/providers/self_note_provider.dart';
|
||||||
import 'package:refilc/api/providers/update_provider.dart';
|
|
||||||
import 'package:refilc/models/self_note.dart';
|
import 'package:refilc/models/self_note.dart';
|
||||||
import 'package:refilc/models/settings.dart';
|
import 'package:refilc/models/settings.dart';
|
||||||
import 'package:refilc/utils/format.dart';
|
import 'package:refilc/utils/format.dart';
|
||||||
@@ -76,7 +75,6 @@ class NotesPage extends StatefulWidget {
|
|||||||
|
|
||||||
class NotesPageState extends State<NotesPage> with TickerProviderStateMixin {
|
class NotesPageState extends State<NotesPage> with TickerProviderStateMixin {
|
||||||
late UserProvider user;
|
late UserProvider user;
|
||||||
late UpdateProvider updateProvider;
|
|
||||||
late DatabaseProvider databaseProvider;
|
late DatabaseProvider databaseProvider;
|
||||||
late SelfNoteProvider selfNoteProvider;
|
late SelfNoteProvider selfNoteProvider;
|
||||||
|
|
||||||
@@ -112,7 +110,6 @@ Future<void> deleteTodoItem(TodoItem item) async {
|
|||||||
|
|
||||||
user = Provider.of<UserProvider>(context, listen: false);
|
user = Provider.of<UserProvider>(context, listen: false);
|
||||||
databaseProvider = Provider.of<DatabaseProvider>(context, listen: false);
|
databaseProvider = Provider.of<DatabaseProvider>(context, listen: false);
|
||||||
updateProvider = Provider.of<UpdateProvider>(context, listen: false);
|
|
||||||
selfNoteProvider = Provider.of<SelfNoteProvider>(context, listen: false);
|
selfNoteProvider = Provider.of<SelfNoteProvider>(context, listen: false);
|
||||||
|
|
||||||
doneItems = await databaseProvider.userQuery.toDoItems(userId: user.id!);
|
doneItems = await databaseProvider.userQuery.toDoItems(userId: user.id!);
|
||||||
@@ -287,7 +284,6 @@ if (selfNoteProvider.todos.isNotEmpty) {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
user = Provider.of<UserProvider>(context);
|
user = Provider.of<UserProvider>(context);
|
||||||
databaseProvider = Provider.of<DatabaseProvider>(context);
|
databaseProvider = Provider.of<DatabaseProvider>(context);
|
||||||
updateProvider = Provider.of<UpdateProvider>(context);
|
|
||||||
selfNoteProvider = Provider.of<SelfNoteProvider>(context);
|
selfNoteProvider = Provider.of<SelfNoteProvider>(context);
|
||||||
|
|
||||||
List<String> nameParts = user.displayName?.split(" ") ?? ["?"];
|
List<String> nameParts = user.displayName?.split(" ") ?? ["?"];
|
||||||
@@ -357,7 +353,7 @@ if (selfNoteProvider.todos.isNotEmpty) {
|
|||||||
name: firstName,
|
name: firstName,
|
||||||
backgroundColor: Theme.of(context).colorScheme.tertiary,
|
backgroundColor: Theme.of(context).colorScheme.tertiary,
|
||||||
//ColorUtils.stringToColor(user.displayName ?? "?"),
|
//ColorUtils.stringToColor(user.displayName ?? "?"),
|
||||||
badge: updateProvider.available,
|
badge: false,
|
||||||
role: user.role,
|
role: user.role,
|
||||||
profilePictureString: user.picture,
|
profilePictureString: user.picture,
|
||||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import 'package:animations/animations.dart';
|
|||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
import 'package:i18n_extension/i18n_extension.dart';
|
import 'package:i18n_extension/i18n_extension.dart';
|
||||||
import 'package:refilc/api/providers/database_provider.dart';
|
import 'package:refilc/api/providers/database_provider.dart';
|
||||||
import 'package:refilc/api/providers/update_provider.dart';
|
|
||||||
import 'package:refilc/models/settings.dart';
|
import 'package:refilc/models/settings.dart';
|
||||||
import 'package:refilc/utils/format.dart';
|
import 'package:refilc/utils/format.dart';
|
||||||
import 'package:refilc_kreta_api/client/client.dart';
|
import 'package:refilc_kreta_api/client/client.dart';
|
||||||
@@ -77,7 +76,6 @@ class TimetablePageState extends State<TimetablePage>
|
|||||||
|
|
||||||
late UserProvider user;
|
late UserProvider user;
|
||||||
late TimetableProvider timetableProvider;
|
late TimetableProvider timetableProvider;
|
||||||
late UpdateProvider updateProvider;
|
|
||||||
late SettingsProvider settingsProvider;
|
late SettingsProvider settingsProvider;
|
||||||
late DatabaseProvider db;
|
late DatabaseProvider db;
|
||||||
|
|
||||||
@@ -209,7 +207,6 @@ class TimetablePageState extends State<TimetablePage>
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
user = Provider.of<UserProvider>(context);
|
user = Provider.of<UserProvider>(context);
|
||||||
timetableProvider = Provider.of<TimetableProvider>(context);
|
timetableProvider = Provider.of<TimetableProvider>(context);
|
||||||
updateProvider = Provider.of<UpdateProvider>(context);
|
|
||||||
settingsProvider = Provider.of<SettingsProvider>(context);
|
settingsProvider = Provider.of<SettingsProvider>(context);
|
||||||
|
|
||||||
getCustom();
|
getCustom();
|
||||||
@@ -315,7 +312,7 @@ class TimetablePageState extends State<TimetablePage>
|
|||||||
backgroundColor: Theme.of(context)
|
backgroundColor: Theme.of(context)
|
||||||
.colorScheme
|
.colorScheme
|
||||||
.tertiary, //ColorUtils.stringToColor(user.displayName ?? "?"),
|
.tertiary, //ColorUtils.stringToColor(user.displayName ?? "?"),
|
||||||
badge: updateProvider.available,
|
badge: false,
|
||||||
role: user.role,
|
role: user.role,
|
||||||
profilePictureString: user.picture,
|
profilePictureString: user.picture,
|
||||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
// ignore_for_file: deprecated_member_use
|
// ignore_for_file: deprecated_member_use
|
||||||
|
|
||||||
import 'package:flutter_svg/svg.dart';
|
import 'package:flutter_svg/svg.dart';
|
||||||
import 'package:refilc/api/providers/update_provider.dart';
|
|
||||||
import 'package:refilc/helpers/quick_actions.dart';
|
import 'package:refilc/helpers/quick_actions.dart';
|
||||||
import 'package:refilc/models/settings.dart';
|
import 'package:refilc/models/settings.dart';
|
||||||
import 'package:refilc/theme/observer.dart';
|
import 'package:refilc/theme/observer.dart';
|
||||||
@@ -54,7 +53,6 @@ class NavigationScreenState extends State<NavigationScreen>
|
|||||||
late SettingsProvider settings;
|
late SettingsProvider settings;
|
||||||
late NewsProvider newsProvider;
|
late NewsProvider newsProvider;
|
||||||
late GoalProvider goalProvider;
|
late GoalProvider goalProvider;
|
||||||
late UpdateProvider updateProvider;
|
|
||||||
late GradeProvider gradeProvicer;
|
late GradeProvider gradeProvicer;
|
||||||
late AdProvider adProvider;
|
late AdProvider adProvider;
|
||||||
|
|
||||||
@@ -181,10 +179,6 @@ class NavigationScreenState extends State<NavigationScreen>
|
|||||||
goalProvider = Provider.of<GoalProvider>(context, listen: false);
|
goalProvider = Provider.of<GoalProvider>(context, listen: false);
|
||||||
goalProvider.fetchDone(gradeProvider: gradeProvicer);
|
goalProvider.fetchDone(gradeProvider: gradeProvicer);
|
||||||
|
|
||||||
// get releases
|
|
||||||
updateProvider = Provider.of<UpdateProvider>(context, listen: false);
|
|
||||||
updateProvider.fetch();
|
|
||||||
|
|
||||||
// get advertisements
|
// get advertisements
|
||||||
adProvider = Provider.of<AdProvider>(context, listen: false);
|
adProvider = Provider.of<AdProvider>(context, listen: false);
|
||||||
adProvider.fetch();
|
adProvider.fetch();
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import 'dart:convert';
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:refilc/api/providers/live_card_provider.dart';
|
import 'package:refilc/api/providers/live_card_provider.dart';
|
||||||
import 'package:refilc/api/providers/update_provider.dart';
|
|
||||||
import 'package:refilc_kreta_api/providers/absence_provider.dart';
|
import 'package:refilc_kreta_api/providers/absence_provider.dart';
|
||||||
import 'package:refilc_kreta_api/providers/event_provider.dart';
|
import 'package:refilc_kreta_api/providers/event_provider.dart';
|
||||||
import 'package:refilc_kreta_api/providers/exam_provider.dart';
|
import 'package:refilc_kreta_api/providers/exam_provider.dart';
|
||||||
@@ -52,7 +51,6 @@ import 'package:refilc_mobile_ui/common/splitted_panel/splitted_panel.dart';
|
|||||||
import 'package:refilc_mobile_ui/common/system_chrome.dart';
|
import 'package:refilc_mobile_ui/common/system_chrome.dart';
|
||||||
|
|
||||||
// import 'package:refilc_mobile_ui/common/system_chrome.dart';
|
// import 'package:refilc_mobile_ui/common/system_chrome.dart';
|
||||||
import 'package:refilc_mobile_ui/common/widgets/update/updates_view.dart';
|
|
||||||
import 'package:refilc_mobile_ui/screens/news/news_screen.dart';
|
import 'package:refilc_mobile_ui/screens/news/news_screen.dart';
|
||||||
|
|
||||||
// import 'package:refilc_mobile_ui/screens/notes/notes_screen.dart';
|
// import 'package:refilc_mobile_ui/screens/notes/notes_screen.dart';
|
||||||
@@ -105,7 +103,6 @@ class SettingsScreenState extends State<SettingsScreen>
|
|||||||
Future<Map>? futureRelease;
|
Future<Map>? futureRelease;
|
||||||
|
|
||||||
late UserProvider user;
|
late UserProvider user;
|
||||||
late UpdateProvider updateProvider;
|
|
||||||
late SettingsProvider settings;
|
late SettingsProvider settings;
|
||||||
late DatabaseProvider databaseProvider;
|
late DatabaseProvider databaseProvider;
|
||||||
late KretaClient kretaClient;
|
late KretaClient kretaClient;
|
||||||
@@ -270,10 +267,6 @@ class SettingsScreenState extends State<SettingsScreen>
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
Future.delayed(Duration.zero, () {
|
|
||||||
futureRelease = Provider.of<UpdateProvider>(context, listen: false)
|
|
||||||
.installedVersion();
|
|
||||||
});
|
|
||||||
_hideContainersController = AnimationController(
|
_hideContainersController = AnimationController(
|
||||||
vsync: this, duration: const Duration(milliseconds: 200));
|
vsync: this, duration: const Duration(milliseconds: 200));
|
||||||
}
|
}
|
||||||
@@ -293,7 +286,6 @@ class SettingsScreenState extends State<SettingsScreen>
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
user = Provider.of<UserProvider>(context);
|
user = Provider.of<UserProvider>(context);
|
||||||
settings = Provider.of<SettingsProvider>(context);
|
settings = Provider.of<SettingsProvider>(context);
|
||||||
updateProvider = Provider.of<UpdateProvider>(context);
|
|
||||||
databaseProvider = Provider.of<DatabaseProvider>(context);
|
databaseProvider = Provider.of<DatabaseProvider>(context);
|
||||||
kretaClient = Provider.of<KretaClient>(context);
|
kretaClient = Provider.of<KretaClient>(context);
|
||||||
|
|
||||||
@@ -393,7 +385,7 @@ class SettingsScreenState extends State<SettingsScreen>
|
|||||||
radius: 48.42069,
|
radius: 48.42069,
|
||||||
onTap: () => _showBottomSheet(user.getUser(user.id ?? "")),
|
onTap: () => _showBottomSheet(user.getUser(user.id ?? "")),
|
||||||
name: firstName,
|
name: firstName,
|
||||||
badge: updateProvider.available,
|
badge: false,
|
||||||
role: user.role,
|
role: user.role,
|
||||||
profilePictureString: user.picture,
|
profilePictureString: user.picture,
|
||||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||||
@@ -610,27 +602,6 @@ class SettingsScreenState extends State<SettingsScreen>
|
|||||||
// ),
|
// ),
|
||||||
// ),
|
// ),
|
||||||
|
|
||||||
// updates
|
|
||||||
if (updateProvider.available)
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(
|
|
||||||
vertical: 12.0, horizontal: 24.0),
|
|
||||||
child: Panel(
|
|
||||||
child: PanelButton(
|
|
||||||
onPressed: () => _openUpdates(context),
|
|
||||||
title: Text("update_available".i18n),
|
|
||||||
leading: const Icon(FeatherIcons.download),
|
|
||||||
trailing: Text(
|
|
||||||
updateProvider.releases.first.tag,
|
|
||||||
style: TextStyle(
|
|
||||||
fontWeight: FontWeight.w500,
|
|
||||||
color: Theme.of(context).colorScheme.secondary,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
// const Padding(
|
// const Padding(
|
||||||
// padding: EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
|
// padding: EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
|
||||||
// child: PremiumBannerButton(),
|
// child: PremiumBannerButton(),
|
||||||
@@ -1174,9 +1145,6 @@ class SettingsScreenState extends State<SettingsScreen>
|
|||||||
Navigator.of(context, rootNavigator: true)
|
Navigator.of(context, rootNavigator: true)
|
||||||
.push(CupertinoPageRoute(builder: (context) => const NewsScreen()));
|
.push(CupertinoPageRoute(builder: (context) => const NewsScreen()));
|
||||||
|
|
||||||
void _openUpdates(BuildContext context) =>
|
|
||||||
UpdateView.show(updateProvider.releases.first, context: context);
|
|
||||||
|
|
||||||
void _openPrivacy(BuildContext context) => PrivacyView.show(context);
|
void _openPrivacy(BuildContext context) => PrivacyView.show(context);
|
||||||
|
|
||||||
// void _openNotes(BuildContext context, Map<String, bool> doneItems) async =>
|
// void _openNotes(BuildContext context, Map<String, bool> doneItems) async =>
|
||||||
|
|||||||
Reference in New Issue
Block a user