aboutsummaryrefslogtreecommitdiff
path: root/lib/main.dart
blob: 8bff71f71fdd9ef309325a1e7bd3a8aacf5981f6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:device_apps/device_apps.dart';
import 'package:android_intent/android_intent.dart';
import 'package:flutter/services.dart';

import 'pages/Home.dart';
import 'pages/Apps.dart';

import 'components/AppContextMenu.dart';

import 'data/config.dart';
import 'data/favorites.dart';
import 'helpers/StreamState.dart';

void main() {
  runApp(MyApp());
}

class MyAppState extends StreamState<MyApp> {
  // State
  final config = StreamStateValue<Config>(
      stream$: getConfig$(),
      value: Config(),
  );
  final favoriteApps = StreamStateValue<List<Application>>(
      stream$: getFavorites$(),
      value: [],
  );
  final dateTime = StreamStateValue<DateTime>(
      stream$: Stream.periodic(Duration(seconds: 1), (_x) => DateTime.now()).asBroadcastStream(),
      value: DateTime.now(),
  );
  void initState() {
    super.initState();
    initStateValue(config);
    initConfig();
    initStateValue(favoriteApps);
    initFavorites();
    initStateValue(dateTime);
  }

  void openApp(Application app) {
    DeviceApps.openApp(app.packageName);
  }

  void openOptionsMenu(BuildContext ctx, Application app) {
    var isFavorite = -1 != favoriteApps.value.indexWhere((a) => a.packageName == app.packageName);

    showDialog(context: ctx, builder: (BuildContext ctx) => AppContextMenu(app: app, isFavorite: isFavorite));
  }

  ThemeData getLightTheme() {
    return ThemeData(brightness: Brightness.light);
  }

  ThemeData getDarkTheme() {
    Color fg = Color(0xFFD8DEE9);
    return ThemeData(
          backgroundColor: Color(0xFF1F2225),
          scaffoldBackgroundColor: Color(0xFF0F1215),
          accentColor: fg,
          primaryColor: Color(0xFF5E81AC),
          textTheme: TextTheme(
              headline1: TextStyle(color: fg),
              headline2: TextStyle(color: fg),
              headline3: TextStyle(color: fg),
              headline4: TextStyle(color: fg),
              headline5: TextStyle(color: fg),
              headline6: TextStyle(color: fg),
              subtitle1: TextStyle(color: fg),
              subtitle2: TextStyle(color: fg),
              bodyText1: TextStyle(color: fg),
              bodyText2: TextStyle(color: fg),
              button: TextStyle(color: fg),
              caption: TextStyle(color: fg),
              overline: TextStyle(color: fg),
          ),
      );
  }

  // This widget is the root of your application.
  @override
  Widget build(BuildContext ctx) {
    return MaterialApp(
      title: 'owyn launcher',
      theme: getLightTheme(),
      darkTheme: getDarkTheme(),
      themeMode: config.value.isDarkMode() ? ThemeMode.dark : ThemeMode.light,
      home: Scaffold(
          body: WillPopScope(
              onWillPop: () => Future.value(false),
              child: PageView(
                  controller: PageController(keepPage: true),
                  onPageChanged: (_x) {
                    SystemChannels.textInput.invokeMethod('TextInput.hide');
                  },
                  children: [
                    HomeView(
                        dateTime: dateTime.value,
                        favoriteApps: favoriteApps.value,
                        openApp: openApp,
                        openOptionsMenu: openOptionsMenu,
                    ),
                    AppsView(
                        openApp: openApp,
                        openOptionsMenu: openOptionsMenu,
                    ),
                  ],
              ),
          ),
      ),
    );
  }
}

class MyApp extends StatefulWidget {
  MyAppState createState() => MyAppState();
}