11package com .bayoumi .controllers .home ;
22
3- import com .batoulapps .adhan .PrayerTimes ;
43import com .bayoumi .Launcher ;
54import com .bayoumi .controllers .azkar .timed .TimedAzkarController ;
6- import com .bayoumi .models .*;
7- import com .bayoumi .util .EditablePeriodTimerTask ;
5+ import com .bayoumi .models .AbsoluteZekr ;
6+ import com .bayoumi .models .AzkarSettings ;
7+ import com .bayoumi .models .OtherSettings ;
8+ import com .bayoumi .models .PrayerTimeSettings ;
89import com .bayoumi .util .Logger ;
910import com .bayoumi .util .gui .HelperMethods ;
10- import com .bayoumi .util .gui . notfication . Notification ;
11- import com .bayoumi .util .prayertimes . local . PrayerTimesUtil ;
11+ import com .bayoumi .util .services . azkar . AzkarService ;
12+ import com .bayoumi .util .services . reminders . ReminderService ;
1213import com .bayoumi .util .time .ArabicNumeralDiscrimination ;
1314import com .bayoumi .util .time .HijriDate ;
1415import com .bayoumi .util .time .Utilities ;
1718import javafx .animation .Animation ;
1819import javafx .animation .KeyFrame ;
1920import javafx .animation .Timeline ;
20- import javafx .application .Platform ;
2121import javafx .fxml .FXML ;
2222import javafx .fxml .FXMLLoader ;
2323import javafx .fxml .Initializable ;
2424import javafx .scene .Scene ;
2525import javafx .scene .control .Label ;
26- import javafx .scene .image .Image ;
2726import javafx .scene .layout .VBox ;
2827import javafx .stage .Modality ;
2928import javafx .stage .Stage ;
3029import javafx .util .Duration ;
3130import org .controlsfx .control .PopOver ;
3231
3332import java .net .URL ;
34- import java .text .SimpleDateFormat ;
35- import java .time .LocalTime ;
3633import java .util .Date ;
37- import java .util .Random ;
3834import java .util .ResourceBundle ;
3935
4036public class HomeController implements Initializable {
4137
42-
4338 @ FXML
4439 public Label hijriDate ;
4540 @ FXML
@@ -50,7 +45,6 @@ public class HomeController implements Initializable {
5045 public Label timeLabel ;
5146 @ FXML
5247 public JFXButton settingsBTN ;
53- private EditablePeriodTimerTask absoluteAzkarTask ;
5448 private OtherSettings otherSettings ;
5549 private AzkarSettings azkarSettings ;
5650 @ FXML
@@ -70,20 +64,7 @@ public class HomeController implements Initializable {
7064
7165 @ Override
7266 public void initialize (URL location , ResourceBundle resources ) {
73- //Build PopOver look and feel
74- Label label = new Label ("يمكن تعديل معدل ظهور الأذكار من الإعدادت" );
75- label .setStyle ("-fx-padding: 10;-fx-background-color: #E9C46A;-fx-text-fill: #000000;-fx-font-weight: bold;" );
76- //Create PopOver and add look and feel
77- PopOver popOver = new PopOver (label );
78- frequencyLabel .setOnMouseEntered (mouseEvent -> {
79- //Show PopOver when mouse enters label
80- popOver .show (frequencyLabel );
81- });
82- popOver .setCloseButtonEnabled (true );
83- frequencyLabel .setOnMouseExited (mouseEvent -> {
84- //Hide PopOver when mouse exits label
85- popOver .hide ();
86- });
67+ buildPopOver ();
8768
8869 otherSettings = new OtherSettings ();
8970 azkarSettings = new AzkarSettings ();
@@ -97,100 +78,19 @@ public void initialize(URL location, ResourceBundle resources) {
9778 }
9879
9980 if (!azkarSettings .isStopped ()) {
100- initAzkarThread ( );
81+ AzkarService . init ( this );
10182 } else {
10283 periodBox .setDisable (true );
10384 }
10485
10586 initClock ();
106- initReminders ( );
87+ ReminderService . init ( azkarSettings );
10788 Date date = new Date ();
10889 day .setText (Utilities .getDay (otherSettings .getLanguageLocal (), date ));
10990 gregorianDate .setText (Utilities .getGregorianDate (otherSettings .getLanguageLocal (), date ));
11091 hijriDate .setText (new HijriDate (otherSettings .getHijriOffset ()).getString (otherSettings .getLanguageLocal ()));
11192 }
11293
113- private void initReminders () {
114- System .out .println ("initReminders() ... " );
115- AzkarReminderService .clearAllTasks ();
116- Image morningImage = new Image ("/com/bayoumi/images/sun_50px.png" );
117- Image nightImage = new Image ("/com/bayoumi/images/night_50px.png" );
118- PrayerTimes prayerTimesForToday = PrayerTimesUtil .getPrayerTimesToday (new PrayerTimeSettings ());
119- if (azkarSettings .getMorningAzkarOffset () != 0 ) { // 60000
120- prayerTimesForToday .fajr .setTime (prayerTimesForToday .fajr .getTime () + (azkarSettings .getMorningAzkarOffset () * 60000 ));
121- AzkarReminderService .create (new SimpleDateFormat ("HH:mm" ).format (prayerTimesForToday .fajr ), "أذكار الصباح" , morningImage , this ::goToMorningAzkar );
122- }
123- if (azkarSettings .getNightAzkarOffset () != 0 ) {
124- prayerTimesForToday .asr .setTime (prayerTimesForToday .asr .getTime () + (azkarSettings .getNightAzkarOffset () * 60000 ));
125- AzkarReminderService .create (new SimpleDateFormat ("HH:mm" ).format (prayerTimesForToday .asr ), "أذكار المساء" , nightImage , this ::goToNightAzkar );
126- }
127-
128- // for testing
129- AzkarReminderService .create (LocalTime .of (0 ,22 ).toString (), "أذكار المساء" , nightImage ,this ::goToNightAzkar );
130- }
131-
132- private void initAzkarThread () {
133- setFrequencyLabel ("initAzkarThread" );
134- absoluteAzkarTask = null ;
135- absoluteAzkarTask = new EditablePeriodTimerTask (()
136- -> {
137- if (AbsoluteZekr .absoluteZekrObservableList .isEmpty ()) {
138- return ;
139- }
140- Platform .runLater (()
141- -> Notification .createControlsFX (
142- AbsoluteZekr .absoluteZekrObservableList .get (
143- new Random ().nextInt (AbsoluteZekr .absoluteZekrObservableList .size ())).getText (),
144- null , null ,10 ));
145-
146- },
147- this ::getPeriod );
148- absoluteAzkarTask .updateTimer ();
149- }
150-
151- private void initClock () {
152- Timeline clock = new Timeline (new KeyFrame (Duration .ZERO , e -> {
153- Date date = new Date ();
154- String timeNow ;
155- if (OtherSettings .isUpdated ) {
156- otherSettings = new OtherSettings ();
157- OtherSettings .isUpdated = false ;
158- hijriDate .setText (new HijriDate (otherSettings .getHijriOffset ()).getString (otherSettings .getLanguageLocal ()));
159- }
160- if (otherSettings .isEnable24Format ()) {
161- timeNow = Utilities .getTime24 (otherSettings .getLanguageLocal (), date );
162- } else {
163- timeNow = Utilities .getTime (otherSettings .getLanguageLocal (), date );
164- }
165- timeLabel .setText (timeNow );
166-
167- // Is it new day? => change Dates and the prayer times
168- if (timeNow .equals ("12:00:00 AM" ) || timeNow .equals ("12:00:00 ص" ) || timeNow .equals ("00:00:00" )) {
169- System .out .println ("NEW DAY ..." );
170- day .setText (Utilities .getDay (otherSettings .getLanguageLocal (), date ));
171- gregorianDate .setText (Utilities .getGregorianDate (otherSettings .getLanguageLocal (), date ));
172- hijriDate .setText (new HijriDate (otherSettings .getHijriOffset ()).getString (otherSettings .getLanguageLocal ()));
173- }
174-
175- if (AzkarSettings .isUpdated ) {
176- azkarSettings = new AzkarSettings ();
177- AzkarSettings .isUpdated = false ;
178- if (absoluteAzkarTask != null ) {
179- absoluteAzkarTask .stopTask ();
180- }
181- if (azkarSettings .isStopped ()) {
182- periodBox .setDisable (true );
183- } else {
184- initAzkarThread ();
185- periodBox .setDisable (false );
186- }
187- initReminders ();
188- }
189- }), new KeyFrame (Duration .seconds (1 )));
190- clock .setCycleCount (Animation .INDEFINITE );
191- clock .play ();
192- }
193-
19494 private JFXButton getSelectedButton () {
19595 if (azkarSettings .getSelectedPeriod ().equals (highFrequency .getText ())) {
19696 return highFrequency ;
@@ -204,8 +104,7 @@ private JFXButton getSelectedButton() {
204104 return highFrequency ;
205105 }
206106
207- private void setFrequencyLabel (String s ) {
208- System .out .println ("S: " + s );
107+ public void setFrequencyLabel () {
209108 String msg = "ظهور كل" + " " ;
210109 if (currentFrequency .equals (highFrequency )) {
211110 msg += ArabicNumeralDiscrimination .getTimeArabicPlurality (azkarSettings .getHighPeriod ());
@@ -219,7 +118,7 @@ private void setFrequencyLabel(String s) {
219118 frequencyLabel .setText (msg );
220119 }
221120
222- private Long getPeriod () {
121+ public Long getPeriod () {
223122 if (currentFrequency .equals (highFrequency )) {
224123 return azkarSettings .getHighPeriod () * 60000L ;
225124 } else if (currentFrequency .equals (midFrequency )) {
@@ -244,13 +143,78 @@ private Long getPeriod() {
244143 */
245144 }
246145
146+ private void buildPopOver () {
147+ //Build PopOver look and feel
148+ Label label = new Label ("يمكن تعديل معدل ظهور الأذكار من الإعدادت" );
149+ label .setStyle ("-fx-padding: 10;-fx-background-color: #E9C46A;-fx-text-fill: #000000;-fx-font-weight: bold;" );
150+ //Create PopOver and add look and feel
151+ PopOver popOver = new PopOver (label );
152+ frequencyLabel .setOnMouseEntered (mouseEvent -> {
153+ //Show PopOver when mouse enters label
154+ popOver .show (frequencyLabel );
155+ });
156+ popOver .setCloseButtonEnabled (true );
157+ frequencyLabel .setOnMouseExited (mouseEvent -> {
158+ //Hide PopOver when mouse exits label
159+ popOver .hide ();
160+ });
161+ }
162+
163+ private void initClock () {
164+ Timeline clock = new Timeline (new KeyFrame (Duration .ZERO , e -> {
165+ Date date = new Date ();
166+ String timeNow ;
167+ // check if there is a change in Hijri date offset
168+ if (OtherSettings .isUpdated ) {
169+ otherSettings = new OtherSettings ();
170+ OtherSettings .isUpdated = false ;
171+ hijriDate .setText (new HijriDate (otherSettings .getHijriOffset ()).getString (otherSettings .getLanguageLocal ()));
172+ }
173+ if (otherSettings .isEnable24Format ()) {
174+ timeNow = Utilities .getTime24 (otherSettings .getLanguageLocal (), date );
175+ } else {
176+ timeNow = Utilities .getTime (otherSettings .getLanguageLocal (), date );
177+ }
178+ timeLabel .setText (timeNow );
179+
180+ // Is it new day? => change Dates and the prayer times
181+ if (timeNow .equals ("12:00:00 AM" ) || timeNow .equals ("12:00:00 ص" ) || timeNow .equals ("00:00:00" )) {
182+ day .setText (Utilities .getDay (otherSettings .getLanguageLocal (), date ));
183+ gregorianDate .setText (Utilities .getGregorianDate (otherSettings .getLanguageLocal (), date ));
184+ hijriDate .setText (new HijriDate (otherSettings .getHijriOffset ()).getString (otherSettings .getLanguageLocal ()));
185+ }
186+
187+ // check if time periods of Azkar and settings has changed
188+ if (AzkarSettings .isUpdated ) {
189+ azkarSettings = new AzkarSettings ();
190+ AzkarSettings .isUpdated = false ;
191+ if (AzkarService .absoluteAzkarTask != null ) {
192+ AzkarService .absoluteAzkarTask .stopTask ();
193+ }
194+ if (azkarSettings .isStopped ()) {
195+ periodBox .setDisable (true );
196+ } else {
197+ AzkarService .init (this );
198+ periodBox .setDisable (false );
199+ }
200+ ReminderService .init (azkarSettings );
201+ }
202+ if (PrayerTimeSettings .isUpdated ) {
203+ ReminderService .init (azkarSettings );
204+ PrayerTimeSettings .isUpdated = false ;
205+ }
206+ }), new KeyFrame (Duration .seconds (1 )));
207+ clock .setCycleCount (Animation .INDEFINITE );
208+ clock .play ();
209+ }
210+
247211 @ FXML
248- private void goToMorningAzkar () {
212+ public void goToMorningAzkar () {
249213 showTimedAzkar ("morning" );
250214 }
251215
252216 @ FXML
253- private void goToNightAzkar () {
217+ public void goToNightAzkar () {
254218 showTimedAzkar ("night" );
255219 }
256220
@@ -296,8 +260,8 @@ private void toggleFrequencyBTN(JFXButton b) {
296260 currentFrequency = b ;
297261 currentFrequency .getStyleClass ().add ("frequency-btn-selected" );
298262
299- absoluteAzkarTask .updateTimer ();
300- setFrequencyLabel ("toggleFrequencyBTN" );
263+ AzkarService . absoluteAzkarTask .updateTimer ();
264+ setFrequencyLabel ();
301265 azkarSettings .setSelectedPeriod (currentFrequency .getText ());
302266 azkarSettings .saveSelectedPeriod ();
303267 }
0 commit comments