Skip to content
This repository has been archived by the owner on Jan 1, 2025. It is now read-only.

Commit

Permalink
feat: working on initial setup
Browse files Browse the repository at this point in the history
  • Loading branch information
RossComputerGuy committed Jun 1, 2024
1 parent 849800f commit d3b8329
Show file tree
Hide file tree
Showing 20 changed files with 613 additions and 43 deletions.
6 changes: 3 additions & 3 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 6 additions & 4 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,19 @@
expidus.lib.mkFlake {
overlay = final: prev: {
expidus = prev.expidus // {
genesis-shell = prev.expidus.genesis-shell.overrideAttrs (f: p: {
genesis-shell = prev.flutter.buildFlutterApplication {
version = "0-unstable-git+${self.shortRev or "dirty"}";
src = prev.lib.cleanSource self;

pubspecLock = prev.lib.importJSON ./pubspec.lock.json;

gitHashes = {
libtokyo = "sha256-Zn30UmppXnzhs+t+EQNwAhaTPjCCxoN0a+AbH6bietg=";
libtokyo_flutter = "sha256-Zn30UmppXnzhs+t+EQNwAhaTPjCCxoN0a+AbH6bietg=";
libtokyo = "sha256-ei3bgEdmmWz0iwMUBzBndYPlvNiCrDBrG33/n8PrBPI=";
libtokyo_flutter = "sha256-ei3bgEdmmWz0iwMUBzBndYPlvNiCrDBrG33/n8PrBPI=";
};
});

inherit (prev.expidus.genesis-shell) pname buildInputs postInstall meta;
};
};
};

