aboutsummaryrefslogtreecommitdiff
path: root/src/distractionless
diff options
context:
space:
mode:
authorTim <contact@bytim.eu>2025-02-08 11:28:57 +0100
committerTim <contact@bytim.eu>2025-02-08 11:28:57 +0100
commitd69bc395e6cc9ed5e1da6a31835874142fe6800e (patch)
tree324cf18c710721c286890d78310ebe0075499ea4 /src/distractionless
downloaddistractionless-d69bc395e6cc9ed5e1da6a31835874142fe6800e.tar.xz
distractionless-d69bc395e6cc9ed5e1da6a31835874142fe6800e.zip
Initial commit
Diffstat (limited to 'src/distractionless')
-rw-r--r--src/distractionless/config.cljd29
-rw-r--r--src/distractionless/core.cljd53
-rw-r--r--src/distractionless/ui/apps.cljd26
-rw-r--r--src/distractionless/ui/apps/settings.cljd42
-rw-r--r--src/distractionless/ui/constants.cljd15
5 files changed, 165 insertions, 0 deletions
diff --git a/src/distractionless/config.cljd b/src/distractionless/config.cljd
new file mode 100644
index 0000000..07d86b8
--- /dev/null
+++ b/src/distractionless/config.cljd
@@ -0,0 +1,29 @@
+(ns distractionless.config
+ (:require ["dart:io" :as io]
+ [cljd.reader :as cljdreader]))
+
+(defn read-from-file [^io/File file]
+ (->> (.readAsStringSync file)
+ cljdreader/read-string))
+
+(defn write-to-file! [^io/File file content reloader]
+ (->> content
+ pr-str
+ (.writeAsStringSync file))
+ (when (some? reloader)
+ (reset! reloader (when (= @reloader 0)
+ 1
+ 0))))
+
+(defn update-config! [^io/File file func reloader]
+ (let [new-content (-> (read-from-file file)
+ func)]
+ (write-to-file! file new-content reloader)
+ new-content))
+
+(defn init-config! [^io/File file reloader]
+ (when-not (.existsSync file)
+ (.createSync file)
+ (write-to-file! file {} reloader))
+ (when-not (contains? (read-from-file file) "favourites")
+ (prn (update-config! file #(assoc % "favourites" #{}) reloader))))
diff --git a/src/distractionless/core.cljd b/src/distractionless/core.cljd
new file mode 100644
index 0000000..2036da6
--- /dev/null
+++ b/src/distractionless/core.cljd
@@ -0,0 +1,53 @@
+(ns distractionless.core
+ (:require ["package:flutter/material.dart" :as m]
+ [cljd.flutter :as f]
+ ["package:path_provider/path_provider.dart" :as path-provider]
+ [distractionless.config :as dconfig]
+ ["dart:io" :as io]
+
+ [distractionless.ui.constants :as duconstants]
+ [distractionless.ui.apps :as duapps]))
+
+(defn ^dynamic main []
+ (f/run
+ (m/MaterialApp
+ .theme (m/ThemeData .primarySwatch m.Colors/pink))
+ .home
+ (m/Scaffold .backgroundColor duconstants/background-color)
+ .body
+ :context ctx
+ :watch [apps (atom '()) :as *apps
+ query (atom "") :as *query
+ data-dir (await (path-provider/getApplicationDocumentsDirectory))
+ _ (atom 0) :as reloader]
+ :managed [_ (duapps/load-installed-apps! *apps) ; loads apps on app startup
+ config-file (io/File. (str (.-path data-dir) "/config.edn"))
+ _ (dconfig/init-config! config-file nil) ; Init config on app startup
+ _ (m/AppLifecycleListener .onShow #(do (dconfig/init-config! config-file nil)
+ (duapps/load-installed-apps! *apps)))
+ page-controller (m/PageController.)]
+ :let [root-container-padding (m/EdgeInsets.only
+ .top 50)]
+ (m/PageView.
+ .controller page-controller
+ .children [(let [favourites (get (dconfig/read-from-file config-file) "favourites")]
+ (m/Container
+ .padding root-container-padding
+ .child (m/Column
+ .children [(m/Expanded
+ .child (duapps/apps-list (filter #(.contains favourites (.-packageName %)) apps) nil config-file ctx reloader))
+ (m/Text "Wische nach links, um alle Apps anzuzeigen"
+ .style duconstants/text-style)])))
+ (m/Container
+ .padding root-container-padding
+ .child (m/Column
+ .children [(m/Text "Alle Apps"
+ .style duconstants/title-style)
+ (m/SearchBar
+ .onChanged (fn [new-val]
+ (reset! *query new-val)
+ nil)
+ .hintText "Suche"
+ .backgroundColor (#/(.resolveWith m/Color?) m/MaterialStateProperty (fn [^Set _states] duconstants/search-bar-color)))
+ (m/Expanded
+ .child (duapps/apps-list apps query config-file ctx reloader))]))])))
diff --git a/src/distractionless/ui/apps.cljd b/src/distractionless/ui/apps.cljd
new file mode 100644
index 0000000..7fd620c
--- /dev/null
+++ b/src/distractionless/ui/apps.cljd
@@ -0,0 +1,26 @@
+(ns distractionless.ui.apps
+ (:require ["package:flutter/material.dart" :as m]
+ [clojure.string :as cstr]
+ ["package:installed_apps/installed_apps.dart" :as apps]
+ [distractionless.ui.constants :as duconstants]
+ [distractionless.ui.apps.settings :as duasettings]))
+
+(defn load-installed-apps! [a]
+ (reset! a (await (apps/InstalledApps.getInstalledApps))))
+
+(defn- render-app [app config-file ctx reloader]
+ (m/ListTile
+ .title (m/Text (.-name app)
+ .style duconstants/text-style)
+ .onTap #(do (await (apps/InstalledApps.startApp (.-packageName app))) nil)
+ .onLongPress #(duasettings/open app config-file ctx reloader)))
+
+(defn apps-list [apps query config-file ctx reloader]
+ (m/ListView
+ .children (for [app (if (cstr/blank? query)
+ apps
+ (filter #(cstr/includes?
+ (cstr/lower-case (.-name %))
+ (cstr/lower-case query))
+ apps))]
+ (render-app app config-file ctx reloader))))
diff --git a/src/distractionless/ui/apps/settings.cljd b/src/distractionless/ui/apps/settings.cljd
new file mode 100644
index 0000000..1b4de0a
--- /dev/null
+++ b/src/distractionless/ui/apps/settings.cljd
@@ -0,0 +1,42 @@
+(ns distractionless.ui.apps.settings
+ (:require ["package:flutter/material.dart" :as m]
+ [cljd.flutter :as f]
+ [distractionless.ui.constants :as duconstants]
+ [distractionless.config :as dconfig]))
+
+(defn- header [app ctx]
+ (m/Row
+ .mainAxisAlignment m/MainAxisAlignment.spaceBetween
+ .children [(m/Text (.-name app)
+ .style duconstants/title-style)
+ (m/IconButton .icon (m/Icon m/Icons.clear_rounded)
+ .color duconstants/text-color
+ .onPressed #(m/Navigator.pop ctx)
+ .iconSize 30.0)]))
+
+(defn- favourite-setting [app config-file reloader]
+ (m/Row
+ .children [(m/Checkbox
+ .value (contains? (get (dconfig/read-from-file config-file) "favourites")
+ (.-packageName app))
+ .onChanged (fn [new-val]
+ (if new-val
+ (dconfig/update-config! config-file
+ #(update % "favourites" conj (.-packageName app))
+ reloader)
+ (dconfig/update-config! config-file
+ (fn [config]
+ (update config "favourites" disj (.-packageName app)))
+ reloader)))
+ .activeColor duconstants/checkbox-active-color)
+ (m/Text "Favorit")]))
+
+(defn open [app config-file ctx reloader]
+ (m/showDialog
+ .context ctx
+ .builder (f/build :watch [_ reloader]
+ (m/Dialog.fullscreen
+ .backgroundColor duconstants/background-color
+ .child (m/Column
+ .children (list (header app ctx)
+ (favourite-setting app config-file reloader)))))))
diff --git a/src/distractionless/ui/constants.cljd b/src/distractionless/ui/constants.cljd
new file mode 100644
index 0000000..505778f
--- /dev/null
+++ b/src/distractionless/ui/constants.cljd
@@ -0,0 +1,15 @@
+(ns distractionless.ui.constants
+ (:require ["package:flutter/material.dart" :as m]))
+
+(def background-color (m/Color.fromARGB 255 157 166 159))
+(def search-bar-color (m/Color.fromARGB 255 138 150 141))
+(def text-color (m/Color.fromARGB 255 0 0 0))
+
+(def checkbox-active-color (m/Color.fromARGB 255 86 93 86))
+(def checkbox-fill-color (m/Color.fromARGB 255 197 205 199))
+
+(def text-style (m/TextStyle
+ .color text-color))
+(def title-style (m/TextStyle
+ .color text-color
+ .fontSize 30.0))