Skip to content

Commit

Permalink
Merge pull request #26 from LuanRoger/manage_section
Browse files Browse the repository at this point in the history
Manage section
  • Loading branch information
LuanRoger committed Oct 24, 2022
2 parents 45835dc + 5b20ac6 commit d11feea
Show file tree
Hide file tree
Showing 62 changed files with 2,834 additions and 1,723 deletions.
13 changes: 13 additions & 0 deletions internals/sys_info_getter/.gitignore
@@ -0,0 +1,13 @@
# Files and directories created by pub.
.dart_tool/
.packages

# Conventional directory for build outputs.
build/

# Omit committing pubspec.lock for library packages; see
# https://dart.dev/guides/libraries/private-files#pubspeclock.
pubspec.lock

#Editors
.vscode/
3 changes: 3 additions & 0 deletions internals/sys_info_getter/CHANGELOG.md
@@ -0,0 +1,3 @@
## 1.0.0

- Initial version.
30 changes: 30 additions & 0 deletions internals/sys_info_getter/analysis_options.yaml
@@ -0,0 +1,30 @@
# This file configures the static analysis results for your project (errors,
# warnings, and lints).
#
# This enables the 'recommended' set of lints from `package:lints`.
# This set helps identify many issues that may lead to problems when running
# or consuming Dart code, and enforces writing Dart using a single, idiomatic
# style and format.
#
# If you want a smaller set of lints you can change this to specify
# 'package:lints/core.yaml'. These are just the most critical lints
# (the recommended set includes the core lints).
# The core lints are also what is used by pub.dev for scoring packages.

include: package:lints/recommended.yaml

# Uncomment the following section to specify additional rules.

# linter:
# rules:
# - camel_case_types

# analyzer:
# exclude:
# - path/to/excluded/files/**

# For more information about the core and recommended set of lints, see
# https://dart.dev/go/core-lints

# For additional information about configuring this file, see
# https://dart.dev/guides/language/analysis-options
6 changes: 6 additions & 0 deletions internals/sys_info_getter/example/main.dart
@@ -0,0 +1,6 @@
import 'package:sys_info_getter/sys_info_getter.dart';

void main() async {
TerminalHelper terminalHelper = TerminalHelper(PowershellProvider());
SystemInformations informations = await terminalHelper.update();
}
4 changes: 4 additions & 0 deletions internals/sys_info_getter/lib/src/cmd_consts.dart
@@ -0,0 +1,4 @@
class CmdConts {
static const String GET_VOLUME =
"Get-Volume | select DriveLetter, OperationalStatus, Size, SizeRemaining | fl";
}
37 changes: 37 additions & 0 deletions internals/sys_info_getter/lib/src/controllers/terminal_helper.dart
@@ -0,0 +1,37 @@
import 'package:sys_info_getter/src/cmd_consts.dart';
import 'package:sys_info_getter/src/models/disk_info.dart';
import 'package:sys_info_getter/src/models/system_informations.dart';
import 'package:sys_info_getter/src/services/models/providers/terminal_provider.dart';
import 'package:sys_info_getter/src/services/models/terminal_interface.dart';
import 'package:sys_info_getter/src/utils/info_formater.dart';

class TerminalHelper {
late final TerminalInterface _provider;

TerminalHelper(TerminalProvider terminalProvider) {
_provider = terminalProvider.interface;
}

Future<SystemInformations> update() async {
List<DiskInfo>? diskInfo = await _getDiskInfo();

return SystemInformations(diskInfo: diskInfo);
}

Future<List<DiskInfo>?> _getDiskInfo() async {
List<DiskInfo> diskInfos = List.empty(growable: true);

String output = await _provider.executeCommand(CmdConts.GET_VOLUME);
if (output.isEmpty) return null;

List<Map<String, String>> formatedInfos =
InfoFormater.formatStringToInfoMap(output);

for (Map<String, String> info in formatedInfos) {
if (info["DriveLetter"]!.isEmpty) continue;
diskInfos.add(DiskInfo.fromMap(info));
}

return diskInfos;
}
}
3 changes: 3 additions & 0 deletions internals/sys_info_getter/lib/src/enums/get_error.dart
@@ -0,0 +1,3 @@
enum GetError {
GET_DISK_INFO_ERROR
}
18 changes: 18 additions & 0 deletions internals/sys_info_getter/lib/src/models/disk_info.dart
@@ -0,0 +1,18 @@
class DiskInfo {
final String driveLetter;
final String operationalStatus;
final double size;
final double sizeRemaining;

DiskInfo(
{required this.driveLetter,
required this.operationalStatus,
required this.size,
required this.sizeRemaining});

factory DiskInfo.fromMap(Map<String, String> map) => DiskInfo(
driveLetter: map["DriveLetter"]!,
operationalStatus: map["OperationalStatus"]!,
size: double.parse(map["Size"]!),
sizeRemaining: double.parse(map["SizeRemaining"]!));
}
16 changes: 16 additions & 0 deletions internals/sys_info_getter/lib/src/models/system_informations.dart
@@ -0,0 +1,16 @@
import 'package:sys_info_getter/src/enums/get_error.dart';
import 'package:sys_info_getter/src/models/disk_info.dart';