Expand Down
22 changes: 14 additions & 8 deletions lib/logic/os/linux/power.dart
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,20 @@ class LinuxPowerDevice extends PowerDevice {

@override
PowerDeviceType get type {
switch (_device.type) {
case UPowerDeviceType.linePower:
if (_device.powerSupply) return PowerDeviceType.line;
break;
case UPowerDeviceType.battery: return PowerDeviceType.battery;
case UPowerDeviceType.mouse: return PowerDeviceType.mouse;
case UPowerDeviceType.keyboard: return PowerDeviceType.keyboard;
default: break;
try {
switch (_device.type) {
case UPowerDeviceType.linePower:
if (_device.powerSupply) return PowerDeviceType.line;
break;
case UPowerDeviceType.battery: return PowerDeviceType.battery;
case UPowerDeviceType.mouse: return PowerDeviceType.mouse;
case UPowerDeviceType.keyboard: return PowerDeviceType.keyboard;
default: break;
}
} on RangeError catch (e) {
switch (e.invalidValue as int ?? 0) {
case 17: return PowerDeviceType.headphones;
}
}
return PowerDeviceType.unknown;
}
Expand Down
1 change: 1 addition & 0 deletions lib/logic/power.dart
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ enum PowerDeviceType {
line,
mouse,
keyboard,
headphones,
unknown,
}

Expand Down
49 changes: 49 additions & 0 deletions lib/logic/system.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import 'package:provider/provider.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';

class SystemManager extends ChangeNotifier {
static const channel = MethodChannel('com.expidusos.genesis.shell/system');

SystemManager() {
_sync();
}

SystemMetadata? _metadata = null;
SystemMetadata? get metadata => _metadata;

void _sync() {
channel.invokeMethod('getMetadata').then((data) {
_metadata = SystemMetadata(
logo: data['logo'],
osName: data['osName'],
osId: data['osId'],
versionId: data['versionId'],
versionCodename: data['versionCodename'],
prettyName: data['prettyName'],
);

notifyListeners();
}).catchError((err) {
print(err);
});
}
}

class SystemMetadata {
const SystemMetadata({
this.logo,
this.osName,
this.osId,
this.versionId,
this.versionCodename,
this.prettyName,
});

final String? logo;
final String? osName;
final String? osId;
final String? versionId;
final String? versionCodename;
final String? prettyName;
}
40 changes: 39 additions & 1 deletion lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:io' show exit;
import 'package:args/args.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:flutter/scheduler.dart';
import 'package:libtokyo_flutter/libtokyo.dart' hide ColorScheme;
import 'package:libtokyo/libtokyo.dart' hide TokyoApp;
import 'package:provider/provider.dart';
Expand All @@ -13,15 +14,19 @@ import 'logic/outputs.dart';
import 'logic/power.dart';
import 'logic/route_args.dart';
import 'logic/sensors.dart';
import 'logic/system.dart';

import 'views/desktop.dart';
import 'views/lock.dart';
import 'views/login.dart';
import 'views/system/setup.dart';

void main(List<String> argsList) async {
final argsParser = ArgParser()
..addFlag('init-locked', help: 'Adding this option will start Genesis Shell in a locked state')
..addFlag('display-manager', help: 'Start as a display manager')
..addFlag('init-setup', help: 'Starts the shell in the "initial setup" mode.')
..addFlag('disable-init-setup-check', help: 'Disables the initial setup check.')
..addFlag('help', abbr: 'h', negatable: false);

final args = argsParser.parse(argsList);
Expand All @@ -36,10 +41,22 @@ void main(List<String> argsList) async {
exit(1);
}

if (args.flag('init-locked') && args.flag('init-setup')) {
print('Cannot run the initial setup and start locked');
exit(1);
}

if (args.flag('disable-init-setup-check') && args.flag('init-setup')) {
print('Cannot run the initial setup and disable the init setup check');
exit(1);
}

WidgetsFlutterBinding.ensureInitialized();

runApp(GenesisShellApp(
initLocked: args.flag('init-locked'),
initSetup: args.flag('init-setup'),
disableInitSetupCheck: args.flag('disable-init-setup-check'),
displayManager: args.flag('display-manager'),
));

Expand All @@ -55,24 +72,30 @@ class GenesisShellApp extends StatefulWidget {
const GenesisShellApp({
super.key,
this.initLocked = false,
this.initSetup = false,
this.disableInitSetupCheck = false,
this.displayManager = false,
});

final bool initLocked;
final bool initSetup;
final bool disableInitSetupCheck;
final bool displayManager;

@override
State<GenesisShellApp> createState() => _GenesisShellAppState();
}

class _GenesisShellAppState extends State<GenesisShellApp> {
GlobalKey<NavigatorState> _navKey = GlobalKey<NavigatorState>();
late AccountManager _accountManager;
late ApplicationsManager _applicationsManager;
late DisplayManager _displayManager;
late NetworkManager _networkManager;
late OutputManager _outputManager;
late PowerManager _powerManager;
late SensorsManager _sensorsManager;
late SystemManager _systemManager;

@override
void initState() {
Expand All @@ -92,6 +115,18 @@ class _GenesisShellAppState extends State<GenesisShellApp> {

_sensorsManager = SensorsManager.auto();
_sensorsManager.connect();

_systemManager = SystemManager();

if (!widget.disableInitSetupCheck) {
WidgetsBinding.instance.addPostFrameCallback((_) {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (_accountManager.account.isEmpty) {
_navKey.currentState!.pushReplacementNamed('/system/setup');
}
});
});
}
}

@override
Expand All @@ -114,8 +149,10 @@ class _GenesisShellAppState extends State<GenesisShellApp> {
ChangeNotifierProvider(create: (_) => _outputManager),
Provider(create: (_) => _powerManager),
Provider(create: (_) => _sensorsManager),
ChangeNotifierProvider(create: (_) => _systemManager),
],
child: TokyoApp(
navigatorKey: _navKey,
title: 'Genesis Shell',
themeMode: ThemeMode.dark,
routes: {
Expand All @@ -128,8 +165,9 @@ class _GenesisShellAppState extends State<GenesisShellApp> {
},
'/lock': (context) => LockView(userName: AuthedRouteArguments.of(context).userName),
'/login': (_) => const LoginView(),
'/system/setup': (_) => const SystemSetupView(),
},
initialRoute: widget.initLocked ? '/lock' : (widget.displayManager ? '/login' : '/'),
initialRoute: widget.initLocked ? '/lock' : (widget.displayManager ? '/login' : (widget.initSetup ? '/system/setup' : '/')),
),
);
}
Loading

0 comments on commit d3b8329

Please sign in to comment.