33import com .bayoumi .controllers .components .audio .ChooseAudioController ;
44import com .bayoumi .controllers .dialog .DownloadResourcesController ;
55import com .bayoumi .controllers .home .HomeController ;
6- import com .bayoumi .models .Onboarding ;
7- import com .bayoumi .models .preferences .Preferences ;
86import com .bayoumi .models .settings .Settings ;
97import com .bayoumi .preloader .CustomPreloaderMain ;
8+ import com .bayoumi .repositry .OnboardingRepository ;
109import com .bayoumi .services .TimedAzkarService ;
10+ import com .bayoumi .services .update .UpdateService ;
11+ import com .bayoumi .storage .DatabaseManager ;
12+ import com .bayoumi .storage .LocationsDBManager ;
13+ import com .bayoumi .storage .preferences .Preferences ;
14+ import com .bayoumi .storage .preferences .PreferencesType ;
1115import com .bayoumi .util .Constants ;
1216import com .bayoumi .util .Logger ;
1317import com .bayoumi .util .SentryUtil ;
1418import com .bayoumi .util .Utility ;
15- import com .bayoumi .util .db .DatabaseManager ;
16- import com .bayoumi .util .db .LocationsDBManager ;
19+ import com .bayoumi .util .file .FileUtils ;
1720import com .bayoumi .util .gui .ArabicTextSupport ;
21+ import com .bayoumi .util .gui .BuilderUI ;
1822import com .bayoumi .util .gui .HelperMethods ;
1923import com .bayoumi .util .gui .load .Loader ;
2024import com .bayoumi .util .gui .load .LoaderComponent ;
2125import com .bayoumi .util .gui .load .Locations ;
2226import com .bayoumi .util .gui .tray .TrayUtil ;
2327import com .bayoumi .util .validation .SingleInstance ;
28+ import com .bayoumi .util .web .server .ServerService ;
2429import com .install4j .api .launcher .StartupNotification ;
2530import com .sun .javafx .application .LauncherImpl ;
2631import javafx .application .Application ;
2732import javafx .application .Preloader ;
2833import javafx .beans .property .SimpleBooleanProperty ;
2934import javafx .fxml .FXMLLoader ;
3035import javafx .scene .Scene ;
31- import javafx .stage .Modality ;
3236import javafx .stage .Stage ;
37+ import kong .unirest .Unirest ;
3338
3439import java .util .Objects ;
3540
@@ -70,20 +75,23 @@ public void init() {
7075
7176 try {
7277 // --- Create Needed Folder if not exist ---
73- Utility .createDirectory (Constants .assetsPath + "/logs" );
74- Utility .createDirectory (Constants .assetsPath + "/db" );
75- Utility .createDirectory (Constants .assetsPath + "/audio" );
76- Utility .createDirectory (Constants .assetsPath + "/azkar" );
78+ FileUtils .createDirectory (Constants .assetsPath + "/logs" );
79+ FileUtils .createDirectory (Constants .assetsPath + "/db" );
80+ FileUtils .createDirectory (Constants .assetsPath + "/audio/adhan " );
81+ FileUtils .createDirectory (Constants .assetsPath + "/azkar" );
7782
7883 // To save the audio file in the temp directory to be able to play it
79- Utility .createDirectory (System .getProperty ("java.io.tmpdir" ) + "/" + Constants .APP_NAME );
84+ FileUtils .createDirectory (System .getProperty ("java.io.tmpdir" ) + "/" + Constants .APP_NAME );
8085 incrementPreloader ();
8186
8287 // --- initialize Logger ---
8388 Logger .init ();
8489 Logger .info ("App Launched" );
8590 incrementPreloader ();
8691
92+ // --- initialize Unirest ---
93+ Unirest .config ().connectTimeout (30_000 ).socketTimeout (120_000 );
94+
8795 // --- initialize database connection ---
8896 DatabaseManager databaseManager = DatabaseManager .getInstance ();
8997 if (!databaseManager .init ()) {
@@ -95,6 +103,9 @@ public void init() {
95103 Preferences .init ();
96104 incrementPreloader ();
97105
106+ // --- initialize Auto Update Check ---
107+ UpdateService .checkForUpdate ();
108+
98109 // --- initialize database connection (locationsDB) ---
99110 try {
100111 LocationsDBManager .getInstance ();
@@ -106,7 +117,7 @@ public void init() {
106117 // --- load Homepage FXML ---
107118 FXMLLoader loader = new FXMLLoader (getClass ().getResource (Locations .Home .toString ()));
108119 scene = new Scene (loader .load ());
109- scene .getStylesheets ().add ( "/com/bayoumi/css/style.css" );
120+ scene .getStylesheets ().setAll ( Settings . getInstance (). getThemeFilesCSS () );
110121 homeController = loader .getController ();
111122 incrementPreloader ();
112123 // --- initialize Sentry for error tracking ---
@@ -116,6 +127,8 @@ public void init() {
116127 Logger .debug (ex .getLocalizedMessage ());
117128 }
118129 incrementPreloader ();
130+ if (Constants .RUNNING_MODE .equals (Constants .Mode .PRODUCTION )) ServerService .init ();
131+ incrementPreloader ();
119132
120133 TimedAzkarService .init ();
121134 incrementPreloader ();
@@ -135,9 +148,8 @@ private void incrementPreloader() {
135148 }
136149
137150 private void handleLocationDBError () {
138- if (!locationsDBError ) {
139- return ;
140- }
151+ if (!locationsDBError ) return ;
152+
141153 try {
142154 final LoaderComponent popUp = Loader .getInstance ().getPopUp (Locations .DownloadResources );
143155 ((DownloadResourcesController ) popUp .getController ())
@@ -148,19 +160,34 @@ private void handleLocationDBError() {
148160 }
149161 }
150162
151- private void showOnboardingIfFirstTimeOpened () {
152- if (Onboarding .isFirstTimeOpened ()) {
153- try {
154- Stage onboardingStage = new Stage ();
155- onboardingStage .setScene (new Scene (FXMLLoader .load (Objects .requireNonNull (getClass ().getResource (Locations .Onboarding .toString ())))));
156- onboardingStage .initModality (Modality .APPLICATION_MODAL );
157- HelperMethods .SetIcon (onboardingStage );
158- onboardingStage .setTitle ("Onboarding - " + Constants .APP_NAME );
159- onboardingStage .show ();
160- onboardingStage .setOnCloseRequest (event -> ChooseAudioController .stopIfPlaying ());
161- } catch (Exception ex ) {
162- Logger .error (ex .getLocalizedMessage (), ex , getClass ().getName () + "start() => show Onboarding stage" );
163- }
163+ private void showOnboardingIfFirstTimeOpened (boolean isFirstTimeOpened ) {
164+ if (!isFirstTimeOpened ) return ;
165+
166+ try {
167+ final Scene onboardingScene = new Scene (FXMLLoader .load (Objects .requireNonNull (getClass ().getResource (Locations .Onboarding .toString ()))));
168+ onboardingScene .getStylesheets ().setAll (Settings .getInstance ().getThemeFilesCSS ());
169+ final Stage onboardingStage = BuilderUI .initStageDecorated (onboardingScene , "Onboarding - " + Constants .APP_NAME );
170+ onboardingStage .show ();
171+ onboardingStage .setOnCloseRequest (event -> ChooseAudioController .stopIfPlaying ());
172+ Preferences .getInstance ().set (PreferencesType .APP_VERSION , Constants .VERSION );
173+ } catch (Exception ex ) {
174+ Logger .error (ex .getLocalizedMessage (), ex , getClass ().getName () + "start() => show Onboarding stage" );
175+ }
176+ }
177+
178+ private void showVersionInstalled (boolean isFirstTimeOpened , boolean isNewVersion ) {
179+ if (isFirstTimeOpened || !isNewVersion ) {
180+ return ;
181+ }
182+
183+ try {
184+ final Scene versionScene = new Scene (FXMLLoader .load (Objects .requireNonNull (getClass ().getResource (Locations .VersionInstalled .toString ()))));
185+ versionScene .getStylesheets ().setAll (Settings .getInstance ().getThemeFilesCSS ());
186+ final Stage stage = BuilderUI .initStageDecorated (versionScene , Constants .APP_NAME + " - " + Constants .VERSION );
187+ stage .show ();
188+ Preferences .getInstance ().set (PreferencesType .APP_VERSION , Constants .VERSION );
189+ } catch (Exception ex ) {
190+ Logger .error (ex .getLocalizedMessage (), ex , getClass ().getName () + "start() => show VersionInstalled stage" );
164191 }
165192 }
166193
@@ -174,20 +201,27 @@ public void start(Stage primaryStage) throws Exception {
174201 }
175202 // add loaded scene to primaryStage
176203 primaryStage .setScene (scene );
204+
177205 // set Title and Icon to primaryStage
178206 HelperMethods .SetAppDecoration (primaryStage );
179- if (Onboarding .isFirstTimeOpened () || !Settings .getInstance ().getMinimized ()) {
207+
208+ // show primaryStage
209+ final boolean isFirstTimeOpened = OnboardingRepository .isFirstTimeOpened ();
210+ final boolean isNewVersion = !Constants .VERSION .equals (Preferences .getInstance ().get (PreferencesType .APP_VERSION ));
211+ if (isFirstTimeOpened || isNewVersion || !Settings .getInstance ().getMinimized ()) {
180212 primaryStage .show ();
181213 }
214+
182215 // assign current primaryStage to SingleInstance Class
183216 SingleInstance .getInstance ().setCurrentStage (primaryStage );
184217
185218 // show Onboarding stage
186- showOnboardingIfFirstTimeOpened ();
219+ showOnboardingIfFirstTimeOpened (isFirstTimeOpened );
220+
221+ // show VersionInstalled stage
222+ showVersionInstalled (isFirstTimeOpened , isNewVersion );
187223
188224 StartupNotification .registerStartupListener (s ->
189225 SingleInstance .getInstance ().openCurrentStage ());
190226 }
191-
192-
193- }
227+ }
0 commit comments