class SystemInformations {
final List<DiskInfo>? diskInfo;

late List<GetError> _errors;
List<GetError> get errors => List.from(_errors);

SystemInformations({this.diskInfo}) {
_errors = List.empty(growable: true);
if (diskInfo == null) {
_errors.add(GetError.GET_DISK_INFO_ERROR);
}
}
}
@@ -0,0 +1,8 @@
import 'package:sys_info_getter/src/services/models/providers/terminal_provider.dart';
import 'package:sys_info_getter/src/services/models/terminal_interface.dart';
import 'package:sys_info_getter/src/services/powershell_service.dart';

class PowershellProvider implements TerminalProvider {
@override
TerminalInterface get interface => PowershellService();
}
@@ -0,0 +1,7 @@
import 'package:sys_info_getter/src/services/models/terminal_interface.dart';

abstract class TerminalProvider {
final TerminalInterface interface;

TerminalProvider(this.interface);
}
@@ -0,0 +1,3 @@
abstract class TerminalInterface {
Future<String> executeCommand(String command);
}
12 changes: 12 additions & 0 deletions internals/sys_info_getter/lib/src/services/powershell_service.dart
@@ -0,0 +1,12 @@
import 'dart:io';

import 'package:sys_info_getter/src/services/models/terminal_interface.dart';

class PowershellService implements TerminalInterface {
@override
Future<String> executeCommand(String command) async {
final powershell =
await Process.run("Powershell.exe", [command], runInShell: true);
return powershell.exitCode == 0 ? powershell.stdout : "";
}
}
24 changes: 24 additions & 0 deletions internals/sys_info_getter/lib/src/utils/info_formater.dart
@@ -0,0 +1,24 @@
class InfoFormater {
static List<Map<String, String>> formatStringToInfoMap(String rawInfo,
{String separator = ":"}) {
List<Map<String, String>> infos = List.empty(growable: true);
List<String> diskInfos = rawInfo.trim().split("\n");

Map<String, String> buffer = {};
for (String lineInfo in diskInfos) {
if (lineInfo.trim().isEmpty) {
infos.add(Map.from(buffer));
buffer.clear();
continue;
}

List<String> keyValue = lineInfo.split(separator);
String key = keyValue[0].trim();
String value = keyValue[1].trim();
buffer[key] = value;
}
infos.add(buffer);

return infos;
}
}
11 changes: 11 additions & 0 deletions internals/sys_info_getter/lib/sys_info_getter.dart
@@ -0,0 +1,11 @@
library sys_info_getter;

export 'src/controllers/terminal_helper.dart';

export 'src/enums/get_error.dart';

export 'src/models/disk_info.dart';
export 'src/models/system_informations.dart';

export 'src/services/models/providers/powershell_provider.dart';
export 'src/services/models/providers/terminal_provider.dart';
13 changes: 13 additions & 0 deletions internals/sys_info_getter/pubspec.yaml
@@ -0,0 +1,13 @@
name: sys_info_getter
description: A starting point for Dart libraries or applications.
version: 1.0.0

environment:
sdk: '>=2.18.1 <3.0.0'

# dependencies:
# path: ^1.8.0

dev_dependencies:
lints: ^2.0.0
test: ^1.16.0
11 changes: 11 additions & 0 deletions lib/controllers/system_info_getter.dart
@@ -0,0 +1,11 @@
import 'package:sys_info_getter/sys_info_getter.dart';

class SystemInfoGetter {
final TerminalHelper _terminalHelper = TerminalHelper(PowershellProvider());

Future<SystemInformations> _updateInfos() async =>
await _terminalHelper.update();

Future<List<DiskInfo>?> getDisksInfos() async =>
(await _updateInfos()).diskInfo;
}
5 changes: 4 additions & 1 deletion lib/models/app_models/game_model.dart
Expand Up @@ -16,6 +16,7 @@ class GameModel implements AppModel {
late String xcloudUrl;
late String tileGameImageUrl;
late String gameImageUrl;
late String storeUrl;

@override
GameModel fromJson(Map<String, dynamic> json) {
Expand All @@ -31,6 +32,7 @@ class GameModel implements AppModel {
gameModel.xcloudUrl = json['xcloudUrl'] as String;
gameModel.tileGameImageUrl = json['tileGameImageUrl'] as String;
gameModel.gameImageUrl = json['gameImageUrl'] as String;
gameModel.storeUrl = json["storeUrl"] as String;

return gameModel;
}
Expand All @@ -46,7 +48,8 @@ class GameModel implements AppModel {
"extraGameProperties": extraGameProperties.toJson(),
"xcloudUrl": xcloudUrl,
"tileGameImageUrl": tileGameImageUrl,
"gameImageUrl": gameImageUrl
"gameImageUrl": gameImageUrl,
"storeUrl": storeUrl
};
}

Expand Down
8 changes: 8 additions & 0 deletions lib/models/profile_model.dart
@@ -1,6 +1,7 @@
import 'package:xbox_launcher/models/apps_historic.dart';
import 'package:xbox_launcher/models/background_profile_preferences.dart';
import 'package:xbox_launcher/models/profile_apps_groups.dart';
import 'package:xbox_launcher/models/profile_preview_elements_preferences.dart';
import 'package:xbox_launcher/models/theme_data_profile.dart';
import 'package:xbox_launcher/models/video_preferences.dart';
import 'package:xbox_launcher/shared/app_consts.dart';
Expand All @@ -13,6 +14,7 @@ class ProfileModel {
String? xcloudGamesJsonPath;
String? profileImagePath;

late ProfilePreviewElementsPreferences previewElementsPreferences;
late AppsHistoric appsHistoric;
late ProfileAppsGroups appsGroups;
late BackgroundProfilePreferences backgroundPreferences;
Expand All @@ -27,6 +29,9 @@ class ProfileModel {
profileModel.preferedServer = json["preferedServer"];
profileModel.xcloudGamesJsonPath = json["xcloudGamesJsonPath"];
profileModel.profileImagePath = json["profileImagePath"];
profileModel.previewElementsPreferences =
ProfilePreviewElementsPreferences.fromJson(
json["previewElementsPreferences"]);
profileModel.appsHistoric = AppsHistoric.fromJson(json["appsHistoric"]);
profileModel.appsGroups = ProfileAppsGroups.fromJson(json["appsGroups"]);
profileModel.backgroundPreferences =
Expand All @@ -45,6 +50,8 @@ class ProfileModel {
defaultProfile.preferedServer =
XCloudSupportedServers.values[0].countryCode;

defaultProfile.previewElementsPreferences =
ProfilePreviewElementsPreferences();
defaultProfile.appsHistoric = AppsHistoric();
defaultProfile.appsGroups =
ProfileAppsGroups(groups: List.empty(growable: true));
Expand All @@ -62,6 +69,7 @@ class ProfileModel {
"preferedServer": preferedServer,
"xcloudGamesJsonPath": xcloudGamesJsonPath,
"profileImagePath": profileImagePath,
"previewElementsPreferences": previewElementsPreferences.toJson(),
"appsHistoric": appsHistoric.toJson(),
"appsGroups": appsGroups.toJson(),
"backgroundPreferences": backgroundPreferences.toJson(),
Expand Down
14 changes: 14 additions & 0 deletions lib/models/profile_preview_elements_preferences.dart
@@ -0,0 +1,14 @@
import 'package:xbox_launcher/shared/enums/tile_size.dart';

class ProfilePreviewElementsPreferences {
TileSize myLibraryTileSize;

ProfilePreviewElementsPreferences({this.myLibraryTileSize = TileSize.MEDIUM});
factory ProfilePreviewElementsPreferences.fromJson(
Map<String, dynamic> json) =>
ProfilePreviewElementsPreferences(
myLibraryTileSize: TileSize.values[json["myLibraryTileSize"]]);

Map<String, dynamic> toJson() =>
{"myLibraryTileSize": myLibraryTileSize.index};
}
3 changes: 1 addition & 2 deletions lib/pages/home_page.dart
@@ -1,11 +1,10 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:provider/provider.dart';
import 'package:xbox_launcher/models/controller_keyboard_pair.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_option.dart';
import 'package:xbox_launcher/providers/profile_provider.dart';
import 'package:xbox_launcher/routes/app_routes.dart';
import 'package:xbox_launcher/shared/widgets/background.dart';
import 'package:xbox_launcher/shared/widgets/clock_time.dart';
import 'package:xbox_launcher/shared/widgets/infos_provider/clock_time.dart';
import 'package:xbox_launcher/shared/widgets/models/xbox_page_stateless.dart';
import 'package:xbox_launcher/shared/widgets/placeholder_messages/wellcoming_message.dart';
import 'package:xbox_launcher/shared/widgets/buttons/system_banner_button.dart';
Expand Down
30 changes: 26 additions & 4 deletions lib/pages/my_library_page/my_library_page.dart
@@ -1,8 +1,9 @@
// ignore_for_file: curly_braces_in_flow_control_structures

import 'package:fluent_ui/fluent_ui.dart';
import 'package:fluent_ui/fluent_ui.dart' hide TextButton;
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:xbox_launcher/models/app_models/app_model.dart';
import 'package:xbox_launcher/models/app_models/game_model.dart';
import 'package:xbox_launcher/models/controller_keyboard_pair.dart';
Expand All @@ -13,10 +14,11 @@ import 'package:xbox_launcher/pages/my_library_page/sections/manage_section.dart
import 'package:xbox_launcher/pages/my_library_page/sections/my_apps_section.dart';
import 'package:xbox_launcher/pages/my_library_page/sections/my_games_section.dart';
import 'package:xbox_launcher/providers/focus_element_provider.dart';
import 'package:xbox_launcher/providers/profile_provider.dart';
import 'package:xbox_launcher/shared/widgets/buttons/text_button.dart';
import 'package:xbox_launcher/shared/widgets/dialogs/context_menu/context_menu.dart';
import 'package:xbox_launcher/shared/widgets/dialogs/context_menu/context_menu_add_group.dart';
import 'package:xbox_launcher/shared/widgets/dialogs/context_menu/context_menu_item.dart';
import 'package:xbox_launcher/shared/widgets/dialogs/system_dialog.dart';
import 'package:xbox_launcher/shared/widgets/models/xbox_page_stateful.dart';
import 'package:xbox_launcher/shared/widgets/navigations/navigation_bar.dart';
import 'package:xinput_gamepad/xinput_gamepad.dart';
Expand Down Expand Up @@ -60,8 +62,28 @@ class _MyGamesPageState extends XboxPageState<MyLibraryPage> {
.show(context);
}),
ContextMenuItem("See on Microsoft Store",
icon: FluentIcons.store_logo16,
onPressed: () => print("Microsoft Store")),
icon: FluentIcons.store_logo16, onPressed: () async {
Object? focusObject =
context.read<FocusElementProvider>().currentValue;
if (focusObject == null && focusObject is! AppModel) return;

GameModel gameModel = focusObject as GameModel;
await SystemDialog(
title: "Access a external site.",
content: "Do you want to go to a external site?",
actions: [
TextButton(
title: "Confirm",
onPressed: () async {
await launchUrl(Uri.parse(gameModel.storeUrl));
Navigator.pop(context);
}),
TextButton(
title: "Cancel",
onPressed: () => Navigator.pop(context))
],
).show(context);
}),
]).show(context))
];

Expand Down

0 comments on commit d11feea

Please sign in to comment.