From 2167050f404ee5fb125c91719803ce0061efa665 Mon Sep 17 00:00:00 2001 From: pl0301 Date: Wed, 26 Nov 2025 16:22:36 +0100 Subject: [PATCH] init --- .gradle/7.5.1/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/7.5.1/checksums/md5-checksums.bin | Bin 0 -> 69415 bytes .gradle/7.5.1/checksums/sha1-checksums.bin | Bin 0 -> 205157 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.bin | Bin 0 -> 183266 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/7.5.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/7.5.1/fileHashes/fileHashes.bin | Bin 0 -> 41397 bytes .gradle/7.5.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../7.5.1/fileHashes/resourceHashesCache.bin | Bin 0 -> 19007 bytes .gradle/7.5.1/gc.properties | 0 .gradle/8.7/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/8.7/checksums/md5-checksums.bin | Bin 0 -> 30397 bytes .gradle/8.7/checksums/sha1-checksums.bin | Bin 0 -> 92741 bytes .../8.7/dependencies-accessors/gc.properties | 0 .../8.7/executionHistory/executionHistory.bin | Bin 0 -> 671763 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/8.7/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/8.7/fileHashes/fileHashes.bin | Bin 0 -> 90265 bytes .gradle/8.7/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../8.7/fileHashes/resourceHashesCache.bin | Bin 0 -> 20503 bytes .gradle/8.7/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 23285 bytes .gradle/config.properties | 2 + .gradle/file-system.probe | Bin 0 -> 8 bytes .gradle/vcs-1/gc.properties | 0 .idea/.gitignore | 3 + .idea/AndroidProjectSystem.xml | 6 + .idea/caches/deviceStreaming.xml | 1041 ++++ .idea/compiler.xml | 6 + .idea/copilot.data.migration.agent.xml | 6 + .idea/copilot.data.migration.ask.xml | 6 + .idea/copilot.data.migration.ask2agent.xml | 6 + .idea/copilot.data.migration.edit.xml | 6 + .idea/deploymentTargetSelector.xml | 18 + .idea/deviceManager.xml | 13 + .idea/gradle.xml | 19 + .idea/jarRepositories.xml | 25 + .idea/migrations.xml | 10 + .idea/misc.xml | 70 + .idea/runConfigurations.xml | 17 + .idea/vcs.xml | 6 + .../com/likesoft/mdedal/BuildConfig.java | 12 + app/src/main/AndroidManifest.xml | 129 + app/src/main/ic_new_button-web.png | Bin 0 -> 7507 bytes .../main/java/com/likesoft/mdedal/Alarm.java | 72 + .../likesoft/mdedal/AsyncCallChangeDate.java | 141 + .../java/com/likesoft/mdedal/AutoStart.java | 19 + .../com/likesoft/mdedal/CalendarActivity.java | 1400 +++++ .../likesoft/mdedal/DatePickerFragment.java | 122 + .../com/likesoft/mdedal/DedalActivity.java | 4803 +++++++++++++++++ .../likesoft/mdedal/DedalDownloadService.java | 616 +++ .../java/com/likesoft/mdedal/DedalHelper.java | 538 ++ .../likesoft/mdedal/DedalHttpConnection.java | 418 ++ .../mdedal/DedalSSLSocketFactory.java | 108 + .../com/likesoft/mdedal/DedalService.java | 1680 ++++++ .../mdedal/DokumentyKollektoActivity.java | 655 +++ .../mdedal/DokumentyKollektoService.java | 266 + .../likesoft/mdedal/FragmentMainActivity.java | 331 ++ .../java/com/likesoft/mdedal/GPSTracker.java | 252 + .../java/com/likesoft/mdedal/KPActivity.java | 374 ++ .../com/likesoft/mdedal/KPWplatyActivity.java | 267 + .../com/likesoft/mdedal/ListActivity.java | 3473 ++++++++++++ .../main/java/com/likesoft/mdedal/Log.java | 179 + .../com/likesoft/mdedal/MainActivity.java | 1373 +++++ .../com/likesoft/mdedal/MyXMLSerializer.java | 410 ++ .../com/likesoft/mdedal/PreferActivity.java | 295 + .../mdedal/RefreshLayoutAndThread.java | 294 + .../likesoft/mdedal/TableHeadersActivity.java | 817 +++ .../likesoft/mdedal/TimePickerFragment.java | 99 + .../mdedal/gui/BorderLinearLayout.java | 45 + .../likesoft/mdedal/gui/BorderTextView.java | 38 + .../com/likesoft/mdedal/gui/ButtonDate.java | 20 + .../likesoft/mdedal/gui/MLinearLayout.java | 28 + .../com/likesoft/mdedal/gui/MTextView.java | 25 + .../java/com/likesoft/mdedaldemo/test.java | 7 + .../main/res/drawable-hdpi/ic_button_zen.png | Bin 0 -> 479 bytes app/src/main/res/drawable-hdpi/ic_dedal.png | Bin 0 -> 3536 bytes .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 3135 bytes app/src/main/res/drawable-ldpi/logo.png | Bin 0 -> 10175 bytes .../main/res/drawable-mdpi/ic_button_zen.png | Bin 0 -> 322 bytes app/src/main/res/drawable-mdpi/ic_dedal.png | Bin 0 -> 2069 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 1864 bytes .../main/res/drawable-xhdpi/ic_button_zen.png | Bin 0 -> 643 bytes app/src/main/res/drawable-xhdpi/ic_dedal.png | Bin 0 -> 4811 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 4339 bytes .../res/drawable-xxhdpi/ic_button_zen.png | Bin 0 -> 1087 bytes app/src/main/res/drawable-xxhdpi/ic_dedal.png | Bin 0 -> 7476 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 7159 bytes app/src/main/res/layout/activity_calendar.xml | 12 + app/src/main/res/layout/activity_list.xml | 50 + app/src/main/res/layout/activity_main.xml | 30 + app/src/main/res/layout/activity_prefer.xml | 112 + .../main/res/layout/activity_tableheaders.xml | 21 + app/src/main/res/layout/jakis_fragment.xml | 8 + app/src/main/res/layout/listrow.xml | 15 + app/src/main/res/menu/list.xml | 9 + app/src/main/res/menu/main.xml | 9 + app/src/main/res/menu/menu_calendar.xml | 6 + app/src/main/res/menu/prefer.xml | 9 + .../main/res/mipmap-hdpi/ic_new_button.png | Bin 0 -> 2044 bytes .../main/res/mipmap-mdpi/ic_new_button.png | Bin 0 -> 1081 bytes .../main/res/mipmap-xhdpi/ic_new_button.png | Bin 0 -> 3088 bytes .../main/res/mipmap-xxhdpi/ic_new_button.png | Bin 0 -> 3606 bytes .../main/res/mipmap-xxxhdpi/ic_new_button.png | Bin 0 -> 4665 bytes app/src/main/res/values-sw600dp/dimens.xml | 8 + .../main/res/values-sw720dp-land/dimens.xml | 10 + app/src/main/res/values-v11/styles.xml | 11 + app/src/main/res/values-v14/styles.xml | 12 + app/src/main/res/values-w820dp/dimens.xml | 6 + app/src/main/res/values/dimens.xml | 8 + app/src/main/res/values/strings.xml | 74 + .../res/values/strings_activity_settings.xml | 61 + app/src/main/res/values/styles.xml | 73 + app/src/main/res/xml/file_paths.xml | 8 + .../main/res/xml/network_security_config.xml | 6 + app/src/main/res/xml/pref_data_sync.xml | 25 + app/src/main/res/xml/pref_general.xml | 35 + app/src/main/res/xml/pref_headers.xml | 15 + app/src/main/res/xml/pref_notification.xml | 29 + app/src/main/res/zen_button_red_pressed.png | Bin 0 -> 1345 bytes build.gradle | 0 build/generated/mockable-android-20.jar | Bin 0 -> 20645138 bytes build/intermediates/dex-cache/cache.xml | 75 + build/intermediates/model_data.bin | Bin 0 -> 85098 bytes gradle.properties | 2 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 240 + gradlew.bat | 91 + local.properties | 8 + settings.gradle | 17 + 135 files changed, 21669 insertions(+) create mode 100644 .gradle/7.5.1/checksums/checksums.lock create mode 100644 .gradle/7.5.1/checksums/md5-checksums.bin create mode 100644 .gradle/7.5.1/checksums/sha1-checksums.bin create mode 100644 .gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock create mode 100644 .gradle/7.5.1/dependencies-accessors/gc.properties create mode 100644 .gradle/7.5.1/executionHistory/executionHistory.bin create mode 100644 .gradle/7.5.1/executionHistory/executionHistory.lock create mode 100644 .gradle/7.5.1/fileChanges/last-build.bin create mode 100644 .gradle/7.5.1/fileHashes/fileHashes.bin create mode 100644 .gradle/7.5.1/fileHashes/fileHashes.lock create mode 100644 .gradle/7.5.1/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/7.5.1/gc.properties create mode 100644 .gradle/8.7/checksums/checksums.lock create mode 100644 .gradle/8.7/checksums/md5-checksums.bin create mode 100644 .gradle/8.7/checksums/sha1-checksums.bin create mode 100644 .gradle/8.7/dependencies-accessors/gc.properties create mode 100644 .gradle/8.7/executionHistory/executionHistory.bin create mode 100644 .gradle/8.7/executionHistory/executionHistory.lock create mode 100644 .gradle/8.7/fileChanges/last-build.bin create mode 100644 .gradle/8.7/fileHashes/fileHashes.bin create mode 100644 .gradle/8.7/fileHashes/fileHashes.lock create mode 100644 .gradle/8.7/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/8.7/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/buildOutputCleanup/outputFiles.bin create mode 100644 .gradle/config.properties create mode 100644 .gradle/file-system.probe create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 .idea/.gitignore create mode 100644 .idea/AndroidProjectSystem.xml create mode 100644 .idea/caches/deviceStreaming.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/copilot.data.migration.agent.xml create mode 100644 .idea/copilot.data.migration.ask.xml create mode 100644 .idea/copilot.data.migration.ask2agent.xml create mode 100644 .idea/copilot.data.migration.edit.xml create mode 100644 .idea/deploymentTargetSelector.xml create mode 100644 .idea/deviceManager.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/migrations.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/vcs.xml create mode 100644 app/build/generated/source/buildConfig/debug/com/likesoft/mdedal/BuildConfig.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_new_button-web.png create mode 100644 app/src/main/java/com/likesoft/mdedal/Alarm.java create mode 100644 app/src/main/java/com/likesoft/mdedal/AsyncCallChangeDate.java create mode 100644 app/src/main/java/com/likesoft/mdedal/AutoStart.java create mode 100644 app/src/main/java/com/likesoft/mdedal/CalendarActivity.java create mode 100644 app/src/main/java/com/likesoft/mdedal/DatePickerFragment.java create mode 100644 app/src/main/java/com/likesoft/mdedal/DedalActivity.java create mode 100644 app/src/main/java/com/likesoft/mdedal/DedalDownloadService.java create mode 100644 app/src/main/java/com/likesoft/mdedal/DedalHelper.java create mode 100644 app/src/main/java/com/likesoft/mdedal/DedalHttpConnection.java create mode 100644 app/src/main/java/com/likesoft/mdedal/DedalSSLSocketFactory.java create mode 100644 app/src/main/java/com/likesoft/mdedal/DedalService.java create mode 100644 app/src/main/java/com/likesoft/mdedal/DokumentyKollektoActivity.java create mode 100644 app/src/main/java/com/likesoft/mdedal/DokumentyKollektoService.java create mode 100644 app/src/main/java/com/likesoft/mdedal/FragmentMainActivity.java create mode 100644 app/src/main/java/com/likesoft/mdedal/GPSTracker.java create mode 100644 app/src/main/java/com/likesoft/mdedal/KPActivity.java create mode 100644 app/src/main/java/com/likesoft/mdedal/KPWplatyActivity.java create mode 100644 app/src/main/java/com/likesoft/mdedal/ListActivity.java create mode 100644 app/src/main/java/com/likesoft/mdedal/Log.java create mode 100644 app/src/main/java/com/likesoft/mdedal/MainActivity.java create mode 100644 app/src/main/java/com/likesoft/mdedal/MyXMLSerializer.java create mode 100644 app/src/main/java/com/likesoft/mdedal/PreferActivity.java create mode 100644 app/src/main/java/com/likesoft/mdedal/RefreshLayoutAndThread.java create mode 100644 app/src/main/java/com/likesoft/mdedal/TableHeadersActivity.java create mode 100644 app/src/main/java/com/likesoft/mdedal/TimePickerFragment.java create mode 100644 app/src/main/java/com/likesoft/mdedal/gui/BorderLinearLayout.java create mode 100644 app/src/main/java/com/likesoft/mdedal/gui/BorderTextView.java create mode 100644 app/src/main/java/com/likesoft/mdedal/gui/ButtonDate.java create mode 100644 app/src/main/java/com/likesoft/mdedal/gui/MLinearLayout.java create mode 100644 app/src/main/java/com/likesoft/mdedal/gui/MTextView.java create mode 100644 app/src/main/java/com/likesoft/mdedaldemo/test.java create mode 100644 app/src/main/res/drawable-hdpi/ic_button_zen.png create mode 100644 app/src/main/res/drawable-hdpi/ic_dedal.png create mode 100644 app/src/main/res/drawable-hdpi/ic_launcher.png create mode 100644 app/src/main/res/drawable-ldpi/logo.png create mode 100644 app/src/main/res/drawable-mdpi/ic_button_zen.png create mode 100644 app/src/main/res/drawable-mdpi/ic_dedal.png create mode 100644 app/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_button_zen.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_dedal.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_button_zen.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dedal.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/layout/activity_calendar.xml create mode 100644 app/src/main/res/layout/activity_list.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_prefer.xml create mode 100644 app/src/main/res/layout/activity_tableheaders.xml create mode 100644 app/src/main/res/layout/jakis_fragment.xml create mode 100644 app/src/main/res/layout/listrow.xml create mode 100644 app/src/main/res/menu/list.xml create mode 100644 app/src/main/res/menu/main.xml create mode 100644 app/src/main/res/menu/menu_calendar.xml create mode 100644 app/src/main/res/menu/prefer.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_new_button.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_new_button.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_new_button.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_new_button.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_new_button.png create mode 100644 app/src/main/res/values-sw600dp/dimens.xml create mode 100644 app/src/main/res/values-sw720dp-land/dimens.xml create mode 100644 app/src/main/res/values-v11/styles.xml create mode 100644 app/src/main/res/values-v14/styles.xml create mode 100644 app/src/main/res/values-w820dp/dimens.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/strings_activity_settings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/xml/file_paths.xml create mode 100644 app/src/main/res/xml/network_security_config.xml create mode 100644 app/src/main/res/xml/pref_data_sync.xml create mode 100644 app/src/main/res/xml/pref_general.xml create mode 100644 app/src/main/res/xml/pref_headers.xml create mode 100644 app/src/main/res/xml/pref_notification.xml create mode 100644 app/src/main/res/zen_button_red_pressed.png create mode 100644 build.gradle create mode 100644 build/generated/mockable-android-20.jar create mode 100644 build/intermediates/dex-cache/cache.xml create mode 100644 build/intermediates/model_data.bin create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 local.properties create mode 100644 settings.gradle diff --git a/.gradle/7.5.1/checksums/checksums.lock b/.gradle/7.5.1/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..c474eca6c5b8147bb9885ee7ce42f54ea03d552e GIT binary patch literal 17 VcmZQh`CT=u=kr4)1~A~d3jjZ*1>gVx literal 0 HcmV?d00001 diff --git a/.gradle/7.5.1/checksums/md5-checksums.bin b/.gradle/7.5.1/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..1a1d071faa28cf59ddafb67f45788926f452ede0 GIT binary patch literal 69415 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 literal 0 HcmV?d00001 diff --git a/.gradle/7.5.1/checksums/sha1-checksums.bin b/.gradle/7.5.1/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..71e6afa8241884d262650ea5ca066b9c0bc7b239 GIT binary patch literal 205157 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 literal 0 HcmV?d00001 diff --git a/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock b/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000000000000000000000000000000000000..60d76edceb5574ea70ffc60c7530a61072baa0a6 GIT binary patch literal 17 TcmZSXK2vDt@o^~&0~7!NGK~Z5 literal 0 HcmV?d00001 diff --git a/.gradle/7.5.1/dependencies-accessors/gc.properties b/.gradle/7.5.1/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/7.5.1/executionHistory/executionHistory.bin b/.gradle/7.5.1/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..7931c46ea2b341791970d6a7a8eecc6ebf1086de GIT binary patch literal 183266 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 PnGRVh2!^E>IrV=4)q5tF literal 0 HcmV?d00001 diff --git a/.gradle/7.5.1/executionHistory/executionHistory.lock b/.gradle/7.5.1/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..24b652143042337b4918147f08ee414a298948cc GIT binary patch literal 17 TcmZSnW+YS|kT6q-0Rp4|C@%vl literal 0 HcmV?d00001 diff --git a/.gradle/7.5.1/fileChanges/last-build.bin b/.gradle/7.5.1/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/7.5.1/fileHashes/fileHashes.bin b/.gradle/7.5.1/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..432c96d44839d39e73dcfadaff850f3ca2193938 GIT binary patch literal 41397 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

&^X#b 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 MM*M<=3VP!FAB&Z6Hvj+t literal 0 HcmV?d00001 diff --git a/.gradle/8.7/fileHashes/fileHashes.lock b/.gradle/8.7/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..0d58ef55bfa3addae441057ac370762580305d6e GIT binary patch literal 17 VcmZQ(bDSf#^z!o43}C=M9RMvf1cd+q literal 0 HcmV?d00001 diff --git a/.gradle/8.7/fileHashes/resourceHashesCache.bin b/.gradle/8.7/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..c56003717b112361b1794c7c5553b4a0a4377618 GIT binary patch literal 20503 zcmeI3`8U*iAHauGStqJdWW7pUYeXt{T5Ms=47!xZb|>WGYLqS6pA2KYmfY-4dAgJk zDjLlZqVNm+}8&>=PCZDTL+|AUC0(MMB(BvlRqUZ z-++d2Y6;*86Va-BD+25hPErBe zWX{#&C58y6glzE3TV}qC&J{=fOMnm7bC-HvIa-5o;}pOrZq+@rcXB}2LlOXdc12gA z?nv!0;+sAPd?D->b*wtl1)ZY?_&3WVGm?jgP9far6yU4z>3XLM2b~a3F5BQN#S-SU zcNyyE0nU|C7V|^FHazMp0nSYe^HF1U`JjAZgHIf8mD0QL1H!2!z2|a@yc7vX8Q0@S@ zSXt(-KC93;gi}2L-)lP&cgc;&gK!cRaB-)M=s_EoKM-!z0Juba(PSw-<1)f2I)FoX*$Zxs3 z-1i0bUji;4E;|_9ZKa5C(nG)%w#_D)mX{C_PW>KmMW-E7rSn59gd3LwuKM#x+K-(M zT?i-B0oN?F%5t1hC_p(GaMI)1&|;NT|?w>1rU4}OOQU;$VF7Jvm{0aySQfCXRy zSO6A)1z-VK02Y7+U;$VF7Jvm{0aySQfCXRySO6A)1z-VK02Y7+U;$VF7Jvm{0aySQ zfCc_{fkW$Wvp3N0V1EhMPIliUsj6!xcusMpsd3G$L#h8Z3WeI=^+y?Wo+B8^-?ysw3@8jpV%j*xcL6Pr293BwH zMQ@!nat`4r_E8%9KS{wlOCJruXqrj&8Ejo^sLG5&9wx zvrLvbRsUluc7}zt(O%DEHL0hW&8f+&uImElI>cDPv1F5L^luXOD4uHB8da^YjJ8b+VpDjjEXC=3tHLmk+d^uNB`f*e|TXlp(Qq{B!iE zZcgr|dAnK9+e_c{jnqxS8h^H{$bL)i32p4uI@s8q9*8wqGfvzBH@vO2HhJXGJ(>1d_ET#5GN`_dRx*;?|koq{mki&zzv}W|r!- zVLDM+Ngg}n(PTkWrC{Ke!P6r(t?9&@p=3G8!G9P8jaX*MC6 zmx*89-AI)AJY0n}-1p>Vi3L@hxXv%xYd})|H`YjBCYBgRwez0PeXbi{B6u5XSgVwc ztKXBFHE?+DtE#fdK3l=Djxj@NQOWj@#5j%HZd&HvoBV}|qL0(?_m!B*d9En}F$HVb z83u}5t5h|lJ${z{?p|uK7yE<-$6dlS7p?^MtbJ}ZPn&a;Ub%=h#6FcS9(Z@mplQL3 z7B0YIpIG3S5ixQ>PDHfU`JmJLhrwSvld;B0hP3tWh9suzIngQ!#u;yJo4e>@2zUG}h<{A4t73KT%#Vudh+0@nSF5 XXns&_JI!@9ZYe&ccq~BAk!}13dJ_le literal 0 HcmV?d00001 diff --git a/.gradle/8.7/gc.properties b/.gradle/8.7/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..538e89dcb3ec4e72efb0377f5339a5a9129c6d32 GIT binary patch literal 17 VcmZQRGbP2zBg?CY0Svgm001va1d#v$ literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..5802e11 --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Mon Nov 10 14:27:14 CET 2025 +gradle.version=8.7 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..0a8ad1f16957659a8f5ca5a23176dff608a9c4b4 GIT binary patch literal 23285 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 qtG{yZZ5d%(GVL34TPn9D)4sj`^S5ftv9~4j&p* + + + + \ No newline at end of file diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml new file mode 100644 index 0000000..6f03899 --- /dev/null +++ b/.idea/caches/deviceStreaming.xml @@ -0,0 +1,1041 @@ + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/copilot.data.migration.agent.xml b/.idea/copilot.data.migration.agent.xml new file mode 100644 index 0000000..4ea72a9 --- /dev/null +++ b/.idea/copilot.data.migration.agent.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/copilot.data.migration.ask.xml b/.idea/copilot.data.migration.ask.xml new file mode 100644 index 0000000..7ef04e2 --- /dev/null +++ b/.idea/copilot.data.migration.ask.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/copilot.data.migration.ask2agent.xml b/.idea/copilot.data.migration.ask2agent.xml new file mode 100644 index 0000000..1f2ea11 --- /dev/null +++ b/.idea/copilot.data.migration.ask2agent.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/copilot.data.migration.edit.xml b/.idea/copilot.data.migration.edit.xml new file mode 100644 index 0000000..8648f94 --- /dev/null +++ b/.idea/copilot.data.migration.edit.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..c94b700 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/deviceManager.xml b/.idea/deviceManager.xml new file mode 100644 index 0000000..91f9558 --- /dev/null +++ b/.idea/deviceManager.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..639c779 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..19364dc --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..952c818 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..16660f1 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build/generated/source/buildConfig/debug/com/likesoft/mdedal/BuildConfig.java b/app/build/generated/source/buildConfig/debug/com/likesoft/mdedal/BuildConfig.java new file mode 100644 index 0000000..06c3d0d --- /dev/null +++ b/app/build/generated/source/buildConfig/debug/com/likesoft/mdedal/BuildConfig.java @@ -0,0 +1,12 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package com.likesoft.mdedal; + +public final class BuildConfig { + public static final boolean DEBUG = Boolean.parseBoolean("true"); + public static final String APPLICATION_ID = "com.likesoft.mdedal"; + public static final String BUILD_TYPE = "debug"; + public static final int VERSION_CODE = 54; + public static final String VERSION_NAME = "2.2.2"; +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..dae0630 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/ic_new_button-web.png b/app/src/main/ic_new_button-web.png new file mode 100644 index 0000000000000000000000000000000000000000..872cb0dbcfa2257fc42cd3248f81a2ba76c54a56 GIT binary patch literal 7507 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 START_WAKING_HOUR && curr_hour < STOP_WAKING_HOUR ) { + PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); + PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "mDedal:Alarm"); + wl.acquire(); + + Log.d("my_debug", "Alarm, start service !"); + + // wystartuj/obudz serwis + Intent service = new Intent(context, DedalService.class); + context.startService(service); + + wl.release(); + } + } + + public void SetAlarm(Context context) + { + AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); + Intent i = new Intent(context, Alarm.class); + PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_IMMUTABLE); + +// Resources res = getResources(); +// int values[] = res.getIntArray(R.array.pref_sync_frequency_values); + //int sleepTime =values[refreshPos]*1000; + + //long sleepTime = 1000L * 30L; // 5s + long sleepTime = 1000L * 3600L; // 1h + Log.d("my_debug", "setAlarm, sleepTime: "+sleepTime); + + am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + sleepTime, sleepTime, pi); // Millisec * Second * Minute + } + + public void CancelAlarm(Context context) + { + Intent intent = new Intent(context, Alarm.class); + PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE); + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + alarmManager.cancel(sender); + } + +} diff --git a/app/src/main/java/com/likesoft/mdedal/AsyncCallChangeDate.java b/app/src/main/java/com/likesoft/mdedal/AsyncCallChangeDate.java new file mode 100644 index 0000000..f7ac945 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/AsyncCallChangeDate.java @@ -0,0 +1,141 @@ +package com.likesoft.mdedal; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.AsyncTask; +import android.preference.PreferenceManager; +import android.widget.LinearLayout; +import android.widget.Toast; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** +* Created by darek on 2016-01-25. +*/ +abstract class AsyncCallChangeDate extends AsyncTask { + private Activity calendarActivity; + ProgressDialog progressDialog; + String response; + String id_zlecenia; + String kod_pola; + String wartosc; + LinearLayout movingEl; + + public AsyncCallChangeDate(Activity calendarActivity, String id_zlecenia, String kod_pola, String wartosc) { + this.calendarActivity = calendarActivity; + //this.progressDialog = new ProgressDialog(); + + this.id_zlecenia = id_zlecenia; + this.kod_pola = kod_pola; + this.wartosc = wartosc; + //this.progressDialog = new ProgressDialog(); + } + + @Override + protected Void doInBackground(String... params) { + android.util.Log.d("my_debug", "doInBackground"); + DedalHttpConnection con = new DedalHttpConnection(calendarActivity.getApplicationContext()); + Map params_post = new HashMap(); + params_post.put("id_zlecenia", id_zlecenia); + params_post.put("kod_pola", kod_pola); + params_post.put("wartosc", wartosc); + response = con.sendPost("public/ajax/zmien_wartosc_zlecenie_pole_stale.php", params_post); + return null; + } + + @Override + protected void onPostExecute(Void result) { + android.util.Log.d("my_debug", "onPostExecute"); + + //this.progressDialog.dismiss(); + Log.d("CalAct", "resp: "+response); + if( response != null && "true".equals(response) ) { + + JSONObject jZlecenie = null; + try { + + // read file + Context context = calendarActivity.getApplicationContext(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + String sJson = DedalHelper.getFileContent(dLista.getAbsolutePath()); + JSONObject jFile = new JSONObject(sJson); + + JSONObject jProfiles = jFile.getJSONObject("profile"); + Iterator keys = jProfiles.keys(); + while (keys.hasNext()) { + String id_profilu_curr = (String) keys.next(); + try { + JSONObject jProfil = jProfiles.getJSONObject(id_profilu_curr); +// if( !jProfil.has("zlecenia") || !"[]".equals(jProfil.getString("zlecenia")) ) { +// continue; +// } + JSONObject jZlecenia_local = jProfil.getJSONObject("zlecenia"); + if (!jZlecenia_local.has(id_zlecenia)) + continue; + + jZlecenie = jZlecenia_local.getJSONObject(id_zlecenia); + //change value + if (jZlecenie.has(kod_pola)) { + jZlecenie.put(kod_pola, wartosc); + Log.d("CalAct", "kod_pola: " + kod_pola + "wartosc: " + wartosc); + } + } + catch (JSONException e) { + Log.e("DEDAL", "onPostExecute", e); + } + } + + // save file + DedalHelper.putFileContent(prefs.getString("dir", "") + "/baza/lista.profil", jFile.toString()); +// Toast.makeText(CalendarActivity.this, "Uaktualniono poprawnie", +// Toast.LENGTH_LONG).show(); + + loadInputs(); +// movingEl.removeAllViews(); +// movingEl.addView(getZlecenieElement(jZlecenie, jKolumny)); + + + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + + } + else { + reloadContent(); + Toast.makeText(calendarActivity, "Wystąpił błąd podczas uaktulaniania, zmiany zostały cofnięte", + Toast.LENGTH_LONG).show(); + Log.d("CalAct", "Błąd przy połaćzeniu do zmien_wartosc_zlecenie_pole_stale.php"); + } + } + + protected abstract void reloadContent(); + + abstract public void loadInputs(); + + @Override + protected void onPreExecute() { + android.util.Log.d("my_debug", "onPreExecute"); + +// Toast.makeText(CalendarActivity.this, "Rozpoczynam uaktualnianie ...", +// Toast.LENGTH_LONG).show(); + } + + @Override + protected void onProgressUpdate(Void... values) { + android.util.Log.i("my_debug", "onProgressUpdate"); + } +} diff --git a/app/src/main/java/com/likesoft/mdedal/AutoStart.java b/app/src/main/java/com/likesoft/mdedal/AutoStart.java new file mode 100644 index 0000000..d689b94 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/AutoStart.java @@ -0,0 +1,19 @@ +package com.likesoft.mdedal; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class AutoStart extends BroadcastReceiver +{ + Alarm alarm = new Alarm(); + @Override + public void onReceive(Context context, Intent intent) + { + if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) + { + Log.d("my_debug", "Autostart"); + alarm.SetAlarm(context); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/likesoft/mdedal/CalendarActivity.java b/app/src/main/java/com/likesoft/mdedal/CalendarActivity.java new file mode 100644 index 0000000..5206b58 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/CalendarActivity.java @@ -0,0 +1,1400 @@ +package com.likesoft.mdedal; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ClipData; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.net.Uri; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.view.DragEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Button; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.TableLayout; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.Toast; + +import com.likesoft.mdedal.gui.BorderLinearLayout; +import com.likesoft.mdedal.gui.BorderTextView; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class CalendarActivity extends Activity { + protected Class getMainActivity() { + return MainActivity.class; + } + + private static final String DATA_KOD = "nast_wizyta_data"; + private static final String DATA_TYP_KOD = "nast_wizyta_typ"; + + private static String CALENDAR_TYPE = "tydzien"; // tydzien | miesiac + + private Calendar todayCalendar = null; + SharedPreferences prefs; + private String[] WEEK_NAMES; + private Map STATUS_COLORS = null; + private Map STATUS_NAMES = null; + private String[] STATUS_LEGEND_ORDER; + private String PROFILE_TYPE = "Kalendarz"; + + private LinearLayout lContent; + private String id_profilu = null; + private JSONObject jZlecenia = null; + private JSONArray jKolumny = null; + private JSONArray jSlady = null; + + + private int curr_page = 0; + private ArrayList columnsInRows; + + HorizontalScrollView lMainScroll=null; + ScrollView vertScroll = null; + private int mScrollDistance =0; + + public TextView tv_hour = null; + + RefreshLayoutAndThread rlat; + +// public interface OnScrollViewListener { +// public void onScrollChanged(OnScrollViewListener listener); +// } +// +// public class MyScrollView extends ScrollView { +// private OnScrollViewListener mListener; +// +// public MyScrollView(Context c) { +// super(c); +// } +// +// @Override +// protected void onScrollChanged(int l, int t, int oldl, int oldt) { +// super.onScrollChanged(l, t, oldl, oldt); +// if (mListener != null) { +// mListener.onScrollChanged((OnScrollViewListener) this); +// } +// } +// +// +// public void setOnScrollViewListener(OnScrollViewListener listener) { +// mListener = listener; +// } +// +// +// +// } + //private ArrayList rowsColumn; + @Override + protected void onCreate(Bundle savedInstanceState) { + + WEEK_NAMES = new String[7]; + WEEK_NAMES[0] = "Poniedziałek"; + WEEK_NAMES[1] = "Wtorek"; + WEEK_NAMES[2] = "Środa"; + WEEK_NAMES[3] = "Czwartek"; + WEEK_NAMES[4] = "Piątek"; + WEEK_NAMES[5] = "Sobota"; + WEEK_NAMES[6] = "Niedziela"; + + STATUS_COLORS = new HashMap(); + STATUS_COLORS.put("pierwsza_wizyta", "#FFFFFF"); + STATUS_COLORS.put("manitorowac_wplate", "#ADD8E6"); + STATUS_COLORS.put("gotowka", "#FF0000"); + STATUS_COLORS.put("ugoda", "#90EE90"); + STATUS_COLORS.put("nastepna_wizyta_negocjacje", "#ff9933"); + STATUS_COLORS.put("nastepna_wizyta", "YELLOW");//"#D3D3D3"); + STATUS_COLORS.put("pozostale", "#D3D3D3");//"#D3D3D3"); + STATUS_COLORS.put("slad", "#E6E6E6"); + + STATUS_NAMES = new HashMap(); + STATUS_NAMES.put("pierwsza_wizyta", "Pierwsza wizyta"); + STATUS_NAMES.put("manitorowac_wplate", "Monitoring wpłat"); + STATUS_NAMES.put("gotowka", "Pobiorę gotówkę"); + STATUS_NAMES.put("ugoda", "Podpiszę ugodę"); + STATUS_NAMES.put("nastepna_wizyta_negocjacje", "Negocjacje"); + STATUS_NAMES.put("nastepna_wizyta", "Wykonać następną wizytę");//Monitorować dokonane ustalenia z dłużnikiem"); + STATUS_NAMES.put("pozostale", "Pozostałe sprawy"); + STATUS_NAMES.put("slad", "Ślady"); + + STATUS_LEGEND_ORDER = new String[8]; + STATUS_LEGEND_ORDER[0] = "pierwsza_wizyta"; + STATUS_LEGEND_ORDER[1] = "manitorowac_wplate"; + STATUS_LEGEND_ORDER[2] = "gotowka"; + STATUS_LEGEND_ORDER[3] = "ugoda"; + STATUS_LEGEND_ORDER[4] = "nastepna_wizyta_negocjacje"; + STATUS_LEGEND_ORDER[5] = "nastepna_wizyta"; + STATUS_LEGEND_ORDER[6] = "pozostale"; + STATUS_LEGEND_ORDER[7] = "slad"; + + + + super.onCreate(savedInstanceState); + Context context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + + loadJsons(); + + if( id_profilu == null ) { + Log.d("CalAct", "Brak id_profilu"); + return; + } + + if( jKolumny == null || jZlecenia == null ) { + return; + } + + //todayCalendar = new GregorianCalendar(2016,0,18,0,0,1); + todayCalendar = new GregorianCalendar(); + + + +// LinearLayout llAllWrapper = new LinearLayout(this); +// llAllWrapper.setOrientation(LinearLayout.VERTICAL); +// setContentView(llAllWrapper); + + LinearLayout lMain = new LinearLayout(this); + lMain.setOrientation(LinearLayout.VERTICAL); + //lMain.setPadding(50, 15, 15, 15); + setContentView(lMain); + + lMainScroll = new HorizontalScrollView(this); + vertScroll = new ScrollView(this); +// vertScroll.setOnScrollViewListener(new CalendarActivity.OnScrollViewListener() { +// +// public void onScrollChanged(CalendarActivity.OnScrollViewListener listener) { +// mScrollDistance = listener.getScrollY(); +// } +// }); + + lMain.setOnDragListener(new AllDragListener()); + + lMainScroll.addView(vertScroll); + //vertScroll.addView(lMain); + + LinearLayout lHeader = new LinearLayout(this); + lHeader.setOrientation(LinearLayout.VERTICAL); + lContent = new LinearLayout(this); + lContent.setOrientation(LinearLayout.VERTICAL); + + LinearLayout lContentWrapper = new LinearLayout(this); + lContentWrapper.setOrientation(LinearLayout.VERTICAL); + lContentWrapper.addView(lContent); + + + vertScroll.addView(lContentWrapper); + LinearLayout lFooter = new LinearLayout(this); + lFooter.setOrientation(LinearLayout.VERTICAL); + lContentWrapper.addView(lFooter); + + HorizontalScrollView lHeaderScroll = new HorizontalScrollView(this); + lHeaderScroll.addView(lHeader); + + lHeaderScroll.setPadding(50,10,10,10); + lContentWrapper.setPadding(50,10,10,10); + //lFooter.setPadding(50,10,10,10); + + + + lMain.addView(lHeaderScroll); + lMain.addView(lMainScroll); + //lMain.addView(lFooter); + +// lMain.addView(lHeader); +// lMain.addView(lContent); +// lMain.addView(lFooter); + + + // lMain + + drawHeader(lHeader); + drawContent(); + drawFooter(lFooter); + } + + protected void onDestroy() { + // TODO Auto-generated method stub + super.onDestroy(); + + rlat.interrupt(); + + // destroy variables + Calendar todayCalendar = null; + + WEEK_NAMES = null; + STATUS_COLORS = null; + STATUS_NAMES = null; + STATUS_LEGEND_ORDER = null; + + lContent = null; + id_profilu = null; + jZlecenia = null; + jKolumny = null; + jSlady = null; + + columnsInRows = null; + + lMainScroll=null; + vertScroll = null; + + tv_hour = null; + + Log.d("CalAct", "ondestroy"); + //onDestroyD(this); + } + + + //todo: refaktor do jednej wspolnej funkcji: + private boolean sprawdz_czy_sa_stare_wizyty(String cur_id) { + boolean ret = false; + //sprawdzić, czy istnieją przeterm + // inowane wizyty + String id = ""; + try { + // JSONObject jZlecenia= jZlecenia; //new JSONObject(jProfil.getString("zlecenia")); //roznica !!!! + Iterator keys = jZlecenia.keys(); + while (keys.hasNext()) { + + id = (String) keys.next(); + JSONObject jZlecenie = jZlecenia.getJSONObject(id); + + String status = jZlecenie.getString("status"); + String nast_wizyta_typ = jZlecenie.getString("nast_wizyta_typ"); + //przydz_odeb + if( "przydz_odeb".equals(status)){ + //nastepna_wizyta + //ugoda + //gotowka + if( "nastepna_wizyta".equals(nast_wizyta_typ) + || "ugoda".equals(nast_wizyta_typ) + || "gotowka".equals(nast_wizyta_typ)){ + //aM.add(jZlecenie);// + String nast_wizyta_data = jZlecenie.getString("nast_wizyta_data"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Calendar cToday = new GregorianCalendar(); + String cString = sdf.format(cToday.getTime()); + if( cString.compareTo(nast_wizyta_data)>0){ + String id_zlecenia = ""+id;// + ".json"; //zmiana !!! + + if( id_zlecenia.equals(cur_id)){ //names.get(cur_id))){ + // można biezace edytować + ret = false; + break; + } + //return; + ret = true; + //break; + } + } + } + } + if( ret){ + AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); + alertDialog.setTitle( "Uwaga");//res.getString(R.string.zakanczanie_wizyty) ); + alertDialog.setMessage("Posiadasz nieprzerobione stare wizyty. Zaplanuj sprawy na kolejne dni
id zlecenia: " + id); + alertDialog.setPositiveButton("Anuluj", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + //mod_json_files(false); + dialog.dismiss(); + } + }); + alertDialog.show(); + } + + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + return ret; + } + + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_calendar, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + //noinspection SimplifiableIfStatement + if (id == R.id.action_settings) { + return true; + } + + return super.onOptionsItemSelected(item); + } + + // SET COLUMNS HEIGHT +// @Override +// public void onWindowFocusChanged(boolean hasFocus) { +// // TODO Auto-generated method stub +// super.onWindowFocusChanged(hasFocus); +// +// setColumnsHeight(); +// } + + @Override + protected void onResume() { + super.onResume(); + Log.d("CalAct", "onresume"); + drawContent(); + } + + private void loadJsons() { + try { + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + String sJson = DedalHelper.getFileContent(dLista.getAbsolutePath()); + JSONObject jFile = new JSONObject(sJson); + + JSONObject jProfiles = jFile.getJSONObject("profile"); + if( id_profilu == null ) { + id_profilu = getIdProfiluByType(jProfiles, PROFILE_TYPE); + } + if( id_profilu == null ) { + Bundle extras = getIntent().getExtras(); + if (extras != null) { + id_profilu = extras.getString("id_profilu"); + } + } + + JSONObject jProfil = jProfiles.getJSONObject(id_profilu); + jKolumny = jProfil.getJSONArray("profil_kolumny"); + jZlecenia = jProfil.getJSONObject("zlecenia"); + if( jFile.has("slady_interwencji_zlecen") ) { + jSlady = jFile.getJSONArray("slady_interwencji_zlecen"); + } + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + } + + private String getIdProfiluByType(JSONObject jProfiles, String calendar_type) { + String id_profilu = null; + try { + Iterator keys = jProfiles.keys(); + while (keys.hasNext()) { + String id_profilu_temp = (String) keys.next(); + JSONObject jProfil = jProfiles.getJSONObject(id_profilu_temp); + Log.d("CalAct", "id_profilu_temp: " + id_profilu_temp+", jProfil.getString(typ_profilu)"+jProfil.getString("typ_profilu")+", calendar_type: "+calendar_type); + if( jProfil.has("typ_profilu") && calendar_type.equals(jProfil.getString("typ_profilu")) ) { + id_profilu = id_profilu_temp; + break; + } + } + } + catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + return id_profilu; + } + + private void setColumnsHeight() { + + + if( columnsInRows == null || columnsInRows.size() == 0 ) { + return; + } + for( int i = 0 ; i < columnsInRows.size() ; i++ ) { + // get maximum height of exist columns + ColumnLinearLayout[] columnsInRow = columnsInRows.get(i); + int max_height = 0; + for (int j = 0; j < 7; j++) { + ColumnLinearLayout llcolumn = columnsInRow[j]; + int height = llcolumn.getColumnHeight(); + //Log.d("CalAct", "height: "+height+", max_height: "+max_height); + if ( height > max_height) { + max_height = height; + } + } + + if( max_height < 50 ) { + max_height = 50; + } + //Log.d("CalAct", "max_height: "+max_height); + // set height + for (int j = 0; j < 7; j++) { + View llcolumn = columnsInRow[j]; + + + llcolumn.setMinimumHeight(max_height); + llcolumn.setMinimumWidth(200); +// LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT); +// llcolumn.setLayoutParams(params); + } + } + } + + private void drawHeader(LinearLayout lHeader) { + lHeader.setPadding(0, 0, 0, 20); + // WYBÓR TYDZIEN / MIESIAC + LinearLayout lchangeType = new LinearLayout(this); + lHeader.addView(lchangeType); + + Button bTydzien = new Button(this); + lchangeType.addView(bTydzien); + bTydzien.setText("Tygodniowy"); + bTydzien.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + CALENDAR_TYPE = "tydzien"; + drawContent(); + } + }); + Button bMiesiac= new Button(this); + lchangeType.addView(bMiesiac); + bMiesiac.setText("Miesięczny"); + bMiesiac.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + CALENDAR_TYPE = "miesiac"; + drawContent(); + } + }); + + // separate + TextView tv = new TextView(this); + tv.setText(" | "); + lchangeType.addView(tv); + + // PAGOWANIE + Button bPrev = new Button(this); + lchangeType.addView(bPrev); + bPrev.setText("Poprzednia"); + bPrev.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + curr_page--; + drawContent(); + } + }); + Button bNext = new Button(this); + lchangeType.addView(bNext); + bNext.setText("Następna"); + bNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + curr_page++; + drawContent(); + } + }); + + // GODZINA PODCZAS PRZESOWANIA + tv_hour = new TextView(this); + tv_hour.setPadding(5,0,0,10); + lchangeType.addView(tv_hour); + + // REFRESH BUTTON + rlat = new RefreshLayoutAndThread(this) { + @Override + protected void whenThreadNeedToReaoad() { + loadJsons(); + drawContent(); + } + + @Override + protected void setLastGPSInfo_abstr() { + + } + }; + LinearLayout refreshLayout = rlat.getRefreshLayout(); + refreshLayout.setPadding(10, 0, 0, 0); + lchangeType.addView(refreshLayout); + TextView textUpload = rlat.getTextUpload(); + lchangeType.addView(textUpload); + rlat.setLastUpdateInfo(); + rlat.start(); + + + // NAGŁÓWKI + LinearLayout lnaglowki = new LinearLayout(this); + lHeader.addView(lnaglowki); + TextView tnaglowki = new TextView(this); + lnaglowki.addView(tnaglowki); + String snaglowki = ""; + for( int i = 0 ; i < jKolumny.length() ; i++ ) { + try { + if( i > 0 ) { + snaglowki += " | "; + } + JSONObject jKolumna = jKolumny.getJSONObject(i); + if(jKolumna.has("nazwa")) { + snaglowki += jKolumna.getString("nazwa"); + } + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + } + tnaglowki.setText(snaglowki); + } + + private void drawFooter(LinearLayout lFooter) { + TextView tlegend_title = new TextView(this); + tlegend_title.setText("Legenda"); + lFooter.addView(tlegend_title); + lFooter.setPadding(0,20,0,0); + + LinearLayout llegend = new LinearLayout(this); + lFooter.addView(llegend); + Log.d("CalAct", "drawFooter"); + for (int i = 0 ; i < STATUS_LEGEND_ORDER.length ; i++){ + + String status = STATUS_LEGEND_ORDER[i]; + String status_name = STATUS_NAMES.get(STATUS_LEGEND_ORDER[i]); + Log.d("CalAct", "status: "+status+", status_name: "+status_name); + BorderTextView btw = new BorderTextView(this); + llegend.addView(btw); + btw.setText(status_name); + btw.setPadding(10, 10, 10, 10); + if( STATUS_COLORS.get(status) != null ) { + btw.setBackgroundColor(Color.parseColor(STATUS_COLORS.get(status))); + }else{ + btw.setBackgroundColor(Color.parseColor(STATUS_COLORS.get("pozostale"))); + } + } + } + + private void drawContent() { + Log.d("CalAct", "drawContent"); + //(new Exception()).printStackTrace(); + columnsInRows = new ArrayList(); + + lContent.removeAllViews(); + + GregorianCalendar cDate = (GregorianCalendar)todayCalendar.clone(); + if( curr_page != 0 ) { + cDate.add(Calendar.DATE, curr_page * 7); +// if( "tydzien".equals(CALENDAR_TYPE) ) { +// cDate.add(Calendar.DATE, curr_page * 7); +// } +// else if ( "miesiac".equals(CALENDAR_TYPE) ) { +// cDate.add(Calendar.MONTH, curr_page); +// } + + } + ArrayList week_package = new ArrayList(); + if( "tydzien".equals(CALENDAR_TYPE) ) { +// String[] week_day_dates = getWeekDayDates(cDate); +// week_package.add(week_day_dates); + //week_package = getWeeksWeeks(); + week_package = getWeeksForTable(cDate, 0, 1); + } + else if ( "miesiac".equals(CALENDAR_TYPE) ) { + //week_package = getMonthWeeks(cDate); + week_package = getWeeksForTable(cDate, 1, 3); + } + + TableLayout tL = new TableLayout(this); + lContent.addView(tL); + // tL.setStretchAllColumns(false); + + + for( int i = 0 ; i < week_package.size() ; i++ ) { + drawOneWeekTable(week_package.get(i), tL); + } + + lContent.post(new Runnable() { + @Override + public void run() { + setColumnsHeight(); + } + }); + } + + private void drawOneWeekTable(String[] week_day_dates, TableLayout tL) { + + String[] tab_kolumuny_nazwy = new String[7]; + for( int i = 0 ; i < week_day_dates.length ; i++ ) { + tab_kolumuny_nazwy[i] = WEEK_NAMES[i] + "\n" + week_day_dates[i]; + } + + + TableRow tRHead = new TableRow(this); + + tL.addView(tRHead); + tRHead.setBackgroundColor(Color.LTGRAY); + for( int i = 0 ; i < tab_kolumuny_nazwy.length ; i++ ) { + TextView tV = new TextView(this); + tV.setText(tab_kolumuny_nazwy[i]); + tRHead.addView(tV); + } + + // CONTENT + TableRow tRContent = new TableRow(this); + tL.addView(tRContent); + SimpleDateFormat sdf_full = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String cTodayString = sdf.format(todayCalendar.getTime()); + ColumnLinearLayout[] columnsInRow = new ColumnLinearLayout[7]; + columnsInRows.add(columnsInRow); + for( int i = 0 ; i < tab_kolumuny_nazwy.length ; i++ ) { + ColumnLinearLayout llColumn = new ColumnLinearLayout(this, Color.parseColor("#CC7000")); + + //llColumn.setLayoutParams(new LinearLayout.LayoutParams(200, LinearLayout.LayoutParams.WRAP_CONTENT));//TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); + + + columnsInRow[i] = llColumn; + llColumn.setOrientation(LinearLayout.VERTICAL); + //llColumn.setMinimumHeight(50); + + llColumn.setOnDragListener(new MyDragColumnListener()); + + llColumn.setDate(week_day_dates[i]); + tRContent.addView(llColumn); + + boolean is_today = false; + if( cTodayString.equals(week_day_dates[i]) ) { + is_today = true; + } + + ArrayList> sortedKeys = getSortedKeysFromJZlecenia(jZlecenia, jSlady); + + //Iterator keys = jZlecenia.keys(); + //while (keys.hasNext()) { + for( int j = 0 ; j < sortedKeys.size() ; j++ ) { + try { + HashMap temp = sortedKeys.get(j); + + String id_zlecenia = temp.get("id_zlecenia"); //(String) keys.next(); + String typ = temp.get("typ"); + if( "zlecenie".equals(typ) ) { + //Log.d("my_debug", "kalendarz, id_zlecenia: "+id_zlecenia); + if (!jZlecenia.has(id_zlecenia)) { + continue; + } + JSONObject jZlecenie = jZlecenia.getJSONObject(id_zlecenia); + + boolean show_zlecenie = false; + String zl_data_typ = jZlecenie.getString(DATA_TYP_KOD); + String zl_data = jZlecenie.getString(DATA_KOD); + if (zl_data == null || "".equals(zl_data) || "null".equals(zl_data)) { // jZlecenie.getString(DATA_KOD) == "null" ) { +// if( is_today ) { +// show_zlecenie = true; +// } + } else { + if (!"odmowa".equals(zl_data_typ)) { + Calendar cal = Calendar.getInstance(); + cal.setTime(sdf_full.parse(zl_data));// all done + if (week_day_dates[i].equals(sdf.format(cal.getTime()))) { + show_zlecenie = true; + } + } + } + + if (show_zlecenie) { + LinearLayout zl_wrapper = new LinearLayout(this); + zl_wrapper.setOrientation(LinearLayout.VERTICAL); + zl_wrapper.setId(Integer.parseInt(id_zlecenia)); + zl_wrapper.setOnTouchListener(new MyTouchListener()); + llColumn.addView(zl_wrapper); + + LinearLayout zl = getZlecenieElement(jZlecenie, jKolumny); + zl_wrapper.addView(zl); + zl_wrapper.setLayoutParams(new LinearLayout.LayoutParams(200, LinearLayout.LayoutParams.WRAP_CONTENT));//TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); + } + } + else if( "slad".equals(typ) ) { + boolean show_zlecenie = false; + + String data = temp.get("data"); + Calendar cal = Calendar.getInstance(); + cal.setTime(sdf_full.parse(data));// all done + if (week_day_dates[i].equals(sdf.format(cal.getTime()))) { + //if (week_day_dates[i].equals(temp.get("data")) ) { + show_zlecenie = true; + + if (show_zlecenie) { + LinearLayout zl_wrapper = new LinearLayout(this); + zl_wrapper.setOrientation(LinearLayout.VERTICAL); + zl_wrapper.setId(Integer.parseInt(id_zlecenia)); + zl_wrapper.setOnTouchListener(new MyTouchListener()); + llColumn.addView(zl_wrapper); + + //LinearLayout zl = new LinearLayout(this); + LinearLayout zl = getSladElement(id_zlecenia, temp.get("nr_sprawy")); + zl_wrapper.addView(zl); + zl_wrapper.setLayoutParams(new LinearLayout.LayoutParams(200, LinearLayout.LayoutParams.WRAP_CONTENT)); + } + } + } + + } catch (JSONException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + } + } + + } + + private ArrayList getSortedKeysFromJZlecenia(JSONObject jZlecenia, JSONArray jSlady) { + //ArrayList forSortKeys = new ArrayList(); + ArrayList> forSortKeys = new ArrayList>(); + Iterator keys = jZlecenia.keys(); + + // create ArrayList which object to sort + while (keys.hasNext()) { + try { + HashMap temp = new HashMap(); + String id_zlecenia = (String) keys.next(); + JSONObject jZlecenie = jZlecenia.getJSONObject(id_zlecenia); + String dateNextWiz = "0000-00-00 00:00:00"; + if( jZlecenie.has(DATA_KOD) && !"".equals(jZlecenie.getString(DATA_KOD)) && !"null".equals(jZlecenie.getString(DATA_KOD)) ) { + dateNextWiz = jZlecenie.getString(DATA_KOD); + if ( dateNextWiz.indexOf(":") < 0 ) { // jesli nie występuje ":" to znaczy że nie ma godziny i trzeba dopisać zera aby dobrze porównywało + dateNextWiz += " 00:00:00"; + } + } + String keyForSort = dateNextWiz+"_"+id_zlecenia; + temp.put("key_for_sort", keyForSort); + temp.put("typ", "zlecenie"); + forSortKeys.add(temp); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + if( jSlady != null ) { + for (int i = 0; i < jSlady.length(); i++) { + try { + JSONObject obj = jSlady.getJSONObject(i); + HashMap temp = new HashMap(); + temp.put("key_for_sort", obj.getString("data") + "_" + obj.getString("id_zlecenia")); + temp.put("typ", "slad"); + temp.put("nr_sprawy", obj.getString("nr_sprawy")); + temp.put("data", obj.getString("data")); + forSortKeys.add(temp); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + + // sorting + Collections.sort(forSortKeys, new Comparator>() { + @Override + public int compare(HashMap left, HashMap right) { + return left.get("key_for_sort").compareTo(right.get("key_for_sort")); + } + }); + + ArrayList> sorted_id_zlecen = new ArrayList>(); + // remove date from sorted object. Just id_zlecenia is needed + for( int i = 0 ; i < forSortKeys.size() ; i++ ) { + HashMap temp = forSortKeys.get(i); + String keyForSort = temp.get("key_for_sort"); + String[] parts = keyForSort.split("_"); + if( parts.length > 1 ) { + //sorted_id_zlecen.add(parts[1]); + HashMap temp2 = new HashMap(); + temp2.put("id_zlecenia", parts[1]); + temp2.put("nr_sprawy", temp.get("nr_sprawy")); + temp2.put("typ", temp.get("typ")); + if( temp.get("data") != null ) { + temp2.put("data", temp.get("data")); + } + sorted_id_zlecen.add(temp2); + } + + //sortedKeys.get(i) = parts[0] + //sortedKeys.add(i, parts[0]); + } + + return sorted_id_zlecen; + } + + private LinearLayout getZlecenieElement(JSONObject jZlecenie, JSONArray jKolumny) { + BorderLinearLayout zl = new BorderLinearLayout(this); + + zl.setOrientation(LinearLayout.VERTICAL); + + String id_zlecenia = ""; + try { + id_zlecenia = jZlecenie.getString("id_zlecenia"); + + } catch (JSONException e) { + e.printStackTrace(); + } + + boolean first = true; + String contentText = ""; + for( int i = 0 ; i < jKolumny.length() ; i++ ) { + try { + JSONObject jkolumna = jKolumny.getJSONObject(i); + String kod = jkolumna.getString("kod"); + String nazwa = jkolumna.getString("nazwa"); + + contentText += DedalHelper.getValueFromKod(kod, jZlecenie); + + if( ( i % 3 == 2 ) || i == jKolumny.length() - 1 ) { + LinearLayout row = new LinearLayout(this); + row.setPadding(5,1,5,1); + zl.addView(row); + TextView tv = new TextView(this); + tv.setText(contentText); + tv.setTextAppearance(this, R.style.OpisTextLista); + contentText = ""; + row.addView(tv); + if(first) { + row.setOnClickListener(new OnclickStartMainActivity(id_zlecenia)); + first = false; + } + } + else { + contentText += " | "; + } + + + +// if( i > 0 ) { +// contentText += " | "; +// if (i % 3 == 0) { +// contentText += "\n"; +// } +// } + + } catch (JSONException e) { + e.printStackTrace(); + } + } + + // get typ and set color + + String zlecenieColor = getZlecenieColor(jZlecenie); + zl.setBackgroundColor(Color.parseColor(zlecenieColor)); + + //zl.setText(contentText); + return zl; + } + + private LinearLayout getSladElement(String id_zlecenia, String nr_sprawy) { + BorderLinearLayout zl = new BorderLinearLayout(this); + zl.setOrientation(LinearLayout.VERTICAL); + zl.setPadding(10,5,10,5); + + TextView tv = new TextView(this); + tv.setText(nr_sprawy); + tv.setTextColor(Color.DKGRAY); + tv.setTextAppearance(this, R.style.OpisTextLista); + + zl.setOnClickListener(new OnclickStartMainActivity(id_zlecenia)); + zl.addView(tv); + zl.setBackgroundColor(Color.parseColor(STATUS_COLORS.get("slad"))); + return zl; + } + + private String getZlecenieColor(JSONObject jZlecenie) { + String color = "#000000"; + if( jZlecenie.has(DATA_TYP_KOD) ) { + try { + String status = jZlecenie.getString(DATA_TYP_KOD); + if( status == null || "null".equals(status) || "".equals(status) ) { + status = "pierwsza_wizyta"; + } + if( STATUS_COLORS.get(status) != null ) { + //zl.setBackgroundColor(Color.parseColor(STATUS_COLORS.get(status))); + color = STATUS_COLORS.get(status); + }else{ + //zl.setBackgroundColor(Color.parseColor(STATUS_COLORS.get("pozostale"))); + color = STATUS_COLORS.get("pozostale"); + } + if( jZlecenie.has("status")) { + String status_zlecenia = jZlecenie.getString("status"); + if( !status_zlecenia.equals("przydz_odeb") && !status_zlecenia.equals("przydz_nie_odeb") && !status_zlecenia.equals("wykonane") ){ + //zl.setBackgroundColor(Color.parseColor(STATUS_COLORS.get("pozostale"))); + color = STATUS_COLORS.get("pozostale"); + } + } + + } catch (JSONException e) { + e.printStackTrace(); + } + } + return color; + } + + private String[] getWeekDayDates(Calendar c_date) { + String[] week_day_dates = new String[7]; + + int week_day = c_date.get(Calendar.DAY_OF_WEEK); //1 - niedziela, 2 - poniedziałek, ... + week_day = week_day - 1; //0 - niedziela, 1 - poniedziałek, ... + Log.d("my_debug", "week_day: "+week_day); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + for ( int i = 0 ; i < 7 ; i++ ) { + Calendar c_date_now = (Calendar)c_date.clone(); + int ip = i + 1; + int diff_days = ip - week_day; + c_date_now.add(Calendar.DATE, diff_days); + + week_day_dates[i] = sdf.format(c_date_now.getTime()); + } + + return week_day_dates; + } + + private ArrayList getWeeksForTable(GregorianCalendar c_date, int NUM_PREV_WEEKS, int NUM_NEXT_WEEKS) { + ArrayList week_package = new ArrayList(); + +// int NUM_PREV_WEEKS = 1; +// int NUM_NEXT_WEEKS = 3; + + GregorianCalendar d = (GregorianCalendar)c_date.clone(); + d.add(Calendar.DATE, -7 * NUM_PREV_WEEKS); + for( int i = 0 ; i < NUM_PREV_WEEKS + NUM_NEXT_WEEKS + 1 ; i++ ) { + String[] array_week_dates = getWeekDayDates(d); + week_package.add(i, array_week_dates); + d.add(Calendar.DATE, 7); + } + + + ///////////////// +// int curr_month = c_date.get(Calendar.MONTH); +// int curr_year = c_date.get(Calendar.YEAR); +// +// GregorianCalendar d = new GregorianCalendar(curr_year, curr_month, 1); +// +// for( int i = 0 ; i < 6 ; i++ ) { +// +// try { +// String[] array_week_dates = getWeekDayDates(d); +// +// GregorianCalendar first = new GregorianCalendar(); +// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); +// first.setTime(sdf.parse(array_week_dates[0])); +// +// GregorianCalendar last = new GregorianCalendar(); +// last.setTime(sdf.parse(array_week_dates[array_week_dates.length - 1])); +// +// if ( i > 0 && first.get(Calendar.MONTH) != curr_month && last.get(Calendar.MONTH) != curr_month ) { +// break; +// } +// Log.d("CalAct", "getMonthWeeks, "+array_week_dates[0]); +// week_package.add(i, array_week_dates); +// d.add(Calendar.DATE, 7); +// +// } catch (ParseException e) { +// e.printStackTrace(); +// } +// } + + return week_package; + } + + private final class MyTouchListener implements View.OnTouchListener { + + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + ClipData data = ClipData.newPlainText("", ""); + View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); + view.startDrag(data, shadowBuilder, view, 0); + rlat.pauseThread = true; + + return true; + } else { + return false; + } + } + } + + class MyDragColumnListener implements View.OnDragListener { + + public MyDragColumnListener() { + + } + + private String ConvertPosToHour(int y, int max_height) { + int MIN_HOUR = 7; + int MAX_HOUR = 19; + + int hours_mins = (MAX_HOUR - MIN_HOUR) * 60; + + String godzina = null; + float proc = 0; + if( max_height > 0 ) { + proc = (float)y / max_height; + int mins_from_start = (int)(hours_mins * proc); + int hours_from_start = mins_from_start / 60; + + int mins = mins_from_start - hours_from_start * 60; + int hour = MIN_HOUR + hours_from_start; + + godzina = String.format("%02d", hour) + ":" + String.format("%02d", mins) ; + + //Log.d("CalAct", "mins_from_start: " + mins_from_start); + + } + //Log.d("CalAct", "Godzina, y: " + y + ", max_height: " + max_height+", proc: "+proc); + + //godzina = proc+""; + return godzina; + } + + @Override + public boolean onDrag(View onDropEl, DragEvent event) { + int action = event.getAction(); + try { + LinearLayout movingEl = (LinearLayout) event.getLocalState(); + ColumnLinearLayout onDropEl_ = (ColumnLinearLayout) onDropEl; + ColumnLinearLayout fromDragEl = (ColumnLinearLayout) movingEl.getParent(); + + int id_moving = movingEl.getId(); // id_moving to id_zlecenia + String date_from = fromDragEl.getDate(); + String id_drop = onDropEl_.getDate(); + String date_drop = onDropEl_.getDate(); + + //View dropZoneView = onDropEl; + + int max_height = onDropEl_.getHeight(); + int y = 0; + double proc = 0; + String godzina = null; + switch (event.getAction()) { + case DragEvent.ACTION_DRAG_STARTED: + // do nothing + break; + case DragEvent.ACTION_DRAG_ENTERED: + //onDropEl.setBackgroundColor(color_entered); + break; + case DragEvent.ACTION_DRAG_EXITED: + //onDropEl.setBackgroundColor(color_exited); + break; + case DragEvent.ACTION_DROP: + String id_zlecenia = id_moving + ""; + String status_wizyty_zlecenia = ""; + String status_zlecenia = ""; + + try { + JSONObject jZlecenie = jZlecenia.getJSONObject(id_zlecenia); + status_zlecenia = jZlecenie.getString("status"); + status_wizyty_zlecenia = jZlecenie.getString(DATA_TYP_KOD); + } catch (JSONException e) { + e.printStackTrace(); + } + + + y = Math.round(onDropEl.getY())+Math.round(event.getY()); + godzina = ConvertPosToHour(y, max_height); + tv_hour.setText(""); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String cTodayString = sdf.format(todayCalendar.getTime()); + //is dropable + + String date_drop_no_hour = date_drop; + if( godzina != null ) { + date_drop = date_drop +" " + godzina + ":00"; + } + + JSONObject jZlecenie = null; + String data_obslugi = null; + try { + + if (jZlecenia.has(id_zlecenia)) { + jZlecenie = jZlecenia.getJSONObject(id_zlecenia); + data_obslugi = jZlecenie.getString("data_obslugi"); + } + } catch (JSONException e) { + e.printStackTrace(); + } + + + boolean can_drop = true; + String date_drop_no_time = DedalHelper.datetime2date(date_drop); + + String wrong_status_message = "Zlecenie NIE zostało przeniesione. Nie można przenosić zleceń które mają status inny niż 'Pierwsza wizyta' oraz 'Wykonać następną wizytę'"; + if( !date_from.equals(date_drop_no_time) ) { + if (!"null".equals(status_wizyty_zlecenia) && !"".equals(status_wizyty_zlecenia) && !"pierwsza_wizyta".equals(status_wizyty_zlecenia) && !"nastepna_wizyta".equals(status_wizyty_zlecenia)) { + Toast.makeText(CalendarActivity.this, wrong_status_message, + Toast.LENGTH_LONG).show(); + can_drop = false; + } else if (jZlecenie.has("status") + && !status_zlecenia.equals("przydz_odeb") && !status_zlecenia.equals("przydz_nie_odeb") && !status_zlecenia.equals("wykonane")) { + Toast.makeText(CalendarActivity.this, wrong_status_message, + Toast.LENGTH_LONG).show(); + can_drop = false; + } + else if (cTodayString.compareTo(date_drop_no_hour) > 0) { + Toast.makeText(CalendarActivity.this, "Zlecenie NIE zostało przeniesione. Nie można przenosić zleceń na datę wsteczną", + Toast.LENGTH_LONG).show(); + can_drop = false; + } else if (data_obslugi != null && date_drop.compareTo(data_obslugi) > 0) { + Toast.makeText(CalendarActivity.this, "Zlecenie NIE zostało przeniesione. Nie można przenosić zleceń na datę przekraczającą datę obsługi: " + data_obslugi, + Toast.LENGTH_LONG).show(); + can_drop = false; + } + } + + if( can_drop ) { + //////////////MODYFIKOWANIE OBIEKTU JZLECENIA///////////////////// + try { + if ( jZlecenia.has(id_zlecenia) ) { + //change value + if (jZlecenie.has(DATA_KOD)) { + jZlecenie.put(DATA_KOD, date_drop); + //Log.d("CalAct", "kod_pola: " + kod_pola + "wartosc: " + wartosc); + } + } + } catch (JSONException e) { + e.printStackTrace(); + } + ////////////////////////////////// + + drawContent(); + + // set height + lContent.post(new Runnable() { + @Override + public void run() { + setColumnsHeight(); + } + }); + + + //run update to server + AsyncCallChangeDate task = new AsyncCallChangeDate(CalendarActivity.this, id_moving + "", DATA_KOD, date_drop) { + @Override + protected void reloadContent() { + //Log.d("CalAct", "reloadContent"); + + loadJsons(); + drawContent(); + } + + @Override + public void loadInputs() { + loadJsons(); + } + }; // week_day_dates[id_drop]); + task.execute(); + + rlat.pauseThread = false; + } + //} + break; + case DragEvent.ACTION_DRAG_ENDED: + //v.setBackgroundDrawable(normalShape); + break; + case DragEvent.ACTION_DRAG_LOCATION: + y = Math.round(onDropEl.getY())+Math.round(event.getY()); + godzina = ConvertPosToHour(y, max_height); + //dragging_view.setBackgroundColor(Color.RED); + tv_hour.setText("Ustaw na godzinę: " + godzina); + //Log.d("CalAct", "Godzina: "+godzina); + return false; + + // break; + default: + break; + } + } catch (NullPointerException e) { + e.printStackTrace(); + } + return true; + + } + } + + class AllDragListener implements View.OnDragListener { + + public AllDragListener() { + + } + + @Override + public boolean onDrag(View onDropEl, DragEvent event) throws NullPointerException{ + int action = event.getAction(); + + View dropZoneView = onDropEl; + + switch (event.getAction()) { + case DragEvent.ACTION_DRAG_STARTED: + // do nothing + break; + case DragEvent.ACTION_DRAG_ENTERED: + //onDropEl.setBackgroundColor(color_entered); + break; + case DragEvent.ACTION_DRAG_EXITED: + //onDropEl.setBackgroundColor(color_exited); + break; + case DragEvent.ACTION_DROP: + rlat.pauseThread = false; + break; + case DragEvent.ACTION_DRAG_ENDED: + //v.setBackgroundDrawable(normalShape); + break; + case DragEvent.ACTION_DRAG_LOCATION: + + // ScrollView mainScrollView = vertScroll;//(ScrollView) findViewById(R.id.main_scroll); +// +// int topOfDropZone = dropZoneView.getTop(); +// int bottomOfDropZone = dropZoneView.getBottom(); +// +// int scrollY = Math.round(event.getY());// mainScrollView.getScrollY(); +// int scrollViewHeight = mainScrollView.getMeasuredHeight(); +// +// Log.d("my_debug","location: Scroll Y: "+ scrollY + " Scroll Y+Height: "+(scrollY + scrollViewHeight)); +// Log.d("my_debug"," top: "+ topOfDropZone +" bottom: "+bottomOfDropZone); +// +// +// if (scrollY>350){ //(bottomOfDropZone > (scrollY + scrollViewHeight - 100)) { +// Log.d("my_debug"," do dolu skroluj bottomOfDropZone: "+ bottomOfDropZone); +// mainScrollView.smoothScrollBy(0, 30); +// } +// +// if (scrollY<100){ //(topOfDropZone < (scrollY + 100)){ +// Log.d("my_debug"," do gory skroluj topOfDropZone: "+ topOfDropZone); +// mainScrollView.smoothScrollBy(0, -30); +// } + + //int y = Math.round(event.getY()); + int y = Math.round(onDropEl.getY())+Math.round(event.getY()); + + mScrollDistance = vertScroll.getScrollY(); + int translatedY = y - mScrollDistance; +// Log.d("my_debug"," translatedY: "+ y); + int threshold = 50; + // make a scrolling up due the y has passed the threshold + if (translatedY < threshold) { + // make a scroll up by 30 px +// Log.d("my_debug"," do gory skroluj translatedY: "+ translatedY); +// Log.d("my_debug"," Y: "+ y); +// Log.d("my_debug"," mScrollDistance: "+ mScrollDistance); + vertScroll.scrollBy(0, -30); + } + // make a autoscrolling down due y has passed the 500 px border + if (translatedY + threshold > 500) { + // make a scroll down by 30 px +// Log.d("my_debug"," do dolu skroluj translatedY: "+ translatedY); +// Log.d("my_debug"," Y: "+ y); +// Log.d("my_debug"," mScrollDistance: "+ mScrollDistance); + vertScroll.scrollBy(0, 30); + } + + + break; + default: + break; + } + return true; + } + + } + + private class ColumnLinearLayout extends BorderLinearLayout { + + private String date = null; + //private Integer rowId = null; + + public ColumnLinearLayout(Context context) { + super(context); + } + public ColumnLinearLayout(Context context, int color) { + super(context, color); + } + + public void setDate(String date) { + this.date = date; + } + public String getDate() { + return this.date; + } + + public int getColumnHeight() { + int height = 0; + int childcount = getChildCount(); + + for (int i=0; i < childcount; i++){ + View v = getChildAt(i); + //Log.d("CalAct", "date: "+this.date+", v.id: "+v.getId()+", v.height: "+v.getHeight()); + height += v.getHeight(); + } + //height = getHeight(); + return height; + } + } + + private class OnclickStartMainActivity implements View.OnClickListener { + + private final String id_zlecenia; + + public OnclickStartMainActivity(String id_zlecenia) { + this.id_zlecenia = id_zlecenia; + } + + @Override + public void onClick(View v) { + //v.getBackg + + + v.setBackgroundColor(Color.parseColor("#FF6666")); + + + + boolean ret = sprawdz_czy_sa_stare_wizyty(id_zlecenia); + + if( ret) { + //STATUS_COLORS.put("nastepna_wizyta", "#D3D3D3"); + // if( STATUS_COLORS.containsKey()) + String zlecenieColor = "#FFFFFF"; + if( jZlecenia.has(id_zlecenia) ) { + try { + JSONObject jZlecenie = jZlecenia.getJSONObject(id_zlecenia); + zlecenieColor = getZlecenieColor(jZlecenie); + } catch (JSONException e) { + e.printStackTrace(); + } + } + v.setBackgroundColor(Color.parseColor(zlecenieColor)); + + return; + } + + + Log.d("CalAct", "Start: MainActivity"); + Intent intent = new Intent(CalendarActivity.this, MainActivity.class);//getMainActivity()); + File f = new File(prefs.getString("dir", "") + + "/baza/" + id_zlecenia+".json"); + Uri u = Uri.fromFile(f); + intent.setData(u); + intent.putExtra("filename", id_zlecenia+".json"); + if ( intent != null ) { // obsługa nulla + startActivity(intent); + } // obsługa nulla + } + } +} diff --git a/app/src/main/java/com/likesoft/mdedal/DatePickerFragment.java b/app/src/main/java/com/likesoft/mdedal/DatePickerFragment.java new file mode 100644 index 0000000..3c1d60c --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/DatePickerFragment.java @@ -0,0 +1,122 @@ +package com.likesoft.mdedal; + +import android.app.Activity; +import android.app.DatePickerDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.os.Bundle; +import android.widget.DatePicker; +import android.widget.TextView; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.GregorianCalendar; + +/** +* Created by darek on 2016-01-25. +*/ +public class DatePickerFragment extends DialogFragment + implements DatePickerDialog.OnDateSetListener { + + public Integer nr_zlecenia; + public Activity act; + public String data_walidacja_do = null; + public TextView tv = null; + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + // Use the current date as the default date in the picker + final Calendar c = Calendar.getInstance(); + int year = c.get(Calendar.YEAR); + int month = c.get(Calendar.MONTH); + int day = c.get(Calendar.DAY_OF_MONTH); + + // - jawne tworzenie obiektu - żeby przed return dodać DatePickerMode + // Create a new instance of DatePickerDialog and return it + DatePickerDialog dDlg = new DatePickerDialog(getActivity(), this, year, month, day); + dDlg.getDatePicker().setCalendarViewShown(true); // - false -> true + dDlg.getDatePicker().setSpinnersShown(false); // - cała linijka + return dDlg; + // + } + + + public void onDateSet(DatePicker view, int year, int month, int day) { + // Do something with the date chosen by the user + + + Log.d("my_debug", "Wybrano edycje daty wizyty nr: " + nr_zlecenia + " nowy rok: " + year); + + Calendar c = new GregorianCalendar(year, month, day); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String date_string = sdf.format(c.getTime()); + //tv.setText(date_string); + + TimePickerFragment newFragment_time = new TimePickerFragment(); + newFragment_time.act = act; + newFragment_time.nr_zlecenia = nr_zlecenia; + newFragment_time.data_walidacja_do = data_walidacja_do; + newFragment_time.tv = tv; + newFragment_time.setDate = c; + + newFragment_time.show(getFragmentManager(), "timePicker"); + + + + + // ListActivity.this.finish(); +// final Intent intent = new Intent(); +// intent.setAction("blah"); +// getActivity().sendBroadcast(intent); +// dismiss(); + +/* + Calendar c = new GregorianCalendar(year, month, day); + Calendar cToday = new GregorianCalendar(); + + Calendar data_walidacja_do_cal = null; + if( data_walidacja_do != null ) { + try { + data_walidacja_do_cal = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + data_walidacja_do_cal.setTime(sdf.parse(data_walidacja_do));// all done + } catch (ParseException e) { + e.printStackTrace(); + } + } + + + if( cToday.compareTo(c)>0){ + Toast.makeText(act.getApplicationContext(), + "Nie można wybrać daty wstecznej dla wizyty nr: " + nr_zlecenia, + Toast.LENGTH_LONG).show(); + } + else if( data_walidacja_do_cal != null && c.compareTo(data_walidacja_do_cal)>0 ) { + Toast.makeText(act.getApplicationContext(), + "Nie można wybrać daty przekraczającej datę obsługi: " + data_walidacja_do, + Toast.LENGTH_LONG).show(); + } + else { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String cString = sdf.format(c.getTime()); + + AsyncCallChangeDate task = new AsyncCallChangeDate(act, nr_zlecenia + "", DATA_KOD, cString) { + @Override + protected void reloadContent() { + // drawContent(); + final Intent intent = new Intent(); + intent.setAction("blah"); + getActivity().sendBroadcast(intent); + dismiss(); + } + + @Override + public void loadInputs() { + // loadJsons(); + } + }; // week_day_dates[id_drop]); + task.execute(); + } + */ + } +} diff --git a/app/src/main/java/com/likesoft/mdedal/DedalActivity.java b/app/src/main/java/com/likesoft/mdedal/DedalActivity.java new file mode 100644 index 0000000..d6252d6 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/DedalActivity.java @@ -0,0 +1,4803 @@ +package com.likesoft.mdedal; + +import android.app.ActionBar.LayoutParams; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.DatePickerDialog; +import android.app.Dialog; +import android.app.TimePickerDialog; +import android.app.TimePickerDialog.OnTimeSetListener; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.Typeface; +import android.net.Uri; +import android.os.StrictMode; +import android.provider.MediaStore; +import androidx.core.content.FileProvider; +import android.text.Editable; +import android.text.Html; +import android.text.InputType; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.Menu; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnFocusChangeListener; +import android.view.ViewGroup; +import android.webkit.WebView; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.DatePicker; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.ScrollView; +import android.widget.Spinner; +import android.widget.TableLayout; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.TimePicker; + +import com.likesoft.mdedal.gui.BorderLinearLayout; +import com.likesoft.mdedal.gui.BorderTextView; +import com.likesoft.mdedal.gui.ButtonDate; +import com.likesoft.mdedal.gui.MLinearLayout; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +//import android.util.Log; +/** + * Created by darek on 2016-01-10. + */ +public abstract class DedalActivity extends Activity { + + + protected static final boolean isGrey = false; + protected static final int REQUEST_CODE = 10; + + + public static String STRUCT_TYP_DANYCH = "typ_danych"; + public static String STRUCT_OPCJE = "opcje"; + public static String STRUCT_OPIS = "opis"; + public static String STRUCT_WARTOSC = "wartosc"; + public static String STRUCT_KLIENT = "klient"; + public static String STRUCT_STATUS = "status"; + public static String STRUCT_CHILDS = "childs"; + public static String STRUCT_POWTARZALNY = "powtarzalny"; + public static String STRUCT_WALIDACJA = "walidacja"; + public static String STRUCT_WIERSZ_SZABLONU = "id_wiersz_szablonu"; + + // values for: STRUCT_TYP_DANYCH + public static String TYPE_TEXT = "tekst"; + public static String TYPE_TEXTBOX = "tekstbox"; + public static String TYPE_KWOTA = "kwota"; + public static String TYPE_LICZBA = "liczba"; + public static String TYPE_KOLUMNA = "kolumna"; + public static String TYPE_CHECK = "check"; + public static String TYPE_DATA = "data"; + public static String TYPE_WYBOR = "wybor"; + public static String TYPE_LISTA = "lista"; + public static String TYPE_RADIOLISTA = "radiolista"; + public static String TYPE_CHECKLISTA = "checklista"; + public static String TYPE_ATTACH = "attach"; + public static String TYPE_ATTACH_POWT = "attach_powtarzalny"; + public static String TYPE_FOTO = "foto"; + public static String TYPE_SPECIAL = "special"; + public static String TYPE_TABELA = "tabela"; + public static String TYPE_RADIOBUTTON = "radiobutton"; + public static String TYPE_RADIO = "radio"; + + + // values for: STRUCT_KLIENT + // accept, tak, + + // values for: STRUCT_STATUS + // + + + public abstract OnClickListener getZapisz_zmiany( JSONObject jo, String typ); + protected abstract void setModified(); + protected abstract void stopAutozapis(); + protected abstract void mod_json_files(boolean mod_upload); + protected abstract void forceDoZapis(String key, String kod); + + // private static final int TAKE_PICTURE = 2; + SharedPreferences prefs; + JSONObject params = null; + JSONObject js =null; // json do wyświetlenia + String m_id = null; //nr zlecenia + ArrayList dluznikItems_names = null; + ArrayList dluznikItems_id_dluznik = null; + static Map selectedDluznikPerInterwencja = null; + + protected Class getDokumentyKollektoActivity() { + return DokumentyKollektoActivity.class; + } + + private class OnClickListenerInsertKp implements OnClickListener { + JSONArray kp_json_arr = null; + ArrayList items_id = null; + Spinner spin = null; + + public OnClickListenerInsertKp(JSONArray kp_json_arr, ArrayList items_id, Spinner spin) { + this.kp_json_arr = kp_json_arr; + this.items_id = items_id; + this.spin = spin; + } + + private int get_min_kp() { + int min_kp = -1; + + try { + for ( int i = 0 ; i < kp_json_arr.length() ; i++ ) { + JSONObject kp_json = kp_json_arr.getJSONObject(i); + if( !"aktywne".equals(kp_json.getString("status")) ) { continue; } + int kp = kp_json.getInt("kp"); + if( min_kp < 0 ) { + min_kp = kp; + } + else if( kp < min_kp ) { + min_kp = kp; + } + + } + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + + return min_kp; + } + + @Override + public void onClick(View v) { + int min_kp = get_min_kp(); + if( min_kp > 0 ) { + String old_kp_str = spin.getSelectedItem().toString(); + boolean setselection = true; + if ( IsInteger(old_kp_str) ) { + int old_kp = Integer.parseInt(old_kp_str); + if (min_kp >= old_kp) { + setselection = false; + } + } + if( setselection ) { + int pos_new = getPositionByValue(Integer.toString(min_kp), items_id); + if (pos_new >= 0) { + spin.setSelection(pos_new); + } + } + } + Log.d("my_debug", "min_kp: "+min_kp); + } + } + + protected class Opcje { + Map options = new HashMap(); + public Opcje( JSONObject jo){ + try { + if( jo.has(STRUCT_OPCJE)) { + String opcje = jo.getString(STRUCT_OPCJE); + //String tbl_opcje[] = opcje.split("|"); + StringTokenizer st = new StringTokenizer(opcje, "|"); + while(st.hasMoreTokens()){ + //for( int i=0; i< tbl_opcje.length; i++ ){ + //String tbl_p[] = tbl_opcje[i].split("="); + String tbl_p[] = st.nextToken().split("="); + if( tbl_p.length>1){ + options.put(tbl_p[0].trim().toLowerCase(), tbl_p[1].trim()); + }else{ + options.put(tbl_p[0].trim().toLowerCase(), ""); + } + } + } + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + } + public boolean check_opcje( String opcja){ + return options.keySet().contains(opcja.trim().toLowerCase()); + } + public String get_opcje(String opcja) { + return options.get(opcja.trim()); + } + } + + public class ShortButton { //extends Button{ + LinearLayout ll; + Button button; + public ShortButton(Context context) { + ll = new LinearLayout(context); + ll.setOrientation(LinearLayout.HORIZONTAL); + button = new Button(context); + ll.addView(button); + } + public LinearLayout getLinearLayout() { + return ll; + } + public Button getButton() { + return button; + } + } + + + protected static final int TAKE_PICTURE = 2; + public final String LOG = "MainActivity"; + + Map radioParentsIds = new HashMap(); // buttonId, ID grupy + Map> radiogroups = new HashMap>(); // ID grupy i lista buttonow + + Map radioJson = new HashMap(); //buttonId i dzieci do wyďż˝wietlenia + Map checkJson = new HashMap(); //buttonId i dzieci do wyďż˝wietlenia + Map groupContainer = new HashMap(); // ID grupy radio i Vidok do umieszczania dzieci. + + Map wyborSelected = new HashMap(); // ID pola wobor oraz id wybranego pola. + Map> items_id = new HashMap>(); // id pola wybor trzyma id dzieci pola wybďż˝r + + Integer maxId = 0; // maksymalne id z formatki (potrzebne do pďż˝l powtarzalnych) + Map> ostatni_powtarzalny = new HashMap>(); // id_wiersz_szablonu pola powtarzalnego oraz id_zlecenia_wiersz ostatniego pola (potrzebne aby wďż˝wietlaďż˝ tylko jeden button "Dodaj nowy") + Map> ostatni_accept = new HashMap>(); // id_wiersz_szablonu pola accept oraz id_zlecenia_wiersz ostatniego pola (potrzebne aby wďż˝wietlaďż˝ tylko jeden button "Dodaj nowy") + Map> ilosc_powtarzalnych = new HashMap>(); // id_wiersz_szablonu pola powtarzalnego oraz ile razy wystďż˝puje (potrzebne aby przycisk usuďż˝ nie mďż˝gďż˝ usuwaďż˝ ostatniego elementu) + Map> tabela_ostatni_wiersz = new HashMap>(); // id tabeli oraz id tych pĂłl ktĂłre stanowiÄ… ostatni wiersz danej tabeli + Map elemntsWithFoto = new HashMap(); // id elementu powtarzalnego ktďż˝ry zawiera element typu foto (potrzebne po to aby przy elemntach ktďż˝re zawierajďż˝ foto nie wyďż˝wietlaďż˝ "dodaj nowy" i "usuďż˝") + Map disableEditable = new HashMap(); // id pola ktĂłre mimo tego ĹĽe jest wyłączone (enable) jest do edycji (np. data) - potrzebne do walidacji + + Map elemntsEnable = new HashMap(); // id elementu -> czy jest enable (uzywane dla fragmentow) + + String komunikat_obowiazkowe = ""; //zmienna z komunikatem, jeĹ›li sÄ… pola sÄ… nie wypeĹ‚nione + String komunikat_walidacja = ""; //zmienna z komunikatem, jeĹ›li sÄ… pola Ĺşle wypeĹ‚nione + + boolean is_notend_intevention = false; + + Boolean bTablet=true; + Boolean first_foto_displayed = false; // zmienna trzymajďż˝ca czy byďż˝o juďż˝ wyďż˝wietlone pole typu foto. Potrzebne aby wyďż˝wietliďż˝ tylko raz "Zrďż˝b zdjďż˝cie" + + ArrayList folderIds = new ArrayList(); + ArrayList folderNazwy = new ArrayList(); + + Resources res; + protected int scrollTo = 0; + Map pola_tabela = new HashMap(); // płaska sktruktura zawierająca id => jsonobject z parametrami + + JSONObject supportOnLoadReferences = null; + + protected File saveToModFile(JSONObject jsToSave ) throws IOException { + DedalHelper.putFileContent(prefs.getString("dir", "") + "/baza/" + m_id + ".mod", jsToSave.toString()); + File dst = new File(prefs.getString("dir", "") + "/baza/" + m_id + ".mod"); + return dst; + } + + protected String saveToTMPFile() { + FileOutputStream fos; + File dst = null; + try { + dst = File.createTempFile("dedal", m_id); + DedalHelper.putFileContent(dst.getAbsolutePath(), js.toString()); + return dst.getAbsolutePath(); + } catch (IOException e) { + Log.e("DEDAL", "IO - saveToTMPFile", e); + } + return null; + } + + protected void wyswietlOpis(LinearLayout ll, JSONObject jo ) throws JSONException{ + TextView tw = new TextView(this); +// tw.setTextSize(18f); + tw.setTextAppearance(this, R.style.OpisText); + + + String opis = jo.getString(STRUCT_OPIS).trim(); + if( opis.length()>0) + tw.setMinimumWidth(300); + + //opis += " "; + +// if( opis.startsWith("<")){ + tw.setText(" " +Html.fromHtml(opis)); +// } + //tw.setText(jo.getString(STRUCT_TYP_DANYCH) + jo.getString("opcje") +": " + opis); +// tw.setText(opis); + // tw.setMaxWidth(600); + tw.setMaxWidth(1000); + if( opis.indexOf("=0){ + WebView webview = new WebView(this); + webview.loadData("" + opis + "", "text/html; charset=utf-8", "utf-8"); + ll.addView(webview); + }else{ + ll.addView(tw); + } + // + + + + } + File file = null; + int y = 0; + protected void wyswietlPole(LinearLayout ll, JSONObject jo) throws JSONException{ + + wyswietlPole(ll, jo, true, true); + } + + static final int DATE_DIALOG_ID = 999999; + static final int TIME_DIALOG_ID = 999998; + Date date_w; + int cur_Date_id = 0; + String cur_Date_opcje = ""; + GregorianCalendar c = new GregorianCalendar(); + + @Override + protected Dialog onCreateDialog(int id) { + switch (id) { + case DATE_DIALOG_ID: + // set date picker as current date + //Context ctx = getApplicationContext(); + if( date_w!=null){ + c.setTime(date_w); + } + DatePickerDialog dDlg = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { + + @Override + public void onDateSet(DatePicker view, int year, int monthOfYear, + int dayOfMonth) { + // TODO Auto-generated method stub + EditText et = (EditText) DedalActivity.this.findViewById(cur_Date_id); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); + GregorianCalendar c = new GregorianCalendar(); + c.set(Calendar.YEAR, year); + c.set(Calendar.MONTH, monthOfYear); + c.set(Calendar.DAY_OF_MONTH, dayOfMonth); + et.setText(sdf.format(c.getTime())); + setModified(); + if( !"only_date".equalsIgnoreCase(cur_Date_opcje)){ + showDialog(TIME_DIALOG_ID); + } + //cur_Date_opcje = ""; + } + }, c.get(Calendar.YEAR), c.get(Calendar.MONTH),c.get(Calendar.DAY_OF_MONTH)); + dDlg.getDatePicker().setCalendarViewShown(true); // - false -> true + dDlg.getDatePicker().setSpinnersShown(false); // - cała linijka + return dDlg; + case TIME_DIALOG_ID: + + TimePickerDialog tDlg = new TimePickerDialog(this, new OnTimeSetListener() { + + @Override + public void onTimeSet(TimePicker view, int hourOfDay, int minute) { + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.ENGLISH); + EditText et = (EditText) DedalActivity.this.findViewById(cur_Date_id); + String prev = et.getText().toString(); + GregorianCalendar c = new GregorianCalendar(); + c.set(Calendar.HOUR_OF_DAY, hourOfDay); + c.set(Calendar.MINUTE, minute); + Log.d("my_debug", "set hour: "+hourOfDay); + if( prev.length()>=10){ + et.setText(prev.substring(0, 10) + " " +sdf.format(c.getTime())); + setModified(); + } + } + }, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true); + return tDlg; + } + + return null; + } + + protected int getMyAcceptId(JSONObject jo, String kod) { + + try { + if( kod != null && kod.equals(jo.getString("kod")) ){ + return jo.getInt("id"); + }else{ + //if( isset( $pole['parent'] ) && trim($pole['parent']) != '' && intval($pole['parent']) > 0 ){ + //Log.d("my_debug", "getMyAcceptId, jo: "+jo+", parent:"+jo.getString("parent") ); + String parent = jo.getString("parent"); + + + if( jo.has("parent") && jo.getInt("parent") > 0 && pola_tabela.containsKey(jo.getString("parent")) ) { + //Log.d("my_debug", "getMyAcceptId, wchodze w if, kod: "+kod); + return getMyAcceptId(pola_tabela.get(jo.getString("parent")), kod); + }else{ + //return -1; + return jo.getInt("id"); // root element + } + } + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + return -1; + } + } + + protected int getMyAcceptId(JSONObject jo, String kod, String value) { + + try { + if( kod.equals(jo.getString("kod")) && value.equals(jo.getString("wartosc"))){ + return jo.getInt("id"); + }else{ + //if( isset( $pole['parent'] ) && trim($pole['parent']) != '' && intval($pole['parent']) > 0 ){ + if( jo.has("parent") && jo.getInt("parent") > 0 && pola_tabela.containsKey(jo.getString("parent")) ) { + return getMyAcceptId(pola_tabela.get(jo.getString("parent")), kod, value); + }else{ + return -1; + } + } + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + return -1; + } + } + + protected int wyszukajNajmniejszy(String kod, String value) { + + Iterator it = pola_tabela.entrySet().iterator(); + int min = 0; + while (it.hasNext()) { + Map.Entry pair = (Map.Entry)it.next(); + String id = (String)pair.getKey(); + Integer id_int = Integer.parseInt(id); + JSONObject pole = (JSONObject)pair.getValue(); + try { + if( kod.equals(pole.getString("kod")) && value.equals(pole.getString("wartosc"))){ + if( min == 0 ) { + min = id_int; + } + else if( min > id_int ) { + min = id_int; + } + } + } catch (JSONException e) { + e.printStackTrace(); + } + + it.remove(); // avoids a ConcurrentModificationException + } + return min; + +// $min = 0; +// foreach( $pola_tabela as $pole){ +// if( $pole['kod'] == $kod && $pole['wartosc'] == $value){// && $pole['id']!= $omitId) { +// if( $min == 0){ +// $min = $pole['id']; +// }else if( $min > $pole['id'] ){ +// $min = $pole['id']; +// } +// } +// } +// return $min; + + } + + protected String pobierzValue(JSONObject jo, String value) { + + try { + if( jo.has("typ_danych") && "radiolista".equals(jo.getString("typ_danych")) ) { + JSONObject find = find_element_from_Array(js, "kod", value); + if( find != null && find.has("id_wiersz_szablonu") ) { + value = find.getString("id_wiersz_szablonu"); + } + } + } catch (JSONException e) { + e.printStackTrace(); + } + + + return value; + } + + + protected void create_pole_tabela_recursive (JSONObject jo) { + //Map pole_tabela_fragment = new HashMap(); + try { + if( !jo.has("id") ) { + //Log.d("my_debug", "jo bez id: "+jo); + return; + } + String id = jo.getString("id"); + +// JSONObject jo_clone = new JSONObject(jo.toString()); +// if( jo_clone.has(STRUCT_CHILDS) ) { +// jo_clone.remove(STRUCT_CHILDS); +// } + pola_tabela.put(id, jo); + + if( jo.has(STRUCT_CHILDS) && jo.getJSONArray(STRUCT_CHILDS).length() > 0 ) { + JSONArray childsJ = jo.getJSONArray(STRUCT_CHILDS); + for( int i = 0 ; i < childsJ.length() ; i++ ) { + //JSONObject childJ = childsJ.getJSONObject(i); + create_pole_tabela_recursive(childsJ.getJSONObject(i)); + //pola_tabela.putAll(pole_tabela_fragment2); + } + } + else { + + } + + //return pola_tabela; + } catch (JSONException e) { + e.printStackTrace(); + } + + //return pola_tabela; + } + + protected void create_pole_tabela(JSONObject js) { + if( pola_tabela != null && pola_tabela.size() > 0 ) { + return; + } + + pola_tabela = new HashMap(); + + try { + JSONObject pola = js.getJSONObject("pola"); + Iterator k = pola.keys(); + JSONObject jo = null; + while (k.hasNext()) { + String key = (String) k.next(); + jo = pola.getJSONObject(key); + create_pole_tabela_recursive(jo); + //pola_tabela.putAll(pole_tabela_fragment); + } + } catch (JSONException e) { + e.printStackTrace(); + } + + } + + + protected boolean wyszukajCzyPierwszy(JSONObject jo, String kod, String value) { + + create_pole_tabela(js); +// Log.d("my_debug", "wyszukajCzyPierwszy, pola_tabela size: "+pola_tabela.size()); +// +// Log.d("my_debug", "test contains: "+pola_tabela.containsKey("90731296")); +// Iterator it = pola_tabela.entrySet().iterator(); +// while (it.hasNext()) { +// Map.Entry pair = (Map.Entry) it.next(); +// String id = (String) pair.getKey(); +// if( "90731296".equals(id) ) { +// Log.d("my_debug", "znalezione test, id: " + id); +// } +// } + + Log.d("my_debug", "value przed: "+value); + + value = pobierzValue(jo, value); + try { + Log.d("my_debug", "wyszukajCzyPierwszy, id: "+jo.getString("id")+", kod: "+kod+", value: "+value); + } catch (JSONException e) { + e.printStackTrace(); + } + + int m = getMyAcceptId(jo, kod, value); + int min = wyszukajNajmniejszy(kod, value); +// +// Log.d("my_debug", "m: "+m+", min: "+min+", value: "+value); +// return false; + return m == min || min == 0; + } + + + + protected void wyswietlPole(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable ) throws JSONException{ + wyswietlPole(ll, jo, withOpis, enable, null); + } + + //String status_interwencji = null; + + protected void wyswietlPole(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable, String status_interwencji ) throws JSONException{ + String typ_danych = jo.getString(STRUCT_TYP_DANYCH); + +// Log.d("my_debug", "pole, typ: "+typ_danych+", wartosc: "+jo.getString(STRUCT_WARTOST)+", opis: "+jo.getString(STRUCT_OPIS)+", id: "+jo.getInt("id") ); +// if( js.has("sub") && jo.has("id-orig") ) { +// Log.d("my_debug", "no-sent"); +// jo.put("no-sent", "true"); +// enable = false; +// } + + // sprawdzanie opcji 'if' + Opcje op = new Opcje(jo); + // todo: więszka optymalizacja bo działa wolno + + if( op.check_opcje("if") ) { + String opcjaIf = op.get_opcje("if"); + String split[] = opcjaIf.split(":"); + if( split.length > 1 ) { + String kod = split[0]; + String wartosc = split[1]; + boolean count = wyszukajCzyPierwszy( jo, kod, wartosc ); + + if( count ){ + // echo "Znaleziono kod $opcjaIf pierwszy."; + //echo '

'; + return; + } + } + + } + + // koniec sprawdzanie opcji 'if' + + String dane_we = jo.getString(STRUCT_KLIENT); + if ( "accept".equals(dane_we) ) { + status_interwencji = jo.getString(STRUCT_STATUS); + //if( jo.getString(STRUCT_STATUS).equals("end") + } + + // wyłom - dla niektórych szablonów pola wyjściowe mają być edytowalne dla statusu wykonane + if( js.has("edycja_pol_wyjsciowych") ) { + JSONArray edycja_pol_wyjsciowych = js.getJSONArray("edycja_pol_wyjsciowych"); + String status_zlecenia = params.getString(STRUCT_STATUS); + + if( "nie".equals(dane_we) || "accept".equals(dane_we) ) { // dane wyjściowe + + + for (int i = 0; i < edycja_pol_wyjsciowych.length(); i++) { + JSONObject warunek = edycja_pol_wyjsciowych.getJSONObject(i); + if (status_zlecenia.equals(warunek.get("status_zlecenia")) + && "INS".equals(warunek.get("user_typ"))) { + + if( status_interwencji == null || (!"end".equals(status_interwencji) && !"accept".equals(status_interwencji)) ) { + enable = true; + } + } + } + } + } + /// + + if(jo.has("no-sent")) { + enable = false; + } + + int id = 0; + if( jo.has("id") ) { + id = jo.getInt("id"); + } + else { + return; + } + + if ( jo.has("usun") && jo.getString("usun").equals("true") ) { + return; + } + + if ( id > maxId ) { + maxId = jo.getInt("id"); + } + + //Log.d("my_debug", "przed powtarzalny, id: "+jo.getInt("id")); + //Log.d("my_debug", "przed pow: "+typ_danych +", id: "+jo.getString("id")); + if(jo.getString(STRUCT_POWTARZALNY).equals("tak") && + !jo.getString(STRUCT_KLIENT).equals("accept") && + elemntsWithFoto.get(jo.getInt("id")) == null && + enable) { + //Log.d("my_debug", "w powtarzalny "+typ_danych +", id: "+jo.getString("id")); + } + + //return; + if(typ_danych.equals(TYPE_CHECK)) { + wyswietl_checkbox(ll, jo, withOpis, enable, status_interwencji); + } + else { + if (typ_danych.equals(TYPE_DATA)) { +// if( withOpis) wyswietlOpis(ll, jo); + wyswietl_date(ll, jo, withOpis, enable); + wyswietl_Dzieci(ll, jo, withOpis, enable, status_interwencji); + + } else if (typ_danych.equals(TYPE_TEXT) || typ_danych.equals(TYPE_KOLUMNA) || + typ_danych.equals(TYPE_TEXTBOX) || typ_danych.equals(TYPE_LICZBA) || + typ_danych.equals(TYPE_KWOTA)) { + + wyswietl_text(ll, jo, withOpis, enable, typ_danych); + wyswietl_Dzieci(ll, jo, withOpis, enable, status_interwencji); + + } else if (typ_danych.equals(TYPE_WYBOR)) { + wyswietl_wybor(ll, jo, withOpis, enable); + + } else if (typ_danych.equals(TYPE_RADIOLISTA)) { + wyswietl_radiolista(ll, jo, withOpis, enable, status_interwencji); + + } else if (typ_danych.equals(TYPE_LISTA) || typ_danych.equals(TYPE_CHECKLISTA)) { + enable = wyswietl_liste(ll, jo, withOpis, enable, status_interwencji); + + } else if (typ_danych.equals(TYPE_ATTACH)) { + wyswietl_attach(ll, jo, "", enable); + wyswietl_Dzieci(ll, jo, withOpis, enable, status_interwencji); + + } else if (typ_danych.equals(TYPE_ATTACH_POWT)) { + wyswietl_attach(ll, jo, STRUCT_POWTARZALNY, enable); + wyswietl_Dzieci(ll, jo, withOpis, enable, status_interwencji); + } else if (typ_danych.equals(TYPE_FOTO)) { + //Log.d("my_debug", "wyswietl_foto 1"); + wyswietl_foto(ll, jo, enable); + wyswietl_Dzieci(ll, jo, withOpis, enable, status_interwencji); + + } else if (typ_danych.equals(TYPE_SPECIAL)) { + //Log.d("my_debug", "ojoj special"); + wyswietl_special(ll, jo, withOpis, enable); + //return; + } else if (typ_danych.equals(TYPE_TABELA)) { + wyswietl_tabela(ll, jo, withOpis, enable); + //return; + } else { + // nie powinno się zdarzać + Log.e("myDebug", "wyswietlanie nieznanego elementu: "+typ_danych); + TextView tw2 = new TextView(this); + tw2.setText("typ: " + typ_danych); + ll.addView(tw2); + + wyswietlOpis(ll, jo); + wyswietl_Dzieci(ll, jo, withOpis, enable, status_interwencji); + } + } + + if(jo.getString(STRUCT_POWTARZALNY).equals("tak") && + !jo.getString(STRUCT_KLIENT).equals("accept") && + elemntsWithFoto.get(jo.getInt("id")) == null && + enable ) { + + //Log.d("my_debug", "sub: "+) + if( !(js.has("sub") && jo.has("id-orig")) ) { + ShortButton b2 = new ShortButton(this); + b2.getButton().setText( res.getString(R.string.usun) ); + OnClickListener nClickL_usun = new Usun_powtarzalny(jo); + b2.getButton().setOnClickListener(nClickL_usun); + ll.addView(b2.getLinearLayout()); + } + + //Log.d("my_debug", "w powtarzalny"); + ShortButton b = null; + LinearLayout ll_pow = null; + Integer x = ostatni_powtarzalny.get(jo.getInt("parent")).get(jo.getInt("id_wiersz_szablonu")); + if( !jo.has("id-orig") && x != null && jo.getInt("id") == x) { + b = new ShortButton(this); + b.getButton().setText("Dodaj nowy"); + //b.setId(jo.getInt("id")); + ll_pow = new LinearLayout(this); + ll_pow.setOrientation(LinearLayout.VERTICAL); + OnClickListener nClickL = new Dodaj_powtarzalny(ll_pow, jo); + b.getButton().setOnClickListener(nClickL); + + ll.addView(ll_pow); + ll.addView(b.getLinearLayout()); + + } + } + + } + + private void wyswietl_text(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable, String typ_danych) throws JSONException { + if (jo.getString(STRUCT_KLIENT).equals("tak") || !enable) { + //cb.setClickable(false); +// et.setText(jo.getString(STRUCT_WARTOST)); +// wyswietl_text_ramka(ll, Html.fromHtml(jo.getString(STRUCT_WARTOST))); + LinearLayout llv = ll; + if (withOpis) { + if (!typ_danych.equals(TYPE_TEXTBOX)) { + llv = new LinearLayout(this); + + llv.setOrientation(LinearLayout.HORIZONTAL); + ll.addView(llv); + } + wyswietlOpis(llv, jo); + } + // String typ_danych = jo.getString(STRUCT_TYP_DANYCH); + if( typ_danych.equals(TYPE_TEXTBOX)){ + String t = jo.getString(STRUCT_WARTOSC); + // t = t.replace("
", "/n"); + // Spanned text= Html.fromHtml(t); + // wyswietl_text_ramka_dopasowana(llv, text); + TextView two = new TextView(this); ///BorderTextView(this); + // two.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT)); + two.setBackgroundColor(Color.YELLOW); + two.setText(t);//ext); + two.setMinWidth(100); + two.setMaxWidth(600); + llv.addView(two); + + // wyswietl_text_ramka_dopasowana(llv, jo.getString(STRUCT_WARTOSC)); + }else { + if( withOpis) + wyswietl_text_ramka(llv, jo.getString(STRUCT_WARTOSC)); + else + wyswietl_text_ramka_dopasowana(llv, jo.getString(STRUCT_WARTOSC)); + } + + } else { + wyswietl_editText(ll, jo, withOpis, enable); + + } + } + + private void wyswietl_date(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable) throws JSONException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH); + date_w = null; + try { + date_w = sdf.parse(jo.getString(STRUCT_WARTOSC)); + } catch (ParseException e) { + //e.printStackTrace(); + } + + if (!jo.getString(STRUCT_KLIENT).equals("tak") && enable) { + wyswietl_editDate(ll, jo, withOpis, enable); + } else { + // read only + LinearLayout llv = ll; + if (withOpis) { + llv = new LinearLayout(this); + llv.setOrientation(LinearLayout.HORIZONTAL); + ll.addView(llv); + wyswietlOpis(llv, jo); + } + wyswietl_text_ramka(llv, jo.getString(STRUCT_WARTOSC)); + } + } + + private void wyswietl_wybor(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable) throws JSONException { + if (withOpis) wyswietlOpis(ll, jo); + ArrayList items = new ArrayList(); + JSONArray ja = jo.getJSONArray(STRUCT_CHILDS); + //items_id.removeAll(items_id); + ArrayList items_id_temp = new ArrayList(); + if (jo.has("obowiazkowe") && "tak".equals(jo.getString("obowiazkowe"))) { + items.add(" "); + items_id_temp.add(0); + } + + Spinner spin = new Spinner(DedalActivity.this); //(Spinner) findViewById(R.id.spinner); + + boolean do_default = true; + Button wstaw_automatycznie_btn = new Button(this); + if (true) { + // boolean czy_formatka_ma_dluznikow + + + if( selectedDluznikPerInterwencja != null ) { + if (jo.has("opcje") && jo.has("id_interwencji") && ("adresy".equals(jo.getString("opcje")) || "telefony".equals(jo.getString("opcje")) ) ) { + String id_interwencji = jo.getString("id_interwencji"); + String id_dluznika = selectedDluznikPerInterwencja.get(id_interwencji); + if( id_dluznika != null ) { + JSONArray jdluznicy = js.getJSONArray("dluznicy"); + JSONObject jdluznik = null; + // znajdz odpowiedniego dluznika + for( int i = 0 ; i < jdluznicy.length() ; i++ ) { + JSONObject jdluznik_temp = jdluznicy.getJSONObject(i); + if( jdluznik_temp.has("id") && id_dluznika.equals(jdluznik_temp.getString("id")) ) { + jdluznik = jdluznik_temp; + break; + } + } + if( "adresy".equals(jo.getString("opcje")) && jdluznik != null && jdluznik.has("adresy") ) { + JSONArray jAdresy = jdluznik.getJSONArray("adresy"); + for ( int i = 0 ; i < jAdresy.length() ; i++ ) { + JSONObject jAdres = jAdresy.getJSONObject(i); + if( jAdres.has("kod_pocztowy") && jAdres.has("miejscowosc") && jAdres.has("ulica") && jAdres.has("nr_domu") ) { + items.add(jAdres.getString("kod_pocztowy") + " " + jAdres.getString("miejscowosc") + " " + jAdres.getString("ulica") + " " + jAdres.getString("nr_domu")); + items_id_temp.add(i); + } + } + + do_default = false; + } + if( "telefony".equals(jo.getString("opcje")) && jdluznik != null && jdluznik.has("telefony") ) { + JSONArray jTelefony = jdluznik.getJSONArray("telefony"); + for ( int i = 0 ; i < jTelefony.length() ; i++ ) { + JSONObject jTelefon = jTelefony.getJSONObject(i); + if( jTelefon.has("telefon") && jTelefon.has("typ_telefonu") && jTelefon.has("opis_telefonu") && jTelefon.has("czy_zweryfikowany") ) { + items.add(jTelefon.getString("telefon") + " " + jTelefon.getString("typ_telefonu") + " " + jTelefon.getString("opis_telefonu") + " " + jTelefon.getString("czy_zweryfikowany")); + items_id_temp.add(i); + } + } + + do_default = false; + } + } + } else if (jo.has("opcje") && "telefony".equals(jo.getString("opcje"))) { + // todo: zrobić telefony analogicznie jak adresy + do_default = false; + } + } + + if (jo.has("opcje") && "kp_numer".equals(jo.getString("opcje"))) { + if( enable) { + String KP_filename = prefs.getString("KP_filename", ""); + KP_filename = DedalHelper.getModOrJsonFileName(KP_filename); + String kp_json_str = DedalHelper.getFileContent(KP_filename); + JSONArray kp_json_arr = new JSONArray(kp_json_str); + for (int i = 0; i < kp_json_arr.length(); i++) { + JSONObject kp_json = kp_json_arr.getJSONObject(i); + String status = kp_json.getString("status"); + if (!"aktywne".equals(status)) { + continue; + } + + items.add(kp_json.getString("kp")); + items_id_temp.add(kp_json.getInt("kp")); + } + + wstaw_automatycznie_btn.setText("Wstaw automatycznie"); + wstaw_automatycznie_btn.setOnClickListener(new OnClickListenerInsertKp(kp_json_arr, items_id_temp, spin)); + }else{ + items.clear(); + items.add(jo.getString("wartosc")); + //items_id_temp.add(0); + } + do_default = false; + } + + } + + if( ja != null && ja.length() > 0 && do_default ) { + for (int i = 0; i < ja.length(); i++) { + items.add(ja.getJSONObject(i).getString(STRUCT_OPIS)); + items_id_temp.add(ja.getJSONObject(i).getInt("id_wiersz_szablonu")); + } + } + items_id.put(jo.getInt("id"), items_id_temp); + + + spin.setId(jo.getInt("id")); + if (!enable) { + spin.setEnabled(false); + } + //Log.d("my_debug", "spinner Id:"+spin.getId()); + //Log.d("my_debug", "items: "+items_id); + ArrayAdapter aa = new ArrayAdapter( + this, + android.R.layout.simple_spinner_item, + items.toArray()); + + aa.setDropDownViewResource( + android.R.layout.simple_spinner_dropdown_item); + + spin.setOnItemSelectedListener(new OnItemSelectedListener() { + boolean first_selection = true; + + @Override + public void onItemSelected(AdapterView parent, View view, int pos, long id) { + ArrayList items_id_temp = items_id.get(parent.getId()); + wyborSelected.put(parent.getId(), items_id_temp.get(pos)); + Log.d("my_debug", "spinner, id: " + parent.getId() + ", selected: " + items_id_temp.get(pos)); + if( !first_selection ) { + setModified(); + } + else { + first_selection = false; + } + } + + @Override + public void onNothingSelected(AdapterView arg0) { + } + }); + + spin.setAdapter(aa); + + int selected_pos = 0; + if (jo.has(STRUCT_WARTOSC) && !jo.getString(STRUCT_WARTOSC).equals("") && !jo.getString(STRUCT_WARTOSC).equals("obowiazkowe")) { + selected_pos = getPositionByValue(jo.getString(STRUCT_WARTOSC), items_id_temp); + + } + Log.d("my_debug", "selected-pos:" + selected_pos); + spin.setSelection(selected_pos); + + ll.addView(spin); + + //przycisk: "wstaw automatycznie" + if (jo.has("opcje") && "kp_numer".equals(jo.getString("opcje"))) { + ll.addView(wstaw_automatycznie_btn); + } + } + + private int getPositionByValue(String value, ArrayList items_id_temp) { + int selected_pos = 0; + //String wartosc = jo.getString(STRUCT_WARTOSC); + Log.d("my_debug", "wartosc: " + value); + if( IsInteger(value) ) { + int wartosc_int = Integer.parseInt(value); //jo.getInt(STRUCT_WARTOSC); + for (int i = 0; i < items_id_temp.size(); i++) { + //Log.d("my_debug", i+ ", (Integer)wartosc: "+(Integer)wartosc+", "+items_id_temp.get(i)); + if ( wartosc_int == items_id_temp.get(i)){ + selected_pos = i; + break; + } + } + } + return selected_pos; + } + + private Boolean wyswietl_liste(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable) throws JSONException { + return wyswietl_liste(ll, jo, withOpis, enable, null); + } + + private Boolean wyswietl_liste(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable, final String status_interwencji) throws JSONException { + /**/ + LinearLayout ll_wrapper = new LinearLayout(DedalActivity.this); + ll_wrapper.setOrientation(LinearLayout.VERTICAL); + ll.addView(ll_wrapper); + /* i dalej pozmieniane ll na ll_wraper w tej funkcji*/ + ll=ll_wrapper; + if (withOpis) wyswietlOpis(ll, jo); /* llv na ll*/ + + Opcje op = new Opcje(jo); + LinearLayout llv = new LinearLayout(this); + ll.addView(llv); + + if (op.check_opcje("col") && bTablet || op.check_opcje("fragment")) { + llv.setOrientation(LinearLayout.HORIZONTAL); + } else { + llv.setOrientation(LinearLayout.VERTICAL); + llv.setMinimumWidth(this.getWindow().getAttributes().width); + } + + try { + String dane_we = jo.getString(STRUCT_KLIENT); + if (dane_we.equals("accept")) { + + if (jo.getString(STRUCT_STATUS).equals("end")) { + enable = false; //Log.d("my_debug", "enable: "+enable); + } else if (jo.getString(STRUCT_STATUS).equals("accept")) { + enable = false; + } + + //todo: wybór dłużnika w interwencji + /////////////////////////////////////////// + if( js.has("dluznicy") && dluznikItems_names != null && dluznikItems_names.size() > 0) { + JSONArray jdluznicy = js.getJSONArray("dluznicy"); + //ArrayList dluznikItems_names = new ArrayList(); + + Spinner dluznikSpinner = new Spinner(DedalActivity.this); //(Spinner) findViewById(R.id.spinner); + //dluznikSpinner.setId(jo.getInt("id")); + if (!enable) { + dluznikSpinner.setEnabled(false); + } + + ArrayAdapter aa = new ArrayAdapter( + this, + android.R.layout.simple_spinner_item, + dluznikItems_names.toArray()); + + aa.setDropDownViewResource( + android.R.layout.simple_spinner_dropdown_item); + + + selectedDluznikPerInterwencja = null; + dluznikSpinner.setOnItemSelectedListener(new MyOnItemSelectedListener(jo.getString("id"))); + dluznikSpinner.setAdapter(aa); + + if( jo.has("id_dluznika") ) { + String selected_id_dluznika = jo.getString("id_dluznika"); + + int selected_pos = 0; + for (int i = 0; i < dluznikItems_id_dluznik.size(); i++) { + String id_dluznika = dluznikItems_id_dluznik.get(i); + if( selected_id_dluznika.equals(id_dluznika) ) { + selected_pos = i; + break; + } + } + Log.d("my_debug", "selected-pos:" + selected_pos); + dluznikSpinner.setSelection(selected_pos); + } + + TextView dluznikOpisTv = new TextView(this); + dluznikOpisTv.setText("Dłużnik: "); + + LinearLayout dluznikLL = new LinearLayout(this); + dluznikLL.addView(dluznikOpisTv); + dluznikLL.addView(dluznikSpinner); + llv.addView(dluznikLL); + } + //////////////////////////////////////////// + } + + if (jo.getString(STRUCT_KLIENT).equals("tak") || !enable) { + llv.setBackgroundColor(Color.parseColor("#eaeaea"));//#eaeaea //B0E0E6 + } else { + //llv.setBackgroundColor(Color.WHITE); + } + boolean schowaj = false; + if( op.check_opcje("hide_ended")&& !enable){ + schowaj = true; + } + if (op.check_opcje("fragment") || schowaj ){ + // LOG + Log.d("my_debug", "obsluga fragmentu"); + Button bu_t = new Button(this); + bu_t.setId(jo.getInt("id")); + bu_t.setText( "Pokaż w nowym oknie +" ); + elemntsEnable.put(jo.getInt("id"), enable); + + Log.d("my_debug", "wyswietl_liste: "+jo.getString("kod")+", enable: "+enable.toString()); + + OnClickListener nClickL_t = new OnClickListener() { + //public String s; + @Override + public void onClick(View v) { + stopAutozapis(); + + scrollTo = sw.getScrollY();//sw.getFirstVisiblePosition(); + Log.d("my_debug", "set scrollTo: "+scrollTo); + + Intent i = new Intent(DedalActivity.this, FragmentMainActivity.class); + // i.putExtra("json", js.toString()); + String filePathName = saveToTMPFile(); + i.putExtra("filePathName", filePathName); + i.putExtra("id", "" + v.getId()); + i.putExtra("enable", "" + elemntsEnable.get(v.getId())); + if( status_interwencji != null ) { + i.putExtra("status_interwencji", status_interwencji); + } + startActivityForResult(i, REQUEST_CODE); + //startActivity(i); + + }}; + bu_t.setOnClickListener(nClickL_t); + llv.addView(bu_t); + }else { + llv.setId(jo.getInt("id")); //tu chyba nie jest potrzebne + JSONArray ja = jo.getJSONArray(STRUCT_CHILDS); + if (ja != null && ja.length() > 0) { + for (int i = 0; i < ja.length(); i++) { + LinearLayout llh = new LinearLayout(this); + llh.setOrientation(LinearLayout.VERTICAL); + if( ! op.check_opcje("col")) { // dla list kolumnowych nie dawaj odstępu z lewej + llh.setPadding(20, 0, 0, 0); + } + //llh.setBackgroundColor(Color.WHITE); + llv.addView(llh); + wyswietlPole(llh, ja.getJSONObject(i), withOpis, enable, status_interwencji); + } + if (ja.length() > 6) { + llv.setMinimumHeight(ja.length() * 55); + } + } + } + + if (dane_we.equals("accept")) { +// llv.setBackgroundColor(Color.WHITE); + if (enable) { + llv.setBackgroundColor(Color.parseColor("#FAFAD2")); + } + + if (jo.getString(STRUCT_STATUS).equals("notend")) { + if (enable) { + ShortButton b = new ShortButton(this); + b.getButton().setText(res.getString(R.string.zakoncz_wizyte)); //res.getString(R.string.zakoncz_wizyte) ); + OnClickListener nClickL_zakoncz = getZapisz_zmiany(jo, "zakoncz_wizyte"); + b.getButton().setOnClickListener(nClickL_zakoncz); + ll.addView(b.getLinearLayout()); + } + } else if (jo.getString(STRUCT_STATUS).equals("end")) { + TextView tw = new TextView(this); + tw.setText(res.getString(R.string.zakonczone)); + tw.setTextColor(Color.RED); + ll.addView(tw); + + } else if (jo.getString(STRUCT_STATUS).equals("accept")) { + TextView tw = new TextView(this); + tw.setText(res.getString(R.string.zaakceptowane)); + tw.setTextColor(Color.GREEN); + ll.addView(tw); + + } + + // wyĹ›wietlanie przycisku dodaj wizytÄ™ + if ((jo.getString(STRUCT_STATUS).equals("accept") || jo.getString(STRUCT_STATUS).equals("end")) + && ostatni_accept.get(jo.getInt("parent")) != null && ostatni_accept.get(jo.getInt("parent")).get(jo.getInt("id_wiersz_szablonu")) != null + && ostatni_accept.get(jo.getInt("parent")).get(jo.getInt("id_wiersz_szablonu")) == jo.getInt("id")) { + +// if (params.getString(STRUCT_STATUS).equals("przydz_odeb") && !jo.has("dodawanie_wizyty")) { +// ShortButton b = new ShortButton(this); +// b.getButton().setText(res.getString(R.string.dodaj_wizyte)); +// OnClickListener nClickL_zakoncz = getZapisz_zmiany(jo, "dodaj_wizyte"); +// b.getButton().setOnClickListener(nClickL_zakoncz); +// ll.addView(b.getLinearLayout()); +// } + if (jo.has("dodawanie_wizyty")) { + TextView tw = new TextView(this); + tw.setText(res.getString(R.string.trwa_dodawanie_wizyty)); + tw.setTextColor(Color.YELLOW); + ll.addView(tw); + + ButtonDate b = new ButtonDate(this); + //b.setEdId(et.getId()); + b.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + DedalActivity.this.reload(); + } + }); + b.setText(res.getString(R.string.odswiez_widok_zlecenia_z_serwera)); + ll.addView(b); + + } + } + } + } catch (JSONException jE) { + + } + return enable; + } + + private void wyswietl_Dzieci(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable) throws JSONException { + wyswietl_Dzieci(ll, jo, withOpis, enable, null); + } + + private void wyswietl_Dzieci(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable, String status_interwencji) throws JSONException { + JSONArray ja = jo.getJSONArray(STRUCT_CHILDS); + if (ja != null && ja.length() > 0) { + for (int i = 0; i < ja.length(); i++) { + wyswietlPole(ll, ja.getJSONObject(i), withOpis, enable, status_interwencji); + } + } + } + + protected void wyswietl_editDate(LinearLayout ll, JSONObject jo, + Boolean withOpis, Boolean enable) throws JSONException { + + EditText et = new EditText(this); + et.setBackgroundColor(Color.WHITE); + et.setEnabled(false); //read only + + + //et.setText(jo.getString(STRUCT_WARTOSC)); + // wartość albo wartość domyślna + String wartosc = jo.getString(STRUCT_WARTOSC); + //Log.d("my_debug", "data") + if( enable && wartosc.trim().equals("") ) { + Opcje op = new Opcje(jo); + if( op.check_opcje("default_for_tablet") ) { + String default_value = op.get_opcje("default_for_tablet"); + wartosc = default_value; + if( "PRE_TODAY".equals(default_value) ) { + wartosc = DedalHelper.getCurrentDate("yyyy-MM-dd HH:mm"); + } + } + } + et.setText(wartosc); + + et.setId(jo.getInt("id")); + + + LinearLayout llv = ll; + llv = new LinearLayout(this); + llv.setOrientation(LinearLayout.HORIZONTAL); + ll.addView(llv); + + if( withOpis) { + wyswietlOpis(llv, jo); + } + + llv.addView(et); + + if( !jo.getString(STRUCT_KLIENT).equals("tak") && enable){ + ButtonDate b = new ButtonDate(this); + b.setEdId(et.getId()); + b.setOnClickListener(new Ustaw_date(jo.getString(STRUCT_OPCJE))); + + b.setText( res.getString(R.string.zmien_date) ); + llv.addView(b); + Opcje op = new Opcje(jo); + //if( !"only_date".equalsIgnoreCase(jo.getString(STRUCT_OPCJE))){ + if( !op.check_opcje("only_date")){ + b = new ButtonDate(this); + b.setEdId(et.getId()); + b.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + cur_Date_id = ((ButtonDate)v).getEdId(); + showDialog(TIME_DIALOG_ID); + } + }); + b.setText( "ustaw czas");// res.getString(R.string.zmien_date) ); + llv.addView(b); + } + + disableEditable.put(jo.getInt("id"), true); + } + } + + protected void wyswietl_editText(LinearLayout ll, JSONObject jo, + Boolean withOpis, Boolean enable) throws JSONException { + String typ_danych = jo.getString(STRUCT_TYP_DANYCH); + int id = 0; + if( jo.has("id") ) { + id = jo.getInt("id"); + } + EditText et = new EditText(DedalActivity.this); + + String wartosc = jo.getString(STRUCT_WARTOSC); + if( enable && wartosc.trim().equals("") ) { + Opcje op = new Opcje(jo); + if( op.check_opcje("default_for_tablet") ) { + String default_value = op.get_opcje("default_for_tablet"); + wartosc = default_value; + if( "PRE_TODAY".equals(default_value) ) { + wartosc = DedalHelper.getCurrentDate("yyyy-MM-dd HH:mm"); + } + } + } + et.setText(wartosc); + + if( jo.getString(STRUCT_KLIENT).equals("tak") || !enable){ + //tutaj nie wejdzie... + et.setEnabled(false); + + }else{ + et.setMinWidth(120); + } + + + + LinearLayout llv = ll; + if( withOpis) { + if( !typ_danych.equals(TYPE_TEXTBOX)){ + llv = new LinearLayout(this); + llv.setOrientation(LinearLayout.HORIZONTAL); + ll.addView(llv); + } + wyswietlOpis(llv, jo); + } + + if( typ_danych.equals(TYPE_TEXTBOX)){ + et.setMinLines(4); + } + llv.addView(et); + + et.setId(jo.getInt("id")); + if(typ_danych.equals(TYPE_LICZBA)) + et.setInputType(InputType.TYPE_CLASS_NUMBER ); + + et.addTextChangedListener(new TextWatcher() { + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void afterTextChanged(Editable s) { + setModified(); + //Log.d("my_debug", "after TEXT CHANGED"); + } + }); + String walidacja = jo.getString(STRUCT_WALIDACJA).trim(); + // walidacja formatu wpisanych danych + if ( ( jo.has(STRUCT_WALIDACJA) && ( walidacja.equals("kod_pocztowy") || walidacja.equals("telefon") )) + || typ_danych.equals(TYPE_KWOTA) || typ_danych.equals(TYPE_LICZBA) || ( typ_danych.equals(TYPE_LICZBA) && walidacja.equals(".") && walidacja.equals(",") ) ) { + //Log.d("my_debug", "1walid poprawnosci, id" + id); + //if( !et.getText().toString().trim().equals("") && ( et.isEnabled() || disableEditable.get(id) != null ) ) { + if( et.isEnabled() || disableEditable.get(id) != null ) { + //Log.d("my_debug", "2walid poprawnosci, id" + id); + et.setOnFocusChangeListener(new Walidacja_poprawnosci(jo.getString(STRUCT_WALIDACJA).trim(), typ_danych)); + //et.setOnFocusChangeListener(null); + } + } + + + + } + + protected JSONObject find_element_from_Array(JSONObject js, String id){ + return find_element_from_Array(js, "id", id); + } + + protected JSONObject find_element_from_Array(JSONObject js, String seek_key, String seek_value){ + JSONObject pola = null; + JSONObject ret = null; + try { + pola = js.getJSONObject("pola"); + Iterator k2 = pola.keys(); + JSONObject jo2 = null; + while (k2.hasNext()) { + String key2 = (String) k2.next(); + jo2 = pola.getJSONObject(key2); + ret = find_element( jo2, seek_key, seek_value ); + if( ret != null ) { + Log.d("my_debug", "znalazlem element, id: "+ret.getInt("id")); + break; + } + } + } catch (JSONException e) { + e.printStackTrace(); + } + return ret; + } + + protected JSONObject findElementByCodeAndAncestor( String code_to_find, String ancestor_id ) { + JSONObject jo = null; + JSONObject ancestor_jo = find_element_from_Array(js, ancestor_id); + if( ancestor_jo != null ) { + jo = find_element(ancestor_jo, "kod", code_to_find); + } + return jo; + } + + protected JSONObject find_element(JSONObject pola, String id) { + return find_element(pola, "id", id); + } + + protected JSONObject find_element(JSONObject pola, String seek_key, String seek_value) { + try { + //Log.d("my_debug", "finding"); + if( pola.has("id") ) { + //Log.d("my_debug", "finding, id:"+pola.getInt("id")+", given id: "+id); + } + if( pola.has(seek_key) && pola.getString(seek_key).equals(seek_value) ) { + return pola; + } + JSONArray ja = pola.getJSONArray(STRUCT_CHILDS); + //JSONArray temp; + if( ja!= null && ja.length()>0){ + //Log.d("my_debug", STRUCT_CHILDS); + JSONObject find = null; + for ( int i=0; i0){ + + String last = ja.getJSONObject(0).getString("id_wiersz_szablonu"); + + //llh.setOrientation(LinearLayout.VERTICAL); + // po kolumnach ! (nie po wierszach) +// Map> tab = new HashMap>(); +// HashMap temp = new HashMap(); + HashMap> tab = new HashMap>(); + HashMap tab_opisy = new HashMap(); + + + int w = 0; // nr kolumny + int k = 0; // nr wiersza + int ile_kolumn = 0; + + // budowanie tablicy z danymi + for ( int i=0; i temp = new HashMap(); + if( tab.get(k) != null ) { + //Log.d("my_debug", "pobieram, w: "+w+", k: "+k+", temp: "+tab.get(k)); + temp = tab.get(k); + + } + temp.put(w, jElem); + tab.put(k, temp); + last = jElem.getString("id_wiersz_szablonu"); + w++; + } + } + + ile_kolumn += 1; + int ile_wierszy = w; + + + + Log.d("my_debug", "opis: "+jo.getString(STRUCT_OPIS)+", ilosc_wierszy: "+ile_wierszy);//+", tab: "+tab); + + + + // wyświetlanie nagłówków kolumn + TableRow tr_opisy = new TableRow(this); + tr_opisy.setPadding(0, 0, 0, 2); // + tl.addView(tr_opisy); + for (int j = 0 ; j < tab_opisy.size() ; j++ ) { + LinearLayout llh_opis = new LinearLayout(this); + + TableRow.LayoutParams llp = new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); + llp.setMargins(0, 0, 2, 0);//2px right-margin + llh_opis.setBackgroundColor(Color.LTGRAY); + llh_opis.setLayoutParams(llp);//2px border on the right for the cell + + tr_opisy.addView(llh_opis); + TextView tw = new TextView(this); + llh_opis.addView(tw); + + if( tab_opisy.get(j) != null ) { + tw.setText( Html.fromHtml(tab_opisy.get(j)) ); + } + } + + ArrayList temp_ostatni_wiersz = new ArrayList(); + + // wyĹ›wietlanie zawartoĹ›ci tabeli + for (int j = 0 ; j < ile_wierszy ; j++ ) { + TableRow tr = new TableRow(this); + tl.addView(tr); + for (int i = 0 ; i < ile_kolumn ; i++ ) { + + LinearLayout llh = new LinearLayout(this); + tr.addView(llh); + llh.setBackgroundColor(Color.BLUE); + //tw.addView(llh); + if( tab.get(i) != null && tab.get(i).get(j) != null) { + wyswietlPole(llh, tab.get(i).get(j), false, enable); + + //Log.d("my_debug", "j: "+j+", size: "+tab.size()+" wart: "+tab.get(i).get(j).getString(STRUCT_WARTOST)); + if( j == ile_wierszy - 1 ) { //komĂłrka z ostatniego wiersz'a + //Log.d("my_debug", "wlazlem ostatni wiersz"); + temp_ostatni_wiersz.add(tab.get(i).get(j).getInt("id")); + } + } + + } + } + + //Log.d("my_debug", STRUCT_OPIS+jo.getString(STRUCT_OPIS)+", temp_ostatni_wiersz: "+temp_ostatni_wiersz); + if( temp_ostatni_wiersz != null && temp_ostatni_wiersz.size() > 0 ) { + tabela_ostatni_wiersz.put(jo.getInt("id"), temp_ostatni_wiersz); + } + // + + } + + Log.d("DedalActivity", jo.toString()); + + // wyswietlanie przycisków dodaj wiersz i usuń wiersz + if( enable && ( jo.has(STRUCT_KLIENT) && !jo.getString(STRUCT_KLIENT).equals("tak") ) ) { + + //LinearLayout new_rows = new LinearLayout(this); + //new_rows.setOrientation(LinearLayout.VERTICAL); + //ll.addView(new_rows); + + Opcje op = new Opcje(jo); + if( !(op.check_opcje("simple_line")) ) { + LinearLayout buttons = new LinearLayout(this); + buttons.setOrientation(LinearLayout.HORIZONTAL); + +// if( !js.has("sub") ) { + + Button bu = new Button(this); + bu.setText( res.getString(R.string.dodaj_wiersz) ); + OnClickListener nClickL = new Dodaj_wiersz(tl, jo); + bu.setOnClickListener(nClickL); + buttons.addView(bu); + + Button bu2 = new Button(this); + bu2.setText( res.getString(R.string.usun_wiersz) ); + OnClickListener nClickL2 = new Usun_wiersz(tl, jo); + bu2.setOnClickListener(nClickL2); + buttons.addView(bu2); + + ll.addView(buttons); + } + } + } + + protected void wyswietl_checkbox(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable ) throws JSONException{ + wyswietl_checkbox(ll, jo, withOpis, enable, null ); + } + + protected ScrollView sw; + protected void wyswietl_checkbox(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable, final String status_interwencji ) throws JSONException{ + + //checkbox + CheckBox cb = new CheckBox(DedalActivity.this); + + cb.setTextSize(25); + if( isGrey) { + cb.setBackgroundColor(Color.LTGRAY); + } + +// cb.setScaleX(1.5f); +// cb.setScaleY(1.5f); +// + ViewGroup.LayoutParams params = cb.getLayoutParams(); + + LinearLayout.LayoutParams mlp = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); +// +// +// // Set left, top, right and bottom margins of Flex CheckBox + mlp.setMargins(5,5,5,5); + cb.setLayoutParams(mlp); +// +// // Apply right padding of Flex CheckBox + cb.setPadding(0,5,5,0); // było 5,5,5,5 + + //toggle button + //ToggleButton cb = new ToggleButton(DedalActivity.this); + + // button +// Button cb = new Button(DedalActivity.this); +// cb.setBackgroundResource(android.R.drawable.button_onoff_indicator_off); +// cb.setPadding(10,0,10, 0); + + if( jo.getString(STRUCT_KLIENT).equals("tak")){ + cb.setClickable(false); + } + +// RelativeLayout.LayoutParams chkBoxParams = new RelativeLayout.LayoutParams( +// // LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); +// 100, 100); +// +// cb.setLayoutParams(chkBoxParams); +// cb.setGravity(Gravity.CENTER); +// cb.setTextColor(Color.BLACK); + + + cb.setText(jo.getString(STRUCT_OPIS)); + //cb.setTextOff(jo.getString(STRUCT_OPIS)); + //cb.setTextOn(jo.getString(STRUCT_OPIS)); + + + cb.setId(jo.getInt("id")); + cb.setMinimumWidth(200); + + if( !enable ) { + cb.setEnabled(false); + } + + if( jo.getString(STRUCT_WARTOSC).equals("on")) { + cb.setChecked(true); + //cb.setBackgroundResource(android.R.drawable.button_onoff_indicator_on); + }else{ + if( !enable ) { return;} // nie wyswietlaj, gdy nie jest zaznaczony checkbox + } + if( jo.getString(STRUCT_KLIENT).equals("tak")){ + //cb.setClickable(false); + cb.setEnabled(false); + }else + cb.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + + y = sw.getScrollY(); + Log.d("my_debug", "Kliknięto check id: " + v.getId()); + setModified(); + //Checkox c = (CheckBox) v; + boolean checked = ((CheckBox) v).isChecked(); + //boolean checked = ((ToggleButton) v).isChecked(); + LinearLayout subView = groupContainer.get(v.getId()); + subView.removeAllViews(); + + v.requestFocusFromTouch(); //prevents from loosing focus and scrolling view down + if (checked) { + + Log.d("my_debug", "check!" ); + //JSONArray ja = jo.getJSONArray(STRUCT_CHILDS); + JSONArray ja2 = checkJson.get(v.getId()); + if( ja2!= null && ja2.length()>0){ + for ( int i=0; i0){ + checkJson.put(bId, ja); + } + LinearLayout llv = new LinearLayout(DedalActivity.this); + llv.setOrientation(LinearLayout.VERTICAL); + + if( ja!= null && ja.length()>0){ + JSONObject jb =ja.getJSONObject(0); + Opcje op = new Opcje(jb); + if( op.check_opcje("fragment")){ + llv.setOrientation(LinearLayout.HORIZONTAL); + // ll.setOrientation(LinearLayout.HORIZONTAL); + LinearLayout lln = new LinearLayout(DedalActivity.this); + lln.setOrientation(LinearLayout.HORIZONTAL); + ll.addView(lln); + ll = lln; + } + } + + ll.addView(cb); + + + if( jo.getString(STRUCT_WARTOSC).equals("on")) { + wyswietl_Dzieci(llv, jo, withOpis, enable, status_interwencji); + } + + ll.addView(llv); + + groupContainer.put(jo.getInt("id"), llv); + } + + protected void wyswietl_radiolista(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable ) throws JSONException{ + wyswietl_radiolista(ll, jo, withOpis, enable, null ); + } + + String status_interwencji_temp = null; + + protected void wyswietl_radiolista(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable, String status_interwencji ) throws JSONException{ + LinearLayout ll_wrapper = new LinearLayout(DedalActivity.this); + ll_wrapper.setOrientation(LinearLayout.VERTICAL); + ll.addView(ll_wrapper); + + wyswietlOpis(ll_wrapper, jo); + RadioGroup rg = new RadioGroup(DedalActivity.this); + if( !enable ) { + rg.setEnabled(false); + } + Opcje op = new Opcje(jo); + //String opcje = jo.getString(STRUCT_OPCJE); + if( op.check_opcje("zakladka") || op.check_opcje("col") ){ + rg.setOrientation(LinearLayout.HORIZONTAL); + }else{ + rg.setOrientation(LinearLayout.VERTICAL); + } + Integer idG =jo.getInt("id"); + rg.setId(idG); + + if( jo.getString(STRUCT_KLIENT).equals("tak")){ + rg.setBackgroundColor(Color.LTGRAY); + } + + LinearLayout llv = new MLinearLayout(DedalActivity.this); + llv.setOrientation(LinearLayout.VERTICAL); + llv.setPadding(20, 0, 0, 0); +// llv.setBackgroundColor(); + if( jo.getString(STRUCT_KLIENT).equals("tak") || !enable){ + llv.setBackgroundColor(Color.parseColor("#B0E0E6")); + } + if( enable){ + llv.setBackgroundColor(Color.parseColor("#FAFAD2")); + } + + radiogroups.put(jo.getInt("id"), new ArrayList()); + ll_wrapper.addView(rg); + + JSONArray ja = jo.getJSONArray(STRUCT_CHILDS); + String selected = jo.getString(STRUCT_WARTOSC); + if( ja!= null && ja.length()>0){ + // sprawdzanie czy w radiobuttonach jest jakiś z opcją referencja + JSONObject radio_ref_jo = null; + for ( int i=0; i0){ + radioJson.put(bId, ja2); + } + + + if( selected.equals(wiersz_szablonu)){ + if( rb instanceof RadioButton) { + ((RadioButton)rb).setChecked(true); + wyswietl_Dzieci(llv, jo2, withOpis, enable, status_interwencji); + + }else{ + // rb.setBackgroundColor(Color.BLUE); //todo. + rb.setBackgroundResource(android.R.drawable.button_onoff_indicator_on); + if( !enable) { // wyświetl dzieci, jak jest tylko podgląd. + wyswietl_Dzieci(llv, jo2, withOpis, enable, status_interwencji); + } + } + }else{ + } + + + } + + if( radio_ref_jo != null ) { + if( !selected.equals(radio_ref_jo.getString(STRUCT_WIERSZ_SZABLONU)) ) { + Log.d("my_debug", "set onload invisible"); + supportOnLoadReferences = radio_ref_jo; + //supporRadioRef(radio_ref_jo, View.GONE); + } + } + } + + //Integer nId = lastId++; + // llv.setId(nId); + ll_wrapper.addView(llv); + groupContainer.put(idG, llv); + + + } + protected void wyswietl_attach(LinearLayout ll, JSONObject jo, String powtarzalny, Boolean enable ) throws JSONException{ + String kat; + if ( powtarzalny.equals(STRUCT_POWTARZALNY) ) { + kat = Integer.toString( jo.getInt("id") ); + } + else { + kat = jo.getString("kod"); + } + if ( enable ) { + ShortButton b = new ShortButton(this); + b.getButton().setText( res.getString(R.string.zrob_zdjecie) ); + b.getButton().setOnClickListener(new ZrobZdjecieListener(kat)); + ll.addView(b.getLinearLayout()); + } + File dir = new File(prefs.getString("dir", "") + "/mDedal/"+m_id+"/"+kat); + Log. d("my_debug", "path: "+prefs.getString("dir", "") + "/mDedal/"+m_id+"/"+kat); + if( dir.isDirectory()){ + File fs[] = dir.listFiles(); + if( fs != null && fs.length>0){ + for( int i=0; i destWidth) { + // picture is wider than we want it, we calculate + // its target height + int destHeight = origHeight + / (origWidth / destWidth); + // we create an scaled bitmap so it reduces the + // image, not just trim it + + bitmap = Bitmap.createScaledBitmap(bitmap, + destWidth, destHeight, false); + } + iw.setImageBitmap(bitmap); + } + } catch (Exception ex){ + Log.e("BITMAP", "plik uszkodzony: " + oFU.getPath()); + return; + } + + + // iw.set + ll.addView(iw); + LinearLayout llv = new LinearLayout(this); + llv.setOrientation(LinearLayout.HORIZONTAL); + ll.addView(llv); + + TextView tw3 = new TextView(this); +// Linkify.addLinks(tw3, mask); + tw3.setText( res.getString(R.string.zdjecie)+": " + file.getName()); + if( file.getName().contains(".pdf")){ + Button bu = new Button(this); + bu.setText("Wyswietl PDF"); + + OnClickListener nClickL = new OnClickListener() { + String m_file = file.getAbsolutePath(); + //String m_for_update = m_file.replace("mDedal", "upload") + ".del"; + @Override + public void onClick(View v) { + File f = new File(m_file); + PackageManager packageManager = getPackageManager(); + Intent testIntent = new Intent(Intent.ACTION_VIEW); + testIntent.setType("application/pdf"); + List list = packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY); + if (list.size() > 0 && f.isFile()) { + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + Uri uri = Uri.fromFile(f.getAbsoluteFile()); + intent.setDataAndType(uri, "application/pdf"); + startActivity(intent); + } + }}; + + bu.setOnClickListener(nClickL); + llv.addView(bu); + } + llv.addView(tw3); + + //button usun zdjÄ™cie + if ( enable ) { + Button bu = new Button(this); + bu.setText( res.getString(R.string.usun_zdjecie) ); + + OnClickListener nClickL = new OnClickListener() { + String m_file = file.getAbsolutePath(); + String m_for_update = m_file.replace("mDedal", "upload") + ".del"; + @Override + public void onClick(View v) { + // usun plik + File fusun = new File(m_file); + File fUpload = new File(m_for_update); + fusun.renameTo(fUpload); + //fusun.delete(); + + // todo: tymczasowe zakomentowanie + //DedalActivity.this.recreate(); + reload(); + }}; + + bu.setOnClickListener(nClickL); + llv.addView(bu); + } + + } + } + } + + //File myFile = new File(Environment.getExternalStorageDirectory() + "/mDedal/"+m_id+"/"+ fileName); + + //File file = new File(Environment.getExternalStorageDirectory(), "test.jpg"); + + } + + protected void wyswietl_foto(LinearLayout ll, JSONObject jo, Boolean enable ) throws JSONException{ +// String typ_danych = jo.getString(STRUCT_TYP_DANYCH); +// TextView tw2 = new TextView(this); +// tw2.setText("typ: to jest " + typ_danych); +// ll.addView(tw2); + + Log.d("my_debug", "wyswietl_foto"); + + //String kod = jo.getString("kod"); + String wartosc = jo.getString(STRUCT_WARTOSC); + + if ( !first_foto_displayed && enable ) { + //if(jo.getInt("id") == ostatni_powtarzalny.get(jo.getInt("parent")).get(jo.getInt("id_wiersz_szablonu"))) { + Button b = new Button(this); + b.setText( res.getString(R.string.zrob_zdjecie) ); + b.setOnClickListener(new ZrobZdjecieListener("foto_typ")); + ll.addView(b); + } + + // wyďż˝wietlanie zdj�� przed chwilďż˝ zrobionych + if ( !first_foto_displayed ) { + File dir_upload = new File(prefs.getString("dir", "") + "/upload/"+m_id+"/foto_typ"); + + if( dir_upload.isDirectory()){ + File fs[] = dir_upload.listFiles(); + if( fs != null && fs.length>0){ + //File f_file; + Bitmap bitmap; + for( int i=0; i destWidth) { + // picture is wider than we want it, we calculate + // its target height + int destHeight = origHeight + / (origWidth / destWidth); + // we create an scaled bitmap so it reduces the + // image, not just trim it + + bitmap = Bitmap.createScaledBitmap(bitmap, + destWidth, destHeight, false); + } + } + iw_t.setImageBitmap(bitmap); + + //iw.set + ll.addView(iw_t); + LinearLayout llv_t = new LinearLayout(this); + llv_t.setOrientation(LinearLayout.HORIZONTAL); + ll.addView(llv_t); + + TextView tw3_t = new TextView(this); + tw3_t.setText(res.getString(R.string.zdjecie) + ": " + file.getName()); + //tw3.setText("zdjÄ™cie: " + wartosc); + llv_t.addView(tw3_t); + + //button usun zdjďż˝cie + Button bu_t = new Button(this); + bu_t.setText( res.getString(R.string.usun_zdjecie) ); + OnClickListener nClickL_t = new OnClickListener() { + File file_loc = new File(file.getAbsolutePath()); + @Override + public void onClick(View v) { + file_loc.delete(); + + reload(); + }}; + + bu_t.setOnClickListener(nClickL_t); + llv_t.addView(bu_t); + } + + } + } + } + } + +// + + File dir = new File(prefs.getString("dir", "") + "/mDedal/"+m_id+"/foto_typ"); + Log.d("my_debug", "path: "+prefs.getString("dir", "") + "/mDedal/"+m_id+"/foto_typ"); + Log.d("my_debug", "dir: "+dir); + if( dir.isDirectory()){ + File file_te = new File(prefs.getString("dir", "") + "/mDedal/"+m_id+"/foto_typ/"+wartosc); + file = file_te; + + Log.d("my_debug", "file: "+file); + + Uri oFU = Uri.fromFile(file); + + ImageView iw = new ImageView(this); + +// Bitmap bitmap = BitmapFactory.decodeFile(oFU.getPath()); + byte [] bytes = DedalHelper.getCryptFileContent(file.getAbsolutePath()).getBytes(); + Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); + + if( bitmap != null){ + int origWidth = bitmap.getWidth(); + int origHeight = bitmap.getHeight(); + + final int destWidth = 300;//or the width you need + + if(origWidth > destWidth){ + // picture is wider than we want it, we calculate its target height + int destHeight = origHeight/( origWidth / destWidth ) ; + // we create an scaled bitmap so it reduces the image, not just trim it + bitmap = Bitmap.createScaledBitmap(bitmap, destWidth, destHeight, false); + } + + iw.setImageBitmap(bitmap); + + ll.addView(iw); + } + LinearLayout llv = new LinearLayout(this); + llv.setOrientation(LinearLayout.HORIZONTAL); + ll.addView(llv); + + TextView tw3 = new TextView(this); + + if( file.getName().contains(".pdf")){ + Button bu = new Button(this); + bu.setText("Wyswietl PDF"); + + OnClickListener nClickL = new OnClickListener() { + String m_file = file.getAbsolutePath(); + //String m_for_update = m_file.replace("mDedal", "upload") + ".del"; + @Override + public void onClick(View v) { + File f = new File(m_file); + PackageManager packageManager = getPackageManager(); + Intent testIntent = new Intent(Intent.ACTION_VIEW); + testIntent.setType("application/pdf"); + List list = packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY); + if (list.size() > 0 && f.isFile()) { + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + Uri uri = Uri.fromFile(f.getAbsoluteFile()); + //todo: change to internet access to DEDAL + intent.setDataAndType(uri, "application/pdf"); + startActivity(intent); + } + }}; + + bu.setOnClickListener(nClickL); + llv.addView(bu); + } + + if(file.exists()) { + //tw3.setText("zdjďż˝cie: " + file.getName()); + tw3.setText(res.getString(R.string.zdjecie)+": " + wartosc); + llv.addView(tw3); + //button usun zdjďż˝cie + if( !wartosc.equals("") && enable ) { + Button bu = new Button(this); + bu.setText( res.getString(R.string.usun_zdjecie) ); + + OnClickListener nClickL = new OnClickListener() { + String m_file = file.getAbsolutePath(); + String m_for_update = m_file.replace("mDedal", "upload") + ".del"; + @Override + public void onClick(View v) { + + Log.d("my_debug", "usuwam, m_file:"+ m_file+", m_for_update: " + m_for_update ); + // usun plik + File fusun = new File(m_file); + File fUpload = new File(m_for_update); + fusun.renameTo(fUpload); + // todo: tymczasowe zakomentowanie + //DedalActivity.this.recreate(); + reload(); + }}; + + bu.setOnClickListener(nClickL); + llv.addView(bu); + } + } + + //} + //} + } + if ( !first_foto_displayed ) { + first_foto_displayed = true; + } + //File myFile = new File(Environment.getExternalStorageDirectory() + "/mDedal/"+m_id+"/"+ fileName); + + //File file = new File(Environment.getExternalStorageDirectory(), "test.jpg"); + + } + + protected void wyswietl_special(LinearLayout ll, JSONObject jo, Boolean withOpis, Boolean enable ) throws JSONException{ + + LinearLayout llv = ll; + String typ_danych = jo.getString(STRUCT_TYP_DANYCH); + String opcje = jo.getString(STRUCT_OPCJE); + if( withOpis) { + // + ll = new LinearLayout(this); +// ll.setBackgroundColor(Color.MAGENTA); +// if ( "nr_tel_mail".equals(opcje) ){ +// ll.setOrientation(LinearLayout.VERTICAL); +// } +// else { + ll.setOrientation(LinearLayout.HORIZONTAL); + //} + llv.addView(ll); + //} + wyswietlOpis(ll, jo); + } + if( opcje.equals("dokumenty_fin") || + opcje.equals("adres_dodatkowy")|| + opcje.equals("nr_tel_mail") ){ + ll.setOrientation(LinearLayout.VERTICAL); + } + //wyswietlOpis(ll, jo); + + + //Log.d("my_debug", "special: typ: "+ opcje); + + if( "adres_podst".equals(opcje)){ + JSONObject adres = js.getJSONObject("adres_podst"); + String adr = adres.getString("kod_pocztowy")+ " " + adres.getString("miasto") + + " " + adres.getString("miejscowosc") + + " ul. " + adres.getString("ulica") + + " " + adres.getString("nr_domu"); +// TextView two = new TextView(this); +// two.setText(adr); +// ll.addView(two); + wyswietl_text_ramka(ll, adr); + }else if("adres_dodatkowy".equals(opcje)) { +// JSONArray ja = js.getJSONArray("adresy_dodatkowe"); +// if( ja!= null && ja.length()>0){ +// for ( int i=0; i0){ +// for ( int i=0; i0){ +// for ( int i=0; i0){ + for ( int i=0; i(); + dluznikItems_id_dluznik = new ArrayList(); + Log.d("my_debug", "ja_dluznicy.lenght: " + ja_dluznicy.length()); + for( int i = 0 ; i < ja_dluznicy.length() ; i++ ) { + + JSONObject jo_dluznik = ja_dluznicy.getJSONObject(i); + + // wypełnienie tabeli globalnej aby można było wypełnić spinnera do wyboru dłużnika w interwencji + if( jo_dluznik.has("imie_nazwisko") && !"".equals(jo_dluznik.getString("imie_nazwisko")) ) { + dluznikItems_names.add(jo_dluznik.getString("imie_nazwisko")); + } + else if( jo_dluznik.has("nazwa_firmy") && !"".equals(jo_dluznik.getString("nazwa_firmy")) ) { + dluznikItems_names.add(jo_dluznik.getString("nazwa_firmy")); + } + dluznikItems_id_dluznik.add(jo_dluznik.getString("id")); + + Log.d("my_debug", "aktywny: "+jo_dluznik.getString("aktywny")); + +// if( !jo_dluznik.has("aktywny") || !"1".equals(jo_dluznik.getString("aktywny")) ) { +// continue; +// } + //Log.d("my_debug", "aktywny: "+jo_dluznik.getString("aktywny")); + Log.d("my_debug", "key: "+i); + LinearLayout ll_dluznik = new BorderLinearLayout(this); + ll_dluznicy.addView(ll_dluznik); + ll_dluznik.setOrientation(LinearLayout.VERTICAL); + ll_dluznik.setPadding(5,5,5,5); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); + layoutParams.setMargins(0, 0, 0, 20); + ll_dluznik.setLayoutParams(layoutParams); + + TextView tv_imie_nazwisko = new TextView(this); + tv_imie_nazwisko.setTextSize(dluznicy_text_size+4); + ll_dluznik.addView(tv_imie_nazwisko); + tv_imie_nazwisko.setText(Html.fromHtml("Imie i nazwisko: "+jo_dluznik.getString("imie_nazwisko")+"")); + + TextView tv_nazwa_firmy = new TextView(this); + tv_nazwa_firmy.setTextSize(dluznicy_text_size); + ll_dluznik.addView(tv_nazwa_firmy); + tv_nazwa_firmy.setText(Html.fromHtml("Nazwa firmy: "+jo_dluznik.getString("nazwa_firmy")+"")); + + TextView tv_pesel = new TextView(this); + tv_pesel.setTextSize(dluznicy_text_size); + ll_dluznik.addView(tv_pesel); + tv_pesel.setText(Html.fromHtml("PESEL: "+jo_dluznik.getString("pesel")+"")); + + TextView tv_nr_dowodu = new TextView(this); + tv_nr_dowodu.setTextSize(dluznicy_text_size); + ll_dluznik.addView(tv_nr_dowodu); + tv_nr_dowodu.setText(Html.fromHtml("Nr dowodu: "+jo_dluznik.getString("nr_dowodu")+"")); + + TextView tv_nip = new TextView(this); + tv_nip.setTextSize(dluznicy_text_size); + ll_dluznik.addView(tv_nip); + tv_nip.setText(Html.fromHtml("NIP: "+jo_dluznik.getString("nip")+"")); + + if( jo_dluznik.has("adresy") ) { + wyswietl_adresy(ll_dluznik, jo_dluznik.getJSONArray("adresy"), dluznicy_text_size, Typeface.BOLD ); + } + + if( jo_dluznik.has("telefony") ) { + wyswietl_telefony(ll_dluznik, jo_dluznik.getJSONArray("telefony"), dluznicy_text_size, Typeface.BOLD); + } + + //break; + } + +// Iterator k = jo_dluznicy.keys(); +// while (k.hasNext()) { +// String key = (String) k.next(); +// +// JSONObject jo_dluznik = jo_dluznicy.getJSONObject(key); +// Log.d("my_debug", "aktywny: "+jo_dluznik.getString("aktywny")); +// if( !jo_dluznik.has("aktywny") || !"1".equals(jo_dluznik.getString("aktywny")) ) { +// continue; +// } +// //Log.d("my_debug", "aktywny: "+jo_dluznik.getString("aktywny")); +// Log.d("my_debug", "key: "+key); +// LinearLayout ll_dluznik = new LinearLayout(this); +// ll_dluznicy.addView(ll_dluznik); +// ll_dluznik.setOrientation(LinearLayout.VERTICAL); +// +// TextView tv_imie_nazwisko = new TextView(this); +// ll_dluznik.addView(tv_imie_nazwisko); +// tv_imie_nazwisko.setText("Imie i nazwisko: "+jo_dluznik.getString("imie_nazwisko")); +// +// TextView tv_nazwa_firmy = new TextView(this); +// ll_dluznik.addView(tv_nazwa_firmy); +// tv_nazwa_firmy.setText("Nazwa firmy: "+jo_dluznik.getString("nazwa_firmy")); +// +// break; +// } + + } + } + + protected void wyswietl_adresy(LinearLayout ll, JSONArray ja) { + wyswietl_adresy(ll, ja, 0, 0); + } + + protected void wyswietl_adresy(LinearLayout ll, JSONArray ja, int text_size, int typeface_style) { + TableLayout tl = new TableLayout(this); + tl.setPadding(0, 15, 0, 0); + ll.addView(tl); + TableRow tr_opisy = new TableRow(this); + tr_opisy.setPadding(0, 0, 0, 2); // + tl.addView(tr_opisy); + + // NAGŁÓWKI + TextView tw[] = new TextView[7]; + for( int i = 0 ; i < 7 ; i++ ) { + LinearLayout llh_opis = new LinearLayout(this); + + TableRow.LayoutParams llp = new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); + llp.setMargins(0, 0, 2, 0);//2px right-margin + llh_opis.setBackgroundColor(Color.LTGRAY); + llh_opis.setLayoutParams(llp);//2px border on the right for the cell + + tr_opisy.addView(llh_opis); + tw[i] = new TextView(this); + llh_opis.addView(tw[i]); + + } + tw[0].setText("Kod");tw[1].setText("Miasto");tw[2].setText("Miejscowość");tw[3].setText("Ulica");tw[4].setText("Numer domu");tw[5].setText("Zweryfikowany?");tw[6].setText("Typ adresu"); + + // ZAWARTOŚĆ + try { + LinearLayout llh[] = new LinearLayout[7]; + if( ja!= null && ja.length()>0){ + for ( int i=0; i0){ + for ( int i=0; i 0 ) { + two.setTextSize(text_size); + } + two.setTypeface(null, typeface_style); // 0 is normal + + ll.addView(two); + } + + + public String foto_kod = null; + public String foto_name = null; + + + protected final class DokKollektoBtnListener implements OnClickListener { + + String id_zlecenia; + JSONArray dkJson; + + public DokKollektoBtnListener(String id_zlecenia, JSONArray dkJson) { + this.id_zlecenia = id_zlecenia; + this.dkJson = dkJson; + } + + @Override + public void onClick(View v) { + Log.d("my_debug", "click Dokumenty Kollekto, id_zlecenia: "+id_zlecenia); + Intent intent = new Intent(DedalActivity.this, getDokumentyKollektoActivity()); + intent.putExtra("id_zlecenia", id_zlecenia); + intent.putExtra("dkJson", dkJson.toString()); + startActivity(intent); + } + } + + protected final class Ustaw_date implements OnClickListener { + String opcje; + public Ustaw_date(String opcje) { + this.opcje = opcje; + } + + @Override + public void onClick(View v) { + cur_Date_id = ((ButtonDate)v).getEdId(); + //EditText et = (EditText)DedalActivity.this.findViewById(cur_Date_id); + //et.setText("00"); + cur_Date_opcje = this.opcje; + showDialog(DATE_DIALOG_ID); + } + } + + protected final class Dodaj_wiersz implements OnClickListener { + + TableLayout tl; + JSONObject jo; + + public Dodaj_wiersz(TableLayout tl, JSONObject jo) { + this.tl= tl; + this.jo = jo; + } + + @Override + public void onClick(View v) { + Log.d("my_debug", "onclick: dodaj wiersz"); + //Log.d("my_debug", "jo: "+jo.toString()); + try { + setModified(); + //Log.d("my_debug", "tabela_ostatni_wiersz stara: "+tabela_ostatni_wiersz); + + TableRow tr = new TableRow(DedalActivity.this); + tl.addView(tr); + + JSONArray ja = jo.getJSONArray(STRUCT_CHILDS); + LinearLayout llh = null;//new LinearLayout(this); + if( ja!= null && ja.length()>0){ + + String last = "";//ja.getJSONObject(0).getString("id_wiersz_szablonu"); + + //Log.d("my_debug", "ja.length: "+ja.length()); + + //llh.setOrientation(LinearLayout.VERTICAL); + ArrayList temp = new ArrayList(); + for ( int i=0 ; i < ja.length() ; i++){ + JSONObject j = ja.getJSONObject(i); + //Log.d("my_debug", "last: "+last+", id_w_s: "+j.getString("id_wiersz_szablonu")); + + if( !last.equals(j.getString("id_wiersz_szablonu")) && !j.has("id-orig")){ + //Log.d("my_debug","roznee !!!!!!!!!!"); + llh = new LinearLayout(DedalActivity.this); + tr.addView(llh); + + JSONObject newFiled = new JSONObject(j.toString()); +// maxId++; +// newFiled.put("id", maxId); +// newFiled.put(STRUCT_WARTOST, ""); +// newFiled.put("id-orig", j.getInt("id")); + add_id_orig(newFiled); + jo.getJSONArray(STRUCT_CHILDS).put(newFiled); + + // zmiana w tabeli tabela_ostatni_wiersz + //temp.add(maxId); + temp.add(newFiled.getInt("id")); + + /// + //Log.d("my_debug", "dodawanie, typ_danych: "+newFiled.getString(STRUCT_TYP_DANYCH)+", maxId: "+maxId+", id: "+newFiled.getString("id")+", id_orig: "+newFiled.getString("id-orig") ); + wyswietlPole(llh, newFiled, false, true); + + last = j.getString("id_wiersz_szablonu"); + + } + else { + //Log.d("my_debug","rownee"); + } + + + } + Log.d("my_debug", "tabela_wiersz_ostatni stara: " + tabela_ostatni_wiersz.get(jo.getInt("id"))); + if(temp != null && temp.size() > 0) { + tabela_ostatni_wiersz.put(jo.getInt("id"), temp); + } + Log.d("my_debug", "tabela_wiersz_ostatni nowa: " + tabela_ostatni_wiersz.get(jo.getInt("id"))); + } + + napraw_kolejnosc(); + + //Log.d("my_debug", "tabela_ostatni_wiersz nowa: "+tabela_ostatni_wiersz); + //Log.d("my_debug", "jo: "+jo.toString()); + + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + protected void napraw_kolejnosc() { + JSONArray ja; + try { + + ArrayList listdata = new ArrayList(); + ja = jo.getJSONArray(STRUCT_CHILDS); + //JSONArray ja_copy = new JSONArray(ja.toString()); + if( ja!= null && ja.length()>0){ + for ( int i=0 ; i < ja.length() ; i++){ + //JSONObject j = ja.getJSONObject(i); + listdata.add(ja.getJSONObject(i)); + } + } + sortujKolejnosc(listdata); + JSONArray sorted_ja = new JSONArray(listdata); + jo.remove(STRUCT_CHILDS); + jo.put(STRUCT_CHILDS, sorted_ja); + //ja = sorted_ja; + + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + +// private void sortujKolejnosc(ArrayList aM) { +// Collections.sort(aM, new Comparator() { +// @Override +// public int compare(JSONObject lhs, JSONObject rhs) { +// // TODO Auto-generated method stub +// try { +// if( lhs.getInt("kolejnosc") >(rhs.getInt("kolejnosc"))){ +// return 1; +// }else if( lhs.getInt("kolejnosc") < (rhs.getInt("kolejnosc"))){ +// return -1; +// }else{ +// if( lhs.getInt("id") > (rhs.getInt("id"))) +// return 1; +// else if ( lhs.getInt("id") < (rhs.getInt("id"))) +// return -1; +// return 0; +// } +// } catch (JSONException e) { +// // TODO Auto-generated catch block +// //e.printStackTrace(); +// } +// return 0; +// } +// }); +// } + } + + protected final class Usun_wiersz implements OnClickListener { + + // LinearLayout ll; + JSONObject jo; + + public Usun_wiersz(LinearLayout ll, JSONObject jo) { +// this.ll= ll; + this.jo = jo; + } + + @Override + public void onClick(View v) { + try { + setModified(); + if(jo.has("id")) { + int id = jo.getInt("id"); + int ilosc_wierszy = count_rows(); + // gdy ilość wierszy <= 1 ma nie usuwać ! + if( ilosc_wierszy > 1 ) { + usun_pola_json(); + if( tabela_ostatni_wiersz != null && tabela_ostatni_wiersz.get(id) != null ){ + ArrayList temp = tabela_ostatni_wiersz.get(id); + for( int i = 0 ; i < temp.size() ; i++) { + + Log.d("my_debug", "usuwam, id: "+temp.get(i)); + View element = DedalActivity.this.findViewById(temp.get(i)); + + if( element != null ) { + Log.d("my_debug", "znalazłem, id: "+temp.get(i)); + element.setVisibility(View.GONE); //invisible + } + } + } + set_tabela_ostatni_wiersz(); + + } + } + + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + protected int count_rows() { + JSONArray ja; + int ilosc_wierszy = 0; + try { + ja = jo.getJSONArray(STRUCT_CHILDS); + if( ja!= null && ja.length()>0){ + String last = ja.getJSONObject(0).getString("id_wiersz_szablonu"); + //ArrayList temp = new ArrayList(); + //boolean has_usun = false; + ilosc_wierszy = 1; + for ( int i=1; i0){ + String last = "";//ja.getJSONObject(0).getString("id_wiersz_szablonu"); + ArrayList temp = new ArrayList(); + boolean has_usun = false; + for ( int i=0; i 0 && temp.size() > i_temp ) { + if(j.has("id") && !j.has("usun")) { + temp.set(i_temp, j.getInt("id")); + } + } + else { + if(j.has("id") && !j.has("usun")) { + temp.add( j.getInt("id")); + } + } + + //Log.d("my_debug", "last: "+last+", j_next : "+j_next.getString("id_wiersz_szablonu")); + if( !last.equals(j_next.getString("id_wiersz_szablonu") ) ) { + i_temp++; + //Log.d("my_debug", "zwiekszam i_temp: "+i_temp); + } + + } + //} + } + + +// if( i+1 < ja.length() ) { +// JSONObject j_next = ja.getJSONObject(i+1); +// // jeĹ›li nastÄ™pny element jest pierwszym elementem kolumny to znaczy ĹĽe ten element jest ostatnim elementem kolumny +// if(j.has("id")) { +// if( !j_next.has("id") || j_next.has("usun") ) { +// temp.add(j.getInt("id")); +// czy_ostatni = true; +// has_usun = true; +// } +// else +// if( !last.equals(j_next.getString("id_wiersz_szablonu")) && !has_usun){ +// czy_ostatni = true; +// temp.add(j.getInt("id")); +// } +// } +// } + +// else { +// if( !has_usun ){ +// czy_ostatni = true; +// } +// } + //Log.d("my_debug", "id: "+j.getInt("id")+", has_usun: "+has_usun); + if(czy_ostatni) { + + } + } + Log.d("my_debug", "tabela_wiersz_ostatni stara: " + tabela_ostatni_wiersz.get(jo.getInt("id"))); + if(temp != null && temp.size() > 0) { + tabela_ostatni_wiersz.put(jo.getInt("id"), temp); + } + Log.d("my_debug", "tabela_wiersz_ostatni nowa: " + tabela_ostatni_wiersz.get(jo.getInt("id"))); + } + + + + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + + protected void usun_pola_json() { + JSONArray ja; + try { + int id = jo.getInt("id"); + ja = jo.getJSONArray(STRUCT_CHILDS); + // przeszukiwanie po polach tabeli + if( ja!= null && ja.length()>0){ + for ( int i=0; i temp = tabela_ostatni_wiersz.get(id); + // sprawdzanie czy dane pole jest z ostatniego wiersza + for( int j = 0 ; j < temp.size() ; j++) { + // znaleziony element jest z ostatniego wiersza + //Log.d("my_debug", "elem.int: "+) + if( elem.has("id") && elem.getInt("id") == temp.get(j) ) { + if( !elem.has("id-orig") ) { + //jo.put("id", jo.getInt("id")+"-usun"); + //Log.d("my_debug", "usuwam dobre: id: "+elem.getInt("id")); + elem.put("usun", "true"); + } + if( elem.has("id-orig") ) { + if( js.has("sub") ) { + elem.put("usun", "true"); + } + else { + elem.remove("id"); + elem.remove("id-orig"); + } + //Log.d("my_debug", "usuwam: id: "+elem.getInt("id")+" id-orig: "+elem.getInt("id-orig")); + + } + } + } + } + } + } + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + } + } + + + protected final class Walidacja_poprawnosci implements OnFocusChangeListener { + + protected final class Set_focus_runnable implements Runnable { + EditText et; + + public Set_focus_runnable(EditText et) { + this.et = et; + } + + @Override + public void run() { + et.requestFocus(); + + } + } + + String typ_danych; + String walidacja; + + public Walidacja_poprawnosci(String walidacja, String typ_danych) { + this.walidacja = walidacja; + this.typ_danych = typ_danych; + } + + @Override + public void onFocusChange(View v, boolean hasFocus) { + //Log.d("my_debug", "zejscie1"); + try { + EditText et = (EditText) v; + if (!hasFocus) { + String value = et.getText().toString().trim(); + if (!value.equals("")) { + + String pattern = null; + String komunikat = null; + if (walidacja != null && walidacja.equals("kod_pocztowy")) { // kod pocztowy + pattern = "[0-9]{2}-[0-9]{3}"; + if (!value.matches(pattern)) { + komunikat = res.getString(R.string.walid_kod_pocztowy) + ", np. 12-345"; + } + } else if (walidacja != null && walidacja.equals("telefon")) { // telefon + value = value.replaceAll("\\s+", ""); // wycinanie spacji + pattern = "\\+?[0-9,\\(,\\)]*"; + if (!value.matches(pattern)) { + komunikat = res.getString(R.string.walid_nr_telefonu); + } + } else if (typ_danych != null && typ_danych.equals(TYPE_KWOTA)) { // kwota + pattern = "[0-9]{1,}\\,[0-9]{1,2}"; + String pattern2 = "[0-9]{1,}"; + if (!value.matches(pattern) && !value.matches(pattern2)) { + komunikat = res.getString(R.string.walid_kwota) + ", np. 123,45"; + } + + if (walidacja != null && walidacja.trim().length() > 0) { //Mateusz - dodanie warunku walidacji - wielokrotnosc + Integer wielokrotnosc = Integer.parseInt(walidacja); + + if (value != null && TextUtils.isDigitsOnly(value)) { + Integer kwota = Integer.parseInt(value); + if (kwota % wielokrotnosc != 0) { + if (wielokrotnosc == 10) { + komunikat = res.getString(R.string.walid_kwota_wielokrotnosc_10) + ", np. 120"; + } else { + komunikat = res.getString(R.string.walid_kwota_wielokrotnosc); + } + } + } else { + komunikat = res.getString(R.string.walid_kwota_wielokrotnosc) + " kwoty" + wielokrotnosc.toString(); + } + } + + } else if (typ_danych != null && typ_danych.equals(TYPE_LICZBA) && (walidacja == null || walidacja.equals(""))) { // liczba naturalna + pattern = "[0-9]{1,}"; + if (!value.matches(pattern)) { + komunikat = res.getString(R.string.walid_liczba_naturalna) + ", np. 123"; + } + } else if (typ_danych != null && typ_danych.equals(TYPE_LICZBA) && (walidacja != null && walidacja.equals("."))) { // liczba rzeczywista (część uĹ‚amkowa rozdzielona .) + pattern = "[0-9]{1,}\\.[0-9]{1,}"; + if (!value.matches(pattern)) { + komunikat = res.getString(R.string.walid_liczba_rzeczywista) + ", np. 123.4567"; + } + } else if (typ_danych != null && typ_danych.equals(TYPE_LICZBA) && (walidacja != null && walidacja.equals(","))) { // liczba rzeczywista (część uĹ‚amkowa rozdzielona ,) + pattern = "[0-9]{1,}\\,[0-9]{1,}"; + if (!value.matches(pattern)) { + komunikat = res.getString(R.string.walid_liczba_rzeczywista) + ", np. 123,4567"; + } + } + + if (komunikat != null) { + //Log.d("my_debug", "zejscie2"); + AlertDialog.Builder alertDialog = new AlertDialog.Builder(DedalActivity.this); + alertDialog.setTitle("Walidacja formatu"); + alertDialog.setMessage(komunikat); + alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + alertDialog.show(); + + et.post(new Set_focus_runnable(et)); + //et.requestFocus(); + + } + ; + } + + } + //Toast.makeText(getApplicationContext(), "unfocus", 2000).show(); + + }catch( + Exception e) + + { + Log.e("BLAD", "konfiguracja walidacji."); + } + } + } + + public void reload() { + + Intent intent = getIntent(); + overridePendingTransition(0, 0); + intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + finish(); + + overridePendingTransition(0, 0); + startActivity(intent); + } + + + + protected boolean is_notend_interventions( JSONObject pola) { + + return false; + } + + protected void add_usun_tag(JSONObject jo) { + JSONArray ja; + try { + if( jo.has("id") && !jo.has("id-orig") ) { + //jo.put("id", jo.getInt("id")+"-usun"); + jo.put("usun", "true"); + } + + if( jo.has("id") && jo.has("id-orig") ) { + if( js.has("sub") ) { + jo.put("usun", "true"); + } + else { + jo.remove("id"); + jo.remove("id-orig"); + } + } + + //jo.put(STRUCT_WARTOST, ""); + ja = jo.getJSONArray(STRUCT_CHILDS); + if( ja!= null && ja.length()>0){ + for ( int i=0; i 1 ) { + + if( view != null ) { + Log.d("my_debug", "remove, id: "+id); + //view.onMeasure(0,0); + //((ViewManager)view.getParent()).removeView(view); + view.setVisibility(View.GONE); //invisible + + v.setVisibility(View.GONE); + + + } + else { + Log.d("my_debug", "remove, id: "+id+" is null"); + } + + add_usun_tag(jo); + + if ( ilosc_powtarzalnych.get(jo.getInt("parent")).get(jo.getInt("id_wiersz_szablonu")) != null ) { + HashMap temp = new HashMap(); + temp.put(jo.getInt("id_wiersz_szablonu"), ilosc-1); + ilosc_powtarzalnych.put(jo.getInt("parent"), temp); + //Log.d("my_debug", "zmniejszam, ilosc: "+(ilosc-1)); + } + } + else { + Log.d("my_debug", "nie moĹĽna usunąć ostatniego pola !"); + } + + + + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } + + protected JSONObject add_id_orig(JSONObject jo) { + + JSONArray ja; + try { + jo.put("id-orig", jo.getInt("id")); + maxId++; + jo.put("id", maxId); + jo.put(STRUCT_WARTOSC, ""); + if( jo.has("usun") ) { + jo.remove("usun"); + } + + ja = jo.getJSONArray(STRUCT_CHILDS); + if( ja!= null && ja.length()>0){ + for ( int i=0; i 1 && parts[1].equals("usun") ) { +// id = Integer.parseInt(parts[0]); +// } +// else { + id = jo.getInt("id"); +// } + + + // Iterator k = pola.keys(); + //JSONObject find = null; + //JSONObject jo = null; + +// EditText et = new EditText(DedalActivity.this); +// et.setText("tralalal"); +// ll.addView(et); + + if( jo != null ) { + //Log.d("my_debug", "find json, id: "+id+", parent: " + jo.getInt("parent")); + Iterator k2 = pola.keys(); + JSONObject parent = null; + JSONObject jo2 = null; + String find_id = null; + while (k2.hasNext()) { + String key2 = (String) k2.next(); + jo2 = pola.getJSONObject(key2); + //Log.d("my_debug", "next val: "+jo.getInt("id")+"key: "+key2); + + find_id = jo.getString("parent"); + + //Log.d("my_debug", "find_id: "+find_id); + parent = find_element( jo2, find_id ); + if( parent != null ) { + Log.d("my_debug", "znalazlem parenta, id: "+parent.getInt("id")); + break; + } + } + if(parent != null) { + JSONObject newFiled = new JSONObject(jo.toString()); + //Log.d("my_debug", "jo-string: "+jo.toString()); + //Log.d("my_debug", "newFiled-string: "+newFiled.toString()); + maxId++; + //int newId = maxId + 1; + //newFiled.put("id", maxId); + add_id_orig(newFiled); + + newFiled.put("id-orig", id); + //parent.put(STRUCT_CHILDS, newFiled); + parent.getJSONArray(STRUCT_CHILDS).put(newFiled); + //Log.d("my_debug", "parent-string: "+parent.toString()); + //Log.d("my_debug", "json: "+js.toString()); + + if ( ilosc_powtarzalnych.get(jo.getInt("parent")).get(jo.getInt("id_wiersz_szablonu")) != null ) { + Integer ilosc = ilosc_powtarzalnych.get(jo.getInt("parent")).get(jo.getInt("id_wiersz_szablonu")); + HashMap temp = new HashMap(); + temp.put(jo.getInt("id_wiersz_szablonu"), ilosc+1); + ilosc_powtarzalnych.put(jo.getInt("parent"), temp); + //Log.d("my_debug", "zwiekszam, ilosc: "+(ilosc+1)); + } + + //newFiled.put("dodaj_nowy", "false"); + wyswietlPole(ll, newFiled ); + } + + + //Log.d("my_debug", "wyswietl, id: "+jo.getInt("id")+", parent: " + jo.getInt("parent")); + setModified(); + } + + + + //Log.d("my_debug", "find json, id: "+jo.getInt("id")); + //Log.d("my_debug", "find json, id: "+jo.getInt("id")+", parent: "+jo.getInt("parent")); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //ll.addView(DedalActivity.this.findViewById(v.getId())); + } + } + + + + protected class ZrobZdjecieListener implements OnClickListener { + + + String folder = "empty"; + public ZrobZdjecieListener( String kod ){ + folder = kod; + } + + @Override + public void onClick(View v) { + // zapisanie zdjďż˝cia + //File file = new File(Environment.getExternalStorageDirectory(), "test.jpg"); + +// File fileD = new File(Environment.getExternalStorageDirectory() + "/mDedal/"+m_id+"/"+folder ); +// File fileD = new File(Environment.getExternalStorageDirectory() + "/mDedal" ); +// File fileD = new File(getFilesDir().getAbsolutePath() + "/mDedal/"+m_id+"/"+folder ); + File fileD = new File(prefs.getString("dir", "")+ "/mDedalCam" ); + if( !fileD.isDirectory()){ + fileD.mkdirs(); + } + + Date d = new Date(); + String genName = "foto_"+d.getTime() + ".jpg"; + foto_kod = folder; + foto_name = genName; + + forceDoZapis("sub", "Zapisz zmiany"); + String path = prefs.getString("dir", "")+ "/mDedalCam/" +genName; + + // openCamra( path); +// File file = new File(getFilesDir().getAbsolutePath() + "/mDedal/"+m_id+"/"+folder + "/" +genName); + + StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); + StrictMode.setVmPolicy(builder.build()); + + File file = new File(prefs.getString("dir", "")+ "/mDedalCam/" +genName); + Uri oFU = Uri.fromFile(file); + Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); //moďż˝e secure? + intent.putExtra(MediaStore.EXTRA_OUTPUT, oFU); + startActivityForResult(intent, TAKE_PICTURE); + } + } + void openCamra(String path) { + StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); + StrictMode.setVmPolicy(builder.build()); + + Intent cameraImgIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + + cameraImgIntent.putExtra(MediaStore.EXTRA_OUTPUT, + FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID +".provider", + new File(path))); + startActivityForResult(cameraImgIntent, TAKE_PICTURE); + } + protected class ChangeZlecenieFolderSelectedListenerDedalActivity implements + OnItemSelectedListener { + + private int id_zlecenia; + private int jid_folder; + + public ChangeZlecenieFolderSelectedListenerDedalActivity(int id_zlecenia, int jid_folder){ + this.id_zlecenia = id_zlecenia; + this.jid_folder = jid_folder; + } + + @Override + public void onItemSelected(AdapterView parent, View view, int pos, + long id) { + + Log.d(LOG, "ChangeZlecenieFolderSelectedListenerDedalActivity" ); + try { + int id_folder_gui = folderIds.get(pos); + + // jeśli id_folder z gui jest taki sam jak w json to nie ma sensu wysyłać + Log.d("my_debug", "jid_folder: "+jid_folder+", id_folder_gui: "+id_folder_gui); + if( jid_folder == id_folder_gui ) { + return; + } + + setIdFolderInListaProfil(id_zlecenia, id_folder_gui); + + JSONObject mainJs = new JSONObject(); + JSONObject contentJs = new JSONObject(); + contentJs.put("id_zlecenia", id_zlecenia); + contentJs.put("id_folder", id_folder_gui); + mainJs.put("zlecenie", contentJs); + + Date d = new Date(); + String genName = "folder_"+d.getTime() + ".mod"; + File dstDir = new File(prefs.getString("dir", "") + "/upload_folders_mod"); + if( !dstDir.isDirectory()){ dstDir.mkdirs(); } + + DedalHelper.putFileContent(prefs.getString("dir", "") + "/upload_folders_mod/" + genName, mainJs.toString()); + + //todo: dkuz: po co to? + // wystartuj/obudz serwis +// Context context = getApplicationContext(); +// Intent service = new Intent(context, DedalService.class); +// context.startService(service); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + protected void setIdFolderInListaProfil(int id_zlecenia, + int id_folder) { + try { + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + if( dLista.isFile()){ + String s = DedalHelper.getFileContent(dLista.getAbsolutePath()); + JSONObject jFile = new JSONObject(s); + + JSONObject jProfiles = jFile.getJSONObject("profile"); + Iterator pKeys = jProfiles.keys(); + //Boolean break_ = false; + + while( pKeys.hasNext()){ + String idProfilu = (String)pKeys.next(); + JSONObject jProfil = jProfiles.getJSONObject(idProfilu); + JSONObject jZlecenia = jProfil.getJSONObject("zlecenia"); + Iterator pKeys2 = jZlecenia.keys(); + while( pKeys2.hasNext() ){ + String id_zlecenia_curr = (String)pKeys2.next(); + if ( id_zlecenia_curr.equals( Integer.toString(id_zlecenia) ) ) { + JSONObject jZlecenie = jZlecenia.getJSONObject(Integer.toString(id_zlecenia)); + if(id_folder == 0) { + jZlecenie.put("id_folder", "null"); + } + else { + jZlecenie.put("id_folder", id_folder); + } + } + else { + continue; + } + } +// if( break_ ) { +// break; +// } + } + DedalHelper.putFileContent(prefs.getString("dir", "") + "/baza/lista.profil", jFile.toString()); + } + + + + } catch (JSONException e) { + e.printStackTrace(); + } + + } + + @Override + public void onNothingSelected(AdapterView arg0) { + // TODO Auto-generated method stub + + } + + } + +// private class PhotoUploadResponseHandler implements ResponseHandler { +// +// @Override +// public Object handleResponse(HttpResponse response) +// throws ClientProtocolException, IOException { +// +// HttpEntity r_entity = response.getEntity(); +// String responseString = EntityUtils.toString(r_entity); +// Log.d("UPLOAD", responseString); +// +// return null; +// } +// +// } +// + +// String readFile(InputStream in) throws IOException { +// StringBuffer sb = new StringBuffer(); +// byte buffer[] = new byte[1000]; +// int s = 0; +// while ((s = in.read(buffer)) > 0) { +// String st =new String(buffer, 0, s); +// sb.append(st); +// } +// return sb.toString(); +// } + + + + protected void find_powtarzalne(JSONObject jo, Integer id_pow) { + try { + if (jo.has(STRUCT_POWTARZALNY) && jo.getString(STRUCT_POWTARZALNY).equals("tak") && !jo.has("usun")) { + HashMap temp = new HashMap(); + temp.put(jo.getInt("id_wiersz_szablonu"), jo.getInt("id")); + + ostatni_powtarzalny.put(jo.getInt("parent"), temp); + + HashMap temp2 = new HashMap(); + if (ilosc_powtarzalnych.get(jo.getInt("parent")) != null && ilosc_powtarzalnych.get(jo.getInt("parent")).get(jo.getInt("id_wiersz_szablonu")) != null) { + Integer ilosc = ilosc_powtarzalnych.get(jo.getInt("parent")).get(jo.getInt("id_wiersz_szablonu")); + + temp2.put(jo.getInt("id_wiersz_szablonu"), ilosc + 1); + ilosc_powtarzalnych.put(jo.getInt("parent"), temp2); + } else { + temp2.put(jo.getInt("id_wiersz_szablonu"), 1); + ilosc_powtarzalnych.put(jo.getInt("parent"), temp2); + } + + id_pow = jo.getInt("id"); + } + + if (jo.has(STRUCT_TYP_DANYCH) && jo.getString(STRUCT_TYP_DANYCH).equals(TYPE_FOTO) && id_pow != 0) { + //Log.d("my_debug", "id_pow: "+id_pow); + elemntsWithFoto.put(id_pow, true); + } + + if (jo.has(STRUCT_KLIENT) && jo.getString(STRUCT_KLIENT).equals("accept")) { + //Log.d("my_debug", "klient: accept, id: "+ jo.getInt("id")); + if (ostatni_accept.get(jo.getInt("parent")) == null || ostatni_accept.get(jo.getInt("parent")).get(jo.getInt("id_wiersz_szablonu")) == null) { + HashMap temp3 = new HashMap(); + temp3.put(jo.getInt("id_wiersz_szablonu"), jo.getInt("id")); + ostatni_accept.put(jo.getInt("parent"), temp3); + } else { + if (ostatni_accept.get(jo.getInt("parent")).get(jo.getInt("id_wiersz_szablonu")) < jo.getInt("id")) { + HashMap temp3 = new HashMap(); + temp3.put(jo.getInt("id_wiersz_szablonu"), jo.getInt("id")); + ostatni_accept.put(jo.getInt("parent"), temp3); + } + } + } + + if (js.has("sub") && jo.has("id-orig")) { + //Log.d("my_debug", "no-sent"); + + //jo.put("no-sent", "true"); + + } + + JSONArray ja = jo.getJSONArray(STRUCT_CHILDS); + if (ja != null && ja.length() > 0) { + for (int i = 0; i < ja.length(); i++) { + find_powtarzalne(ja.getJSONObject(i), id_pow); + } + } + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + protected void sortujKolejnosc(ArrayList aM) { + Collections.sort(aM, new Comparator() { + @Override + public int compare(JSONObject lhs, JSONObject rhs) { + // TODO Auto-generated method stub + try { + if( lhs.getInt("kolejnosc") >(rhs.getInt("kolejnosc"))){ + return 1; + }else if( lhs.getInt("kolejnosc") < (rhs.getInt("kolejnosc"))){ + return -1; + }else{ + if( lhs.getInt("id") > (rhs.getInt("id"))) + return 1; + else if ( lhs.getInt("id") < (rhs.getInt("id"))) + return -1; + return 0; + } + } catch (JSONException e) { + // TODO Auto-generated catch block + //e.printStackTrace(); + } + return 0; + } + }); + } + +// private final class Change_focus implements OnFocusChangeListener { +// +// } + + /** + * Zapis zmian z elementów graficznych do struktury json. + * @param jo struktura do zapisu. + */ + protected void zapiszZmiany(JSONObject jo) { + // TODO Auto-generated method stub + + JSONArray ja; + //String komunikat = null; +// komunikat_obowiazkowe = ""; +// komunikat_walidacja = ""; + try { + if( !jo.has("id")){ + return; + } + + int id = jo.getInt("id"); + String typ_danych = jo.getString(STRUCT_TYP_DANYCH); + if(typ_danych.equals(TYPE_CHECK)){ + Object obj = DedalActivity.this.findViewById(id); + if( obj instanceof CheckBox) { + CheckBox cb = (CheckBox) DedalActivity.this.findViewById(id); + //ToggleButton cb = (ToggleButton) DedalActivity.this.findViewById(id); + if (cb != null) { //visible + if (cb.isChecked()) { + jo.put(STRUCT_WARTOSC, "on"); + } else { + jo.put(STRUCT_WARTOSC, "off"); + } + } + }else{ + if( obj!= null) { + Log.e("FORMATKA", "Błąd typu. id=" + id + " STRUCT_OPIS: " + jo.getString(STRUCT_OPIS)); + } + } + }else if( typ_danych.equals(TYPE_TEXT) || typ_danych.equals(TYPE_TEXTBOX)|| typ_danych.equals(TYPE_LICZBA)|| + typ_danych.equals(TYPE_KOLUMNA)|| typ_danych.equals(TYPE_DATA) || typ_danych.equals(TYPE_KWOTA)){ + View v = DedalActivity.this.findViewById(id); + if( v!= null){ //visible + if( !(v instanceof EditText)){ + Log.d("my_debug", "view nie jest EditText, id=" + id); + }else { + EditText et = (EditText) DedalActivity.this.findViewById(id); + jo.put(STRUCT_WARTOSC, et.getText().toString()); + + String opis = jo.getString(STRUCT_OPIS); + if (opis.trim().equals("")) { + opis = jo.getString("kod"); + } + + // walidacja pĂłl obowiazkowych + if (jo.has("obowiazkowe") && jo.getString("obowiazkowe").equals("tak")) { + if (et.getText().toString().trim().equals("") + && (et.isEnabled() || disableEditable.get(id) != null) + && et.getVisibility() == View.VISIBLE) { + + Log.d("my_debug", "obowiazkowe, " + opis); + komunikat_obowiazkowe += "-" + opis + "\n"; + } + } + + // walidacja poprawnoĹ›ci wpisanych danych + if (jo.has(STRUCT_WALIDACJA) && !jo.getString(STRUCT_WALIDACJA).trim().equals("")) { +// Log.d("my_debug", "et.isvisible: "+et.getVisibility()+", VISIBLE: "+View.VISIBLE); +// if(et.getVisibility() != View.VISIBLE) { +// Log.d("my_debug", "invisible !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); +// } + if (!et.getText().toString().trim().equals("") + && (et.isEnabled() || disableEditable.get(id) != null) + && et.getVisibility() == View.VISIBLE) { + + String wartosc_pola = et.getText().toString().trim(); + //String parts[] = + Log.d("my_debug", "waliduje, war: " + wartosc_pola + ", opis: " + opis); + String tabORs[] = jo.getString(STRUCT_WALIDACJA).trim().split("\\|\\|"); + String tabANDs[]; + String bLastOr = null; + String r; + Log.d("my_debug", "warunek: " + jo.getString(STRUCT_WALIDACJA).trim() + ", length: " + tabORs.length); + for (int or = 0; or < tabORs.length; or++) { + //alert(tabORs[or]); + //Log.d("my_debug", "tabors: or"+or+", war: "+tabORs[or]); + tabANDs = tabORs[or].split("\\&\\&"); + bLastOr = null; + for (int and = 0; and < tabANDs.length; and++) { + //Log.d("my_debug", "taband: and"+and+", war: "+tabANDs[and]); + r = null; + try { + r = check_walidacja(wartosc_pola, tabANDs[and].trim(), typ_danych, opis); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + if (r != null) { + bLastOr = r; + break; + } + } + if (bLastOr == null) { + break; + } + } + + //alert() + if (bLastOr != null) { + //return bLastOr; + komunikat_walidacja += bLastOr + "\n"; + } + } + } + } + + } + + }else if( typ_danych.equals(TYPE_RADIO)) { + View obj = DedalActivity.this.findViewById(id); + if (obj != null && obj instanceof RadioButton) { + RadioButton rb = (RadioButton) obj; + + if (rb != null)//visible + if (rb.isChecked()) { + jo.put(STRUCT_WARTOSC, "on"); + } else { + jo.put(STRUCT_WARTOSC, "off"); + } + } + + }else if( typ_danych.equals(TYPE_WYBOR)){ + View v = DedalActivity.this.findViewById(id); + if( v != null ) { + Spinner spin = (Spinner) DedalActivity.this.findViewById(id); + //Log.d("my_debug", "znalazďż˝em spinera, id: "+id+", wartosc: " + wyborSelected.get(id)); + + if( wyborSelected.get(id) != null) { + // walidacja pĂłl obowiazkowych + if (jo.has("obowiazkowe") && jo.getString("obowiazkowe").equals("tak")) { + if (wyborSelected.get(id) == 0 + && (spin.isEnabled() || disableEditable.get(id) != null) + && spin.getVisibility() == View.VISIBLE) { + + String opis = jo.getString(STRUCT_OPIS); + if (opis.trim().equals("")) { + opis = jo.getString("kod"); + } + + Log.d("my_debug", "obowiazkowe, " + opis); + komunikat_obowiazkowe += "-" + opis + "\n"; + } + } + jo.put(STRUCT_WARTOSC, wyborSelected.get(id)); + } + } + + }else if( typ_danych.equals(TYPE_RADIOLISTA)){ + + ja = jo.getJSONArray(STRUCT_CHILDS); + + Boolean is_checked = true; + Boolean is_visible = false; + if( ja!= null && ja.length()>0){ + int id_radio; + JSONObject jo_child; + RadioButton rb; + is_checked = false; + for ( int i=0; i < ja.length(); i++){ + jo_child = ja.getJSONObject(i); + id_radio = jo_child.getInt("id"); + //Log.d("my_debug", "id_radio: "+id_radio); + View obj = DedalActivity.this.findViewById(id_radio); + if(obj != null ) { + if( obj instanceof RadioButton ) { + rb = (RadioButton) obj; + if (rb != null) { //visible + if (rb.isEnabled()) { + if (rb.getVisibility() == View.VISIBLE) { + is_visible = true; + } + } + if (rb.isChecked()) { + is_checked = true; + jo.put(STRUCT_WARTOSC, ja.getJSONObject(i).getInt("id_wiersz_szablonu")); + break; + } + } + } + else { // przypadek gdzie mamy opcję: buttons. W tym wypadku wartość była zapisana już w jsonie podczas onclicka + Button bt = (Button) obj; + if( bt != null ) { + if (bt.isEnabled()) { + if (bt.getVisibility() == View.VISIBLE) { + is_visible = true; + } + } + if( jo.getString(STRUCT_WARTOSC).equals(jo_child.getString("id_wiersz_szablonu")) ) { + is_checked = true; + break; + } + } + } + } + } + } + // walidacja pďż˝l obowiazkowych + if ( jo.has("obowiazkowe") && jo.getString("obowiazkowe").equals("tak") ) { + int id_radiolista = jo.getInt("id"); + View radioLista = findViewById(id_radiolista); + //Log.d("my_debug", "wal radiolista: kod: "+jo.getString("kod")+", is_checked:"+is_checked+", is_visible: "+is_visible); //, radioLista.getVisibility(): "+radioLista.getVisibility()); + if( !is_checked && is_visible && radioLista.getVisibility() == View.VISIBLE) { + + String opis = jo.getString(STRUCT_OPIS); + if( opis.trim().equals("") ) { + opis = jo.getString("kod"); + } + Log.d("my_debug", "obowiazkowe, "+opis); + komunikat_obowiazkowe += "-"+opis + "\n"; + } + } + + //int id = jo.getInt("id"); + + // CHECKLISTA TUTAJ JEST POTRZEBNA DO WALIDACJE (DANE ZAPISYWANE Sďż˝ W IF(typ_danych.equals(TYPE_CHECK)) ) + }else if( typ_danych.equals(TYPE_CHECKLISTA)){ + + ja = jo.getJSONArray(STRUCT_CHILDS); + + Boolean is_checked = true; + Boolean is_visible = false; + if( ja!= null && ja.length()>0){ + int id_check; + CheckBox ch; + is_checked = false; + for ( int i=0; i0){ + for ( int i=0; i m = new ArrayList(); + String pattern = "PRE_TODAY([\\-,\\+])([\\d])"; + Matcher matcher = Pattern.compile(pattern).matcher(granica_pola); + if( matcher.matches() ) { + String sign = matcher.group(1); + String days = matcher.group(2); + Log.d("my_debug", "sign: "+sign+", days: "+days); + //String dt = "2008-01-01"; // Start date + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Calendar c = Calendar.getInstance(); + //c.setTime(); + int days_int = 0; + if( "-".equals(sign) ) { + days_int = Integer.parseInt(days)*(-1); + } + else if( "+".equals(sign) ) { + days_int = Integer.parseInt(days); + } + + c.add(Calendar.DATE, days_int); // number of days to add + granica_pola = dateFormat.format(c.getTime()); // dt is now the new date); + } + + //szukanie PRE_TODAY bez działaia matematycznego + if( granica_pola.length() > 4 && granica_pola.equals("PRE_TODAY") ) { + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Calendar c = Calendar.getInstance(); + granica_pola = dateFormat.format(c.getTime()); + + } + // jeĹ›li jest PRE_ to znaczy ĹĽe naleĹĽy odczytać id pola wzglÄ™dem ktĂłrego trzeba walidować i odczytać jego wartość bÄ™dÄ…cÄ… granicÄ… + else if( granica_pola.length() > 4 && granica_pola.substring(0,4).equals("PRE_") ) { + + //Log.d("my_debug", "wykryto PRE_"); + String id_pola_granicy_str = granica_pola.substring(4, granica_pola.length()); + try { + int id_pola_granicy_int = Integer.parseInt(id_pola_granicy_str); + View v = DedalActivity.this.findViewById(id_pola_granicy_int); + if( v != null ) { + EditText et = (EditText)DedalActivity.this.findViewById(id_pola_granicy_int); + granica_pola = et.getText().toString(); + } + }catch(NumberFormatException nfe) { + Log.d("my_debug", "id_pola_granicy_str: "+id_pola_granicy_str+" nie jest int"); + return null; + } + //Log.d("my_debug", "koniec PRE_, granica_pola: "+granica_pola); + } + + String wartosc = wartosc_pola.trim(); + String granica = granica_pola.trim(); + Log.d("my_debug", "oper: "+oper+", war: "+wartosc_pola+", gran: "+granica_pola); + Double wartoscNum = 0.0; + Double granicaNum = 0.0; + + String endl = "\n"; + + if( typ_danych.equals(TYPE_DATA) ) { + String walid_date_wartosc[] = wartosc.split("-"); + String walid_date_granica[] = granica.split("-"); + if ( !isGranicaIsDay(granica) && !granica.equals("HOLIDAY") ) { + if( walid_date_wartosc.length < 3 || walid_date_granica.length < 3 ) { // to nie jest data + Log.d("my_debug", "wartoĹ›ci nie sÄ… datami"); + return null; + } + } + + String check_wartosc[] = wartosc.split("\\s+"); + String check_granica[] = granica.split("\\s+"); + + if ( check_wartosc.length < 2 || check_wartosc[1] != null ) { // nie istnieje godzina w wartoďż˝ci to usuďż˝ godzinďż˝ z granicy + granica = check_granica[0]; + } + if ( check_granica.length < 2 || check_granica[1] != null ) { // nie istnieje godzina w granicy to usuďż˝ godzinďż˝ z wartoďż˝ci + wartosc = check_wartosc[0]; + } + + // Sprawdzanie dni tygodnia + if( oper.equals("df") && isGranicaIsDay(granica) ) { + Log.d("my_debug", "sprawdzam dzieĹ„ tygodnia: "); + Boolean ch = check_week_day(check_wartosc[0], granica); + if( ch ) { + komunikat="- "+opis_pola; + komunikat=komunikat+" - "+res.getString(R.string.dzien_tygodnia_daty)+" ("+wartosc_pola+") "+res.getString(R.string.musi_byc_rozny)+" ("+granica+")" + endl; + return komunikat; + } + return null; + } + if( oper.equals("eq") && isGranicaIsDay(granica) ) { + Boolean ch = check_week_day(check_wartosc[0], granica); + if( !ch ) { + komunikat="- "+opis_pola; + komunikat=komunikat+" - "+res.getString(R.string.dzien_tygodnia_daty)+" ("+wartosc_pola+") "+res.getString(R.string.musi_byc)+" ("+granica+")" + endl; + return komunikat; + } + return null; + } + //// + + // sprawdzanie Ĺ›wiÄ…t + if( oper.equals("df") && granica.equals("HOLIDAY") ) { + Boolean ch = check_holiday_day(check_wartosc[0]); // swieta - zmienna globalna (otrzymana z php) + if( ch ) { + komunikat="- "+opis_pola; + komunikat=komunikat+" - Wpisana data ("+wartosc_pola+") "+res.getString(R.string.nie_swieto) + endl; + return komunikat; + } + return null; + } + if( oper.equals("eq") && granica.equals("HOLIDAY") ) { + Boolean ch = check_holiday_day(check_wartosc[0]); // swieta - zmienna globalna (otrzymana z php) + if( !ch ) { + komunikat="- "+opis_pola; + komunikat=komunikat+" - Wpisana data ("+wartosc_pola+") "+res.getString(R.string.musi_swieto) + endl; + return komunikat; + } + return null; + } + + //do_walid = true; + } + else { + wartosc=wartosc.replace(',', '.'); + granica=granica.replace(',', '.'); + + try { + wartoscNum = Double.parseDouble(wartosc); + granicaNum = Double.parseDouble(granica); + }catch(NumberFormatException nfe) { + Log.d("my_debug", "wartoĹ›ci nie sÄ… liczbami"); + return null; + } + } + + + Log.d("my_debug", "num oper: "+oper+", war: "+wartoscNum+", gran: "+granicaNum); + Log.d("my_debug", "str oper: "+oper+", war: "+wartosc+", gran: "+granica); + + opis_pola = Html.fromHtml(opis_pola).toString(); + + if( oper.equals("ge") ) { + //if( ! (wartosc >= granica) ){ + // jeďż˝li data porďż˝wnaj stringi jeďż˝li nie porďż˝wnaj double + if ( (typ_danych.equals(TYPE_DATA) && !(wartosc.compareTo(granica) >= 0)) || + (!typ_danych.equals(TYPE_DATA) && !(wartoscNum >= granicaNum)) ) { + + komunikat="- "+opis_pola; + komunikat=komunikat+" - "+res.getString(R.string.wpisana_wartosc)+" ("+wartosc_pola+") "+res.getString(R.string.musi_wieksza_rowna)+" "+granica_pola+endl; + Log.d("my_debug", "wykryto ge"); + } + } + else if( oper.equals("gt") ) { + //if( ! (wartosc > granica )){ + // jeďż˝li data porďż˝wnaj stringi jeďż˝li nie porďż˝wnaj double + if ( (typ_danych.equals(TYPE_DATA) && !(wartosc.compareTo(granica) > 0)) || + (!typ_danych.equals(TYPE_DATA) && !(wartoscNum > granicaNum)) ) { + + komunikat="- "+opis_pola; + komunikat=komunikat+" - "+res.getString(R.string.wpisana_wartosc)+" ("+wartosc_pola+") "+res.getString(R.string.musi_wieksza)+" "+granica_pola+endl; + Log.d("my_debug", "wykryto gt"); + } + } + else if( oper.equals("le") ) { + //if( ! (wartosc <= granica )){ + // jeďż˝li data porďż˝wnaj stringi jeďż˝li nie porďż˝wnaj double + if ( (typ_danych.equals(TYPE_DATA) && !(wartosc.compareTo(granica) <= 0)) || + (!typ_danych.equals(TYPE_DATA) && !(wartoscNum <= granicaNum)) ) { + + komunikat="- "+opis_pola; + komunikat=komunikat+" - "+res.getString(R.string.wpisana_wartosc)+" ("+wartosc_pola+") "+res.getString(R.string.musi_mniejsza_rowna)+" "+granica_pola+endl; + Log.d("my_debug", "wykryto le"); + } + } + else if( oper.equals("ls") ) { + //if( ! (wartosc < granica )){ + // jeďż˝li data porďż˝wnaj stringi jeďż˝li nie porďż˝wnaj double + if ( (typ_danych.equals(TYPE_DATA) && !(wartosc.compareTo(granica) < 0)) || + (!typ_danych.equals(TYPE_DATA) && !(wartoscNum < granicaNum)) ) { + + komunikat="- "+opis_pola; + komunikat=komunikat+" - "+res.getString(R.string.wpisana_wartosc)+" ("+wartosc_pola+") "+res.getString(R.string.musi_mniejsza)+" "+granica_pola+endl; + Log.d("my_debug", "wykryto ls"); + } + } + else if( oper.equals("df") ) { + //if( wartosc == granica ){ + // jeďż˝li data porďż˝wnaj stringi jeďż˝li nie porďż˝wnaj double + if ( (typ_danych.equals(TYPE_DATA) && !(wartosc.compareTo(granica) == 0)) || + (!typ_danych.equals(TYPE_DATA) && !(wartoscNum == granicaNum)) ) { + + komunikat="- "+opis_pola; + komunikat=komunikat+" - "+res.getString(R.string.wpisana_wartosc)+" ("+wartosc_pola+") "+res.getString(R.string.musi_rozna)+" "+granica_pola+endl; + Log.d("my_debug", "wykryto df"); + } + } + else if( oper.equals("eq") ) { + //if( wartosc != granica ){ + // jeďż˝li data porďż˝wnaj stringi jeďż˝li nie porďż˝wnaj double + if ( (typ_danych.equals(TYPE_DATA) && !(wartosc.compareTo(granica) != 0)) || + (!typ_danych.equals(TYPE_DATA) && !(wartoscNum != granicaNum)) ) { + + komunikat="- "+opis_pola; + komunikat=komunikat+" - "+res.getString(R.string.wpisana_wartosc)+" ("+wartosc_pola+") "+res.getString(R.string.musi_rowna)+" "+granica_pola+endl; + Log.d("my_debug", "wykryto eq"); + } + } + else { + + } + //alert("default"); + + + return komunikat; + } + + protected boolean isGranicaIsDay(String granica) { + if( granica.equals("SUNDAY") || granica.equals("MONDAY") || granica.equals("TUESDAY") || granica.equals("WEDNESDAY") || granica.equals("THURSDAY") || granica.equals("FRIDAY") || granica.equals("SATURDAY") ) { + return true; + } + else { + return false; + } + } + + protected Boolean check_holiday_day(String date) { + // tutaj podajemy date w formacie: miesiÄ…c-dzieĹ„ (m-d) + Map swieta_stale = new HashMap(); + //tutaj podajemy date w formacie rok-miesiÄ…c-dzieĹ„ (Y-m-d) + Map swieta_ruchome = new HashMap(); + + swieta_stale.put("01-01", true); // nowy rok + swieta_stale.put("01-06", true); // trzech krĂłli + swieta_stale.put("05-01", true); // Ĺ›wiÄ™to pracy + swieta_stale.put("05-01", true); // konstytucja 3 maja + swieta_stale.put("08-15", true); // Ĺ›wiÄ™to wojska polskiego + swieta_stale.put("11-01", true); // wszystkich Ĺ›wiÄ™tych + swieta_stale.put("11-11", true); // Ĺ›wiÄ™to niepodlegĹ‚ośći + swieta_stale.put("12-25", true); // boĹĽe narodzenie + swieta_stale.put("12-26", true); // boĹĽe narodzenie + + // 2014 + swieta_ruchome.put("2014-04-20", true); // wielkanoc + swieta_ruchome.put("2014-04-21", true); // poniedziaĹ‚ek wielkanocny + swieta_ruchome.put("2014-05-08", true); // zielone Ĺ›wiÄ…tki + swieta_ruchome.put("2014-06-19", true); // boĹĽe ciaĹ‚o + + // 2015 + swieta_ruchome.put("2015-04-05", true); // wielkanoc + swieta_ruchome.put("2015-04-06", true); // poniedziaĹ‚ek wielkanocny + swieta_ruchome.put("2015-05-24", true); // zielone Ĺ›wiÄ…tki + swieta_ruchome.put("2015-06-04", true); // boĹĽe ciaĹ‚o + + date = date.trim(); + if( date.equals("") ) return false; + + String d[] = date.split("\\s+"); + date = d[0]; + + String date_split[] = date.split("-"); + if( date_split.length == 3 ) { // inaczej to nie jest data + String data_without_year = date_split[1]+"-"+date_split[2]; + if( swieta_stale.get(data_without_year) != null ) { + return true; + } + if( swieta_ruchome.get(date) != null ) { + return true; + } + } + + return false; + } + + protected Boolean check_week_day(String date, String wal_day_str) throws ParseException { + date = date.trim(); + if( date.equals("") ) return false; + + String d[] = date.split("\\s+"); + date = d[0]; + + //Date date_format = new Date(date); + + Calendar cal = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); + cal.setTime(sdf.parse(date));// all done + //Log.d("my_debug", "date, cal: "+cal.toString()); + + Boolean return_value = false; + + if ( wal_day_str.equals("SUNDAY") ) { + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { + return_value = true; + } + } + if ( wal_day_str.equals("MONDAY") ) { + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) { + return_value = true; + } + } + if ( wal_day_str.equals("TUESDAY") ) { + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY) { + return_value = true; + } + } + if ( wal_day_str.equals("WEDNESDAY") ) { + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY) { + return_value = true; + } + } + if ( wal_day_str.equals("THURSDAY") ) { + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY) { + return_value = true; + } + } + if ( wal_day_str.equals("FRIDAY") ) { + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) { + return_value = true; + } + } + if ( wal_day_str.equals("SATURDAY") ) { + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { + return_value = true; + } + } + + return return_value; + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + protected void wyswietlPytanieCzyNastepneZdjecie(final String folder) { + // TODO Auto-generated method stub + + AlertDialog.Builder alertDialog = new AlertDialog.Builder(DedalActivity.this); + alertDialog.setTitle( "Czy zrobić następne zdjęcie?" ); + // alertDialog.setMessage( "Wybierz opcję:" ); + alertDialog.setPositiveButton("TAK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + + + Date d = new Date(); + String genName = "foto_"+d.getTime() + ".jpg"; +// File file = new File(getFilesDir().getAbsolutePath() + "/mDedal/"+m_id+"/"+folder + "/" +genName); + File file = new File(prefs.getString("dir", "")+ "/mDedalCam/" +genName); + Uri oFU = Uri.fromFile(file); + StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); + StrictMode.setVmPolicy(builder.build()); + Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); //moďż˝e secure? + intent.putExtra(MediaStore.EXTRA_OUTPUT, oFU); + + // foto_kod = folder; + foto_name = genName; + dialog.dismiss(); + startActivityForResult(intent, TAKE_PICTURE); + } + }); + + alertDialog.setNegativeButton("Zakończ robienie zdjęć.", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + //mod_json_files(false); + dialog.dismiss(); + DedalActivity.this.reload(); + } + }); + alertDialog.show(); + + } + + + @Override + protected void onDestroy() { + // TODO Auto-generated method stub + super.onDestroy(); + + radioParentsIds.clear(); + radiogroups.clear(); + + radioJson.clear(); + checkJson.clear(); + groupContainer.clear(); + + wyborSelected.clear(); + items_id.clear(); + + ostatni_powtarzalny.clear(); + ostatni_accept.clear(); + ilosc_powtarzalnych.clear(); + tabela_ostatni_wiersz.clear(); + elemntsWithFoto.clear(); + disableEditable.clear(); + + elemntsEnable.clear(); + + radioParentsIds = null; + radiogroups = null; + + radioJson = null; + checkJson = null;; + groupContainer = null; + + wyborSelected = null; + items_id = null; + + ostatni_powtarzalny = null; + ostatni_accept = null; + tabela_ostatni_wiersz = null; + elemntsWithFoto = null; + disableEditable = null; + + params = null; + js = null; + + dluznikItems_names = null; + dluznikItems_id_dluznik = null; + //selectedDluznikPerInterwencja = null; + + + folderIds = null; + folderNazwy = null; + + pola_tabela.clear(); + supportOnLoadReferences = null; + + + ListActivity.onDestroyD(this); + } + + protected boolean IsInteger(String str) + { + try + { + Integer.parseInt(str); + return true; + } + catch(NumberFormatException nfe) + { + return false; + } + } + + private class MyOnItemSelectedListener implements OnItemSelectedListener { + // private final JSONObject jo; + + String id_interwencji = null; + boolean first_selection = true; + + public MyOnItemSelectedListener(String id_interwencji) { + this.id_interwencji = id_interwencji; + } + + @Override + public void onItemSelected(AdapterView parent, View view, int pos, long id) { + Log.d("my_debug", "spinner, dluznik id: " + dluznikItems_id_dluznik.get(pos) + ", dluznik name: " + dluznikItems_names.get(pos)); + try { + JSONObject jo = find_element_from_Array(js, this.id_interwencji); + String id_dluznika = dluznikItems_id_dluznik.get(pos); + jo.put("id_dluznika", id_dluznika); + + if( selectedDluznikPerInterwencja == null ) { + selectedDluznikPerInterwencja = new HashMap(); + } + selectedDluznikPerInterwencja.put(this.id_interwencji, id_dluznika); + + if( !first_selection ) { + setModified(); + } + else { + first_selection = false; + } + //Log.d("my_debug", "jo: "+jo.toString()); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + @Override + public void onNothingSelected(AdapterView arg0) { + } + } + + protected void supporRadioRef(JSONObject radio_ref_jo, int visibility) { + Opcje op_ref = new Opcje(radio_ref_jo); + String opcja_ref = op_ref.get_opcje("referencja"); + String split[] = opcja_ref.split(","); + String ref_code = split[0]; + String ancestor_code = null; + int ancestor_id = 0; + + if( split.length > 1 ) { + ancestor_code = split[1]; + } + ancestor_id = getMyAcceptId(radio_ref_jo, ancestor_code); + + Log.d("my_debug", "ancestor_id: "+ancestor_id); + if( ancestor_id >= 0 ) { + JSONObject jo_ref = findElementByCodeAndAncestor(ref_code, Integer.toString(ancestor_id)); + if (jo_ref != null) { + try { + int id_ref = jo_ref.getInt("id"); + View view_ref = findViewById(id_ref); + + if (view_ref != null) { + + ViewGroup view_parent = (ViewGroup) view_ref.getParent(); + + view_parent.setVisibility(visibility); + setVisibilityForAllChildren(jo_ref, visibility); +// if ( op.check_opcje("referencja") ) { +// view_parent.setVisibility(View.VISIBLE); +// setVisibilityForAllChildren(jo_ref, View.VISIBLE); +// Log.d("my_debug", "referencja, set visible"); +// } +// else { +// view_parent.setVisibility(View.GONE); +// setVisibilityForAllChildren(jo_ref, View.GONE); +// Log.d("my_debug", "referencja, set invisible"); +// } + } + + //wyswietlPole(subView, jo_ref, true, view.isEnabled(), status_interwencji_temp); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + } + + private void setVisibilityForAllChildren(JSONObject jo, int visible) { + if( jo.has("id") ) { + try { + int id = jo.getInt("id"); + View view = findViewById(id); + if( view != null ) { + view.setVisibility(visible); + } + } catch (JSONException e) { + e.printStackTrace(); + } + + } + try { + if( jo.has(STRUCT_CHILDS) && jo.getJSONArray(STRUCT_CHILDS).length() > 0 ) { + JSONArray childsJ = jo.getJSONArray(STRUCT_CHILDS); + for( int i = 0 ; i < childsJ.length() ; i++ ) { + JSONObject childJ = childsJ.getJSONObject(i); + setVisibilityForAllChildren(childJ, visible); + } + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + + private class RadioOnClickListener implements OnClickListener { + + JSONObject radio_ref_jo = null; + + public RadioOnClickListener(JSONObject radio_ref_jo) { + this.radio_ref_jo = radio_ref_jo; + } + + @Override + public void onClick(View v) { + //v.getParent().ge + + + y = sw.getScrollY(); + Integer nGr = radioParentsIds.get(v.getId()); + List list = radiogroups.get(nGr); + + //setModified(); + if( v instanceof RadioButton) { + setModified(); + } + + JSONObject jo = find_element_from_Array(js, ""+v.getId()); + for( int i=0; i 0) { + for (int j = 0; j < ja2.length(); j++) { + try { + // Log.d("my_debug", "b.isEnabled: "+(b.isEnabled())); + wyswietlPole(subView, ja2.getJSONObject(j), true, view.isEnabled(), status_interwencji_temp); + + // wyswietlPole(subView, ja2.getJSONObject(j), true, true); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + + // jeśli jest referencja to pokaż/ukryj referencję + if( radio_ref_jo != null ) { + int visibility = 0; + if ( op.check_opcje("referencja") ) { + visibility = View.VISIBLE; + } + else { + visibility = View.GONE; + } + supporRadioRef(radio_ref_jo, visibility); + + + } + + //} + } + + } + } + sw.post(new Runnable() { + @Override + public void run() { + sw.scrollTo(0, y); + } + }); + } + } +} diff --git a/app/src/main/java/com/likesoft/mdedal/DedalDownloadService.java b/app/src/main/java/com/likesoft/mdedal/DedalDownloadService.java new file mode 100644 index 0000000..f3d67ff --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/DedalDownloadService.java @@ -0,0 +1,616 @@ +package com.likesoft.mdedal; + +import android.annotation.SuppressLint; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.IBinder; +import android.preference.PreferenceManager; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Vector; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +//mport com.likesoft.mdedal.DedalDownloadService.WorkingThread; + +public class DedalDownloadService extends Service{ + + private static final String SRV = "DedalDownloadService"; + SharedPreferences prefs; + String hostPath = ""; + String login = "";//prefs.getString("user", ""); + String pass = "";//prefs.getString("password", ""); + String gzip = "true"; + + private static void trustAllHosts() { + + X509TrustManager easyTrustManager = new X509TrustManager() { + public void checkClientTrusted( + X509Certificate[] chain, + String authType) throws CertificateException { + // Oh, I am easy! + } + public void checkServerTrusted( + X509Certificate[] chain, + String authType) throws CertificateException { + Log.d("certyfikat", "Download -serverTrusted: " + Arrays.toString(chain)); + // Oh, I am easy! + } + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + }; + + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[] {easyTrustManager}; + + // Install the all-trusting trust manager + try { + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } catch (Exception e) { + Log.e(SRV, "", e); + } + } + + class WorkingDownloadThread implements Runnable { + + WorkingThread _wt; + public WorkingDownloadThread(WorkingThread wt) { + // TODO Auto-generated constructor stub + _wt = wt; + } + @Override + public void run() { + // TODO Auto-generated method stub + _wt.pobierzZleceniaPrio(); + File f=_wt.getNextFile() ; + while( f != null){ + Log.d(SRV, "Watek pobiera zlecenie: " + f.getName()); + _wt.pobierzZlecenie(f); + f=_wt.getNextFile() ; + } + } + } + + @SuppressLint("DefaultLocale") + class WorkingThread implements Runnable { + + public synchronized File getNextFile(){ + File f = null; + if( curPosition < files.length){ + f = files[curPosition]; + curPosition++; + } + return f; + } + + public void pobierzZleceniaPrio() { + File d_prio = new File(prefs.getString("dir", "") + "/queue_prio");//getApplicationContext().getFilesDir(); + if( d_prio.isDirectory() ) { + String sf_prio = d_prio.getAbsolutePath(); + Log.d(SRV,sf_prio); + File files_prio[] = d_prio.listFiles(); + + // pętla po priorytetowych (jeśli są) + for (int j = 0; j < files_prio.length; j++) { + + String id_zlecenia_prio = files_prio[j].getName(); + + try { + Log.d(SRV, "zacznam pobierac: " + id_zlecenia_prio); + loadToDisk(id_zlecenia_prio); + files_prio[j].delete(); + + } catch (MalformedURLException e) { + Log.e("DEDAL", "Niepoprawny URL", e); + } + } + } + } + + File files[]; + int curPosition = 0; + public final int threadsNo = 10; + Thread wdt[] = new Thread[threadsNo]; + @Override + public void run() { + Context context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + hostPath = prefs.getString("hostName", ""); + login = prefs.getString("user", ""); + pass = DedalHelper.decodeB64(prefs.getString("password", "")); + File d = new File(prefs.getString("dir", "") + "/queue");//getApplicationContext().getFilesDir(); + String sf = d.getAbsolutePath(); + Log.d(SRV,sf); + files = d.listFiles(); + + + // odpal watki + Log.d(SRV, "Start watkow pobierajacych zlecenia"); + for( int i =0; i < threadsNo; i++){ + wdt[i] = new Thread(new WorkingDownloadThread( this)); + wdt[i].start(); + } + // czekaj na zakonczenie + for( int i =0; i < threadsNo; i++){ + try { + wdt[i].join(); + } catch (InterruptedException e) { + Log.e(SRV, "przerwano watek", e); + } + } + Log.d(SRV,"Sleep"); + } + + public void pobierzZlecenie(File curFile) { + String id_zlecenia = ""; + id_zlecenia = curFile.getName(); + + + // PRIORYTETOWE + pobierzZleceniaPrio(); + + // ZWYKŁE + try { + File f_queue = new File(prefs.getString("dir", "") + "/queue/"+id_zlecenia); + if( f_queue.exists() ) { + Log.d(SRV, "zacznam pobierac: " + id_zlecenia); + loadToDisk(id_zlecenia); + File d_prio = new File(prefs.getString("dir", "") + "/queue_prio");//getApplicationContext().getFilesDir(); + if( d_prio.isDirectory() ) { + File f_queue_prio = new File(prefs.getString("dir", "") + "/queue_prio/"+id_zlecenia); + if( f_queue_prio.exists() ) { + f_queue_prio.delete(); + } + } + curFile.delete(); + } + else { + Log.d(SRV, "plik: " + id_zlecenia + " nie istnieje w queue"); + } + + } catch (MalformedURLException e) { + Log.e("DEDAL", "Niepoprawny URL", e); + } + } + } + + void loadToDisk(String m_id) throws MalformedURLException { + + DedalHttpConnection con = new DedalHttpConnection(getApplicationContext()); + Map params_post = new HashMap(); + params_post.put("id_zlecenia", m_id); + params_post.put("gzip", gzip); + params_post.put("json", "true"); + + + String sPost = con.sendPost("xml/getZlecenieXml.php", params_post); + + + Log.d(SRV, "loadToDisk odczytany bufor, size: " + sPost.length()); + + File myFileMod = new File(prefs.getString("dir", "") + "/baza/"+m_id+".mod"); + if( myFileMod.exists()){ + myFileMod.delete(); + } + + DedalHelper.putFileContent(prefs.getString("dir", "") + "/baza/"+m_id+".json", sPost); + + // load fotos: + // 1. parse json + + // usun wpis z tego zlecenia w pliku pliki_kollekto/statuses.json + String statPath = prefs.getString("dir", "") + "/pliki_kollekto/statuses.json"; + String statJsString = readFileFromPath(statPath); + if( statJsString != null && !"".equals(statJsString) ) { + try { + JSONObject statJs = new JSONObject(statJsString); + if(statJs.has(m_id)) { + statJs.remove(m_id); + //writeFileToPath(statPath, statJs.toString()); + DedalHelper.putFileContent(statPath, statJs.toString()); + } + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + } + + try { + JSONObject js = new JSONObject(sPost); + + // 3. download files + JSONObject params = js.getJSONObject("param"); + if( params.has("status") && ( params.getString("status").equals("przydz_nie_odeb") || params.getString("status").equals("przydz_odeb") ) ){ + saveAttach(js, m_id); + Log.d("my_debug", "zapisuje pliki, zlecenie: "+m_id); + saveDokumentyKollekto(js, m_id); + } + + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + + + + + } + + void saveDokumentyKollekto ( JSONObject js, String m_id){ + JSONArray dokumenty_kollekto; + + File dir_pliki_kollekto = new File(prefs.getString("dir", "") + "/pliki_kollekto"); + //Log.d("my_debug", "saveDokumentyKollekto"); + if(!dir_pliki_kollekto.isDirectory()) { + //Log.d("my_debug", "tworze dir: pliki_kollekto"); + if (!dir_pliki_kollekto.mkdirs()) { + } + } + + try { + dokumenty_kollekto = js.getJSONArray("dokumenty_kollekto"); + JSONObject dokument; + String fileName; + String data_pobrania; + String url; + String path; + for ( int i=0; i(); + + + JSONArray jFiles = jo.getJSONArray("files"); + if( jFiles != null && jFiles.length()>0){ + for( int i=0; i0){ + for( int i=0; i0){ + for ( int i=0; i 0) { + String st =new String(buffer, 0, s); + //Log.d(SRV, "i=" + s +", data:" + st); + sb.append(st); + } + return sb.toString(); + } + + + public String readFileFromPath(String path) { + + String content = ""; + File myFile = new File(path); + if( myFile.isFile()){ + content = DedalHelper.getFileContent(myFile.getAbsolutePath()); + } + return content; + } + + @Override + public IBinder onBind(Intent arg0) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/app/src/main/java/com/likesoft/mdedal/DedalHelper.java b/app/src/main/java/com/likesoft/mdedal/DedalHelper.java new file mode 100644 index 0000000..080bad9 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/DedalHelper.java @@ -0,0 +1,538 @@ +package com.likesoft.mdedal; + +import android.content.SharedPreferences; +import android.os.Environment; +import android.preference.PreferenceManager; +import android.util.Base64; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.Key; +import java.security.KeyStore; +import java.security.SecureRandom; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.SecretKeySpec; + +public class DedalHelper { + + + static HashMap statusy; + static { + statusy = new HashMap(); + statusy.put("wypelniane", "WYPE�NIANE"); + statusy.put("nie_przydz", "NIEPRZYDZIELONE"); + statusy.put("przydz_nie_odeb", "PRZYDZIELONE"); + statusy.put("przydz_odeb", "REALIZACJA"); + statusy.put("wykonane", "WYKONANE"); + statusy.put("wykonane_zaak", "ZAAKCEPTOWANE"); + statusy.put("odrzucone", "ODRZUCONE"); + statusy.put("anulowane", "ANULOWANE"); + statusy.put("anulowane_zaak", "ANULOWANE_ZAAKCEPTOWANE"); + statusy.put("zawieszona", "ZAWIESZONA"); + } +// static DedalHelper obj = new DedalHelper(); +// public DedalHelper(){ +// } + public static String getStatusDesc( String s){ + if( statusy.containsKey(s)){ + return statusy.get(s); + }else{ + return s; + } + } + + // +// static HashMap sts; +// static { +// sts = new HashMap(); +// sts.put("wypelniane", "WYPE�NIANE"); +// sts.put("nie_przydz", "NIEPRZYDZIELONE"); +// sts.put("przydz_nie_odeb", "PRZYDZIELONE"); +// sts.put("przydz_odeb", "ODEBRANE"); +// sts.put("wykonane", "WYKONANE"); +// sts.put("wykonane_zaak", "ZAAKCEPTOWANE"); +// sts.put("odrzucone", "ODRZUCONE"); +// sts.put("anulowane", "ANULOWANE"); +// sts.put("anulowane_zaak", "ANULOWANE_ZAAKCEPTOWANE"); +// sts.put("zawieszona", "ZAWIESZONA"); +// } +// public static String getStatusDescShort( String s){ +// if( statusy.containsKey(s)){ +// return statusy.get(s); +// }else{ +// return s; +// } +// } + // Input a double latitude or longitude in the decimal format + // e.g. -79.982195 + public static String decimalToDMS(double coord) { + String output, degrees, minutes, seconds; + + // gets the modulus the coordinate divided by one (MOD1). + // in other words gets all the numbers after the decimal point. + // e.g. mod := -79.982195 % 1 == 0.982195 + // + // next get the integer part of the coord. On other words the whole number part. + // e.g. intPart := -79 + + double mod = coord % 1; + int intPart = (int)coord; + + //set degrees to the value of intPart + //e.g. degrees := "-79" + + degrees = String.valueOf(intPart); + + // next times the MOD1 of degrees by 60 so we can find the integer part for minutes. + // get the MOD1 of the new coord to find the numbers after the decimal point. + // e.g. coord := 0.982195 * 60 == 58.9317 + // mod := 58.9317 % 1 == 0.9317 + // + // next get the value of the integer part of the coord. + // e.g. intPart := 58 + + coord = mod * 60; + mod = coord % 1; + intPart = (int)coord; + if (intPart < 0) { + // Convert number to positive if it's negative. + intPart *= -1; + } + + // set minutes to the value of intPart. + // e.g. minutes = "58" + minutes = String.valueOf(intPart); + + //do the same again for minutes + //e.g. coord := 0.9317 * 60 == 55.902 + //e.g. intPart := 55 + coord = mod * 60; + intPart = (int)coord; + if (intPart < 0) { + // Convert number to positive if it's negative. + intPart *= -1; + } + + // set seconds to the value of intPart. + // e.g. seconds = "55" + seconds = String.valueOf(intPart); + + // I used this format for android but you can change it + // to return in whatever format you like + // e.g. output = "-79/1,58/1,56/1" + output = degrees + "/1," + minutes + "/1," + seconds + "/1"; + + //Standard output of D°M′S″ + //output = degrees + "°" + minutes + "'" + seconds + "\""; + + return output; + } + /* + * Conversion DMS to decimal + * + * Input: latitude or longitude in the DMS format ( example: W 79° 58' 55.903") + * Return: latitude or longitude in decimal format + * hemisphereOUmeridien => {W,E,S,N} + * + */ + public static double DMSToDecimal(String hemisphereOUmeridien,double degres,double minutes,double secondes) + { + double LatOrLon=0; + double signe=1.0; + + if((hemisphereOUmeridien.equals("W"))||(hemisphereOUmeridien.equals("S"))) {signe=-1.0;} + LatOrLon = signe*(Math.floor(degres) + Math.floor(minutes)/60.0 + secondes/3600.0); + + return(LatOrLon); + } + + public static String getValueFromKod(String kod, JSONObject jZlecenie) { + String value = ""; + try{ + if( kod.equals("tworca")){ + value = jZlecenie.getString("tworca_login");//id_tworca + }else if( kod.equals("inspektor")){ + //Log.d("Helper", "kod,") + value = jZlecenie.getString("inspektor_login"); + }else if( kod.equals("info_alert")){ + value = jZlecenie.getString("data_alert"); + }else if( kod.equals("nr_sprawy-link")){ + value = jZlecenie.getString("nr_sprawy"); + }else if( kod.equals("status")){ + value = DedalHelper.getStatusDesc(jZlecenie.getString("status")); + //tw.setText(DedalHelper.getStatusDescShort(jZlecenie.getString("status"))); +// }else if( kod.equals("")){ + }else if( kod.startsWith("data_")){ + String s = jZlecenie.getString(kod); + if( s.length()>=10){ + value = jZlecenie.getString(kod).substring(0, 10); + }else{ + value = s; + } + }else{ + if( !jZlecenie.isNull(kod)){ + value = jZlecenie.getString(kod); + } + } + }catch( JSONException jE){ + Log.d("ListActivity", jE.getMessage()); + } + + + + return value; + } + + public static String getCurrentDate() { + return getCurrentDate("yyyy-MM-dd HH:mm:ss"); + } + + public static String getCurrentDate(String format) { + DateFormat dateFormat = new SimpleDateFormat(format); + Calendar c = Calendar.getInstance(); + return dateFormat.format(c.getTime()); + } + public static String getFileContent(String file_path) { + return getCryptFileContent(file_path); + } + + public static boolean putFileContent(String file_path, String content) { + return putCryptFileContent(file_path, content); + } +/* + public static String getFileContentSimple(String file_path) { + String return_str = ""; + + File ffile = new File(file_path); + if( !ffile.exists() ) { + return return_str; + } + + int length = (int) ffile.length(); + byte[] bytes = new byte[length]; + + FileInputStream in = null; + try { + in = new FileInputStream(ffile); + try { + in.read(bytes); + } finally { + in.close(); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return_str = new String(bytes); + return return_str; + } */ + + public static byte [] key; + + public static byte[] generateKey() throws Exception + { + if( key != null){ + return key; + } + byte[] keyStart = "likesoft".getBytes("UTF-8"); + + String pass = "HasloD0Maga7nu"; + + KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); + File f = new File(Environment.getExternalStorageDirectory()+ "/dedal/truststore.jks"); + if( f.isFile()) { + trustStore.load(new FileInputStream(f.getAbsolutePath()), pass.toCharArray()); + }else{ + trustStore.load(null, null); + } + + Key klucz = trustStore.getKey("dedal", pass.toCharArray()); + if( klucz!= null ){ + return klucz.getEncoded(); + }else { // zapisz do store nowy: + KeyGenerator kgen = KeyGenerator.getInstance("AES"); + //SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").getProvider(); +// SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); + SecureRandom sr = new SecureRandom(); + sr.setSeed(keyStart); + kgen.init(128, sr); + SecretKey skey = kgen.generateKey(); + + trustStore.setKeyEntry("dedal", skey, pass.toCharArray(), null); + + FileOutputStream out = new FileOutputStream(f.getAbsolutePath()); + trustStore.store(out, pass.toCharArray()); + out.close(); + key = skey.getEncoded(); + } + return key; + } + + public static byte[] encodeFile( byte[] fileData) throws Exception + { + if( key == null){ + key = generateKey(); + } + + SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec); + byte[] encrypted = cipher.doFinal(fileData); + + return encrypted; + } + public static String encodeB64( String fileData) + { + try{ + byte[] e = encodeFile(fileData.getBytes()); + return Base64.encodeToString(e, Base64.DEFAULT); + }catch (Exception ex){ + Log.e("CRYPT", "decodeB64 problem"); + } + return fileData; + } + + public static byte[] decodeFile( byte[] fileData) throws Exception + { + if( key == null){ + key = generateKey(); + } + SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(Cipher.DECRYPT_MODE, skeySpec); + + try { + byte[] decrypted = cipher.doFinal(fileData); + return decrypted; + }catch( Exception e){ + Log.e("CRYPT", "nie udało się odszyfrować bytes ", e); + return fileData; + } + } +//Base64.decode(input, Base64.DEFAULT) + public static String decodeB64( String fileData) + { + try { + byte[] e = decodeFile(Base64.decode(fileData, Base64.DEFAULT)); + return new String(e); + }catch (Exception ex){ + Log.e("CRYPT", "decodeB64 problem"); + } + return fileData; + } + + public static void copyEncode(File src, File dst) throws IOException { + + if( !src.exists() ) { + return ; + } + + int length = (int) src.length(); + byte[] bytes = new byte[length]; + + + InputStream in = new FileInputStream(src); + OutputStream out = new FileOutputStream(dst); + + try { + in.read(bytes); + } finally { + in.close(); + } + + try { + byte[] coded = new byte[0]; + try { + coded = encodeFile(bytes); + } catch (Exception e) { + Log.e("CRYPT", "problem z kodowaniem", e); + } + out.write(coded); + } finally { + out.close(); + } + } + + public static String getCryptFileContent(String file_path) { + String return_str = ""; + + File ffile = new File(file_path); + if( !ffile.exists() ) { + return return_str; + } + + int length = (int) ffile.length(); + byte[] bytes = new byte[length]; + + FileInputStream in = null; + try { + in = new FileInputStream(ffile); + try { + in.read(bytes); + } finally { + in.close(); + } + } catch (FileNotFoundException e) { + Log.e("DEDAL", "File not found", e); + } catch (IOException e) { + Log.e("DEDAL", "IO", e); + } + + byte[] ret = new byte[0]; + try { + + ret = decodeFile(bytes); + return_str = new String(ret); + } catch (Exception e) { + Log.e("CRYPT", "nie udało się odszyfrować: " + file_path, e); + //jeśli nie udało sie odkodować, zwróć plik + return_str = new String(bytes); + } + + return return_str; + } + public static byte[] getCryptFileBytes(String file_path) { + + File ffile = new File(file_path); + if( !ffile.exists() ) { + return null; + } + + int length = (int) ffile.length(); + byte[] bytes = new byte[length]; + + FileInputStream in = null; + try { + in = new FileInputStream(ffile); + try { + in.read(bytes); + } finally { + in.close(); + } + } catch (FileNotFoundException e) { + Log.e("DEDAL", "File not found", e); + } catch (IOException e) { + Log.e("DEDAL", "IO", e); + } + + byte[] ret; + try { + + ret = decodeFile(bytes); + return ret; + } catch (Exception e) { + Log.e("CRYPT", "nie udało się odszyfrować: " + file_path, e); + //jeśli nie udało sie odkodować, zwróć plik + return bytes; + } + + } + + public static boolean putCryptFileContent(String file_path, String content) { + File ffile = new File(file_path); + + FileOutputStream stream = null; + try { + stream = new FileOutputStream(ffile); + try { + byte[] coded = encodeFile(content.getBytes()); + stream.write(coded); + } finally { + stream.close(); + return true; + } + } catch (FileNotFoundException e) { + Log.e("DEDAL", "File not found", e); + } catch (IOException e) { + Log.e("DedalHelper", "File can't be saved"+ file_path, e); +// System.exit(0); + } + return false; + } + +/* + public static boolean putFileContentSimple(String file_path, String content) { + File ffile = new File(file_path); + + FileOutputStream stream = null; + try { + stream = new FileOutputStream(ffile); + try { + stream.write(content.getBytes()); + } finally { + stream.close(); + return true; + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + Log.e("DedalHelper", "File can't be saved"+ file_path, e); + // getActivity().finish(); + System.exit(0); + } + + return false; + } +*/ + public static boolean deleteFile(String file_path) { + File file = new File(file_path); + if( file.exists() ) { + return file.delete(); + } + return false; + } + + public static String getModOrJsonFileName(String fileNameJson) { + String fileNameJson_mod = fileNameJson.replace(".json", ".mod"); + File file = new File(fileNameJson_mod); + if(file.exists()) { + return fileNameJson_mod; + } + return fileNameJson; + } + + public static String datetime2date(String datetime) { + String date = null; + try { + SimpleDateFormat sdf_date_time = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + SimpleDateFormat sdf_date = new SimpleDateFormat("yyyy-MM-dd"); + Date dat = sdf_date_time.parse(datetime); + date = sdf_date.format(dat); + } catch (ParseException e) { + Log.e("DEDAL", "Parse date", e); + } + return date; + } + +// public static int findInArrayList(ArrayList al, String content) { +// int j = -1; +// for( int i = 0 ; i < al.size() ; i++ ) { +// if( content.equals(al.get(i)) ) { +// j = i; +// break; +// } +// } +// return j; +// } +} diff --git a/app/src/main/java/com/likesoft/mdedal/DedalHttpConnection.java b/app/src/main/java/com/likesoft/mdedal/DedalHttpConnection.java new file mode 100644 index 0000000..fe7af6e --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/DedalHttpConnection.java @@ -0,0 +1,418 @@ +package com.likesoft.mdedal; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.KeyStore; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.net.ssl.HttpsURLConnection; + +import org.apache.http.Header; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.HttpRequest; +import org.apache.http.HttpResponse; +import org.apache.http.HttpVersion; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.PlainSocketFactory; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.scheme.SocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; +import org.apache.http.message.BasicHeader; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpParams; +import org.apache.http.params.HttpProtocolParams; +import org.apache.http.protocol.HTTP; +import org.apache.http.protocol.HttpContext; +import org.apache.http.util.EntityUtils; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.util.Base64; +import android.util.Log; + +public class DedalHttpConnection { + + private static final String SRV = "MyHttpConnection"; + private String login; + private String pass; + private String hostPath; + public static String certSerialNumber=""; + public static String certOdcisk=""; + private DefaultHttpClient mHttpClient; + public static Context context; + + public DedalHttpConnection(Context context) { + //hostPath = "http://192.168.1.106/svn_home/SmsGateServer/src"; + SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); + hostPath = sharedPrefs.getString("hostName", ""); + login = sharedPrefs.getString("user", ""); + pass = DedalHelper.decodeB64(sharedPrefs.getString("password", "")); + certSerialNumber = sharedPrefs.getString("certSerialNumber", ""); + + //String cert64 = Base64.decode(sharedPrefs.getString("certOdcisk")); + try { + certOdcisk = new String(DedalHelper.decodeFile(Base64.decode(sharedPrefs.getString("certOdcisk", ""), Base64.DEFAULT))); + } catch (Exception e) { + e.printStackTrace(); + } + + + Log.d("my_debug", "Create MyHttpConnection. hostPath: "+hostPath+", login: "+login); //+", pass: "+pass + this.context = context; + } + + public String sendPost(String scriptName) { + return sendPost(scriptName, null); + } + + public String sendPost(String scriptName, Map params) { + Log.d("my_debug", "sendPost, scriptName: "+scriptName+", params: "+params ); + + ServerCommunication(); + if( mHttpClient == null){ + Log.e("SECURITY", "Network not initialized"); + return null; + } + //Log.d("my_debug", "getSms"); + HttpPost httppost = new HttpPost( hostPath + "/" + scriptName); //sms_send_download.php"); +// + httppost.setHeader(new BasicHeader("Content-Type", "application/x-www-form-urlencoded")); + httppost.setHeader(new BasicHeader("charset", "UTF-8")); +// +// + List parameters = new ArrayList(); + + parameters.add(new BasicNameValuePair("login", login)); + parameters.add(new BasicNameValuePair("pass", pass)); + + if( params != null ) { + Iterator iterator = params.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry mapEntry = (Map.Entry) iterator.next(); + String key = (String) mapEntry.getKey(); + String value = (String) mapEntry.getValue(); + //Log.d("my_debug", "The key is: " + key + ",value is :" + value); + parameters.add(new BasicNameValuePair(key, value)); + } + } + + + try { + httppost.setEntity(new UrlEncodedFormEntity(parameters, "UTF-8")); + HttpResponse response = mHttpClient.execute(httppost); + if( response != null){ + HttpEntity r_entity = response.getEntity(); + String responseString = EntityUtils.toString(r_entity); + Log.d("my_debug", "sendPost, response from "+scriptName+": "+responseString); + //httppost.completed(); + //response.body().close(); + mHttpClient.getConnectionManager().closeExpiredConnections(); + + int sC = response.getStatusLine().getStatusCode(); + + if( sC == 200 ) { + return responseString; + }else{ + String ctv = r_entity.getContentType().getValue(); + Log.d( "sendPost", "http code: " + sC + ", content type: " + ctv); + return null; + } + + } + } catch (UnsupportedEncodingException e) { + com.likesoft.mdedal.Log.e("DEDAL", "Encoding", e); + } catch (ClientProtocolException e) { + com.likesoft.mdedal.Log.e("DEDAL", "Client protocol", e); + } catch (IOException e) { + com.likesoft.mdedal.Log.e("DEDAL", "IO", e); + } + return null; + //Log.d(SRV, "Entity BasicNameValuePair za�adowane"); + + } + + public byte [] getBytePost(String scriptName, Map params) { + Log.d("my_debug", "sendPost, scriptName: "+scriptName+", params: "+params ); + ServerCommunication(); + if( mHttpClient == null){ + Log.e("SECURITY", "Network not initialized"); + return null; + } + + //Log.d("my_debug", "getSms"); + HttpPost httppost = new HttpPost( hostPath + "/" + scriptName); //sms_send_download.php"); +// + httppost.setHeader(new BasicHeader("Content-Type", "application/x-www-form-urlencoded")); + httppost.setHeader(new BasicHeader("charset", "UTF-8")); +// +// + List parameters = new ArrayList(); + + parameters.add(new BasicNameValuePair("login", login)); + parameters.add(new BasicNameValuePair("pass", pass)); + + if( params != null ) { + Iterator iterator = params.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry mapEntry = (Map.Entry) iterator.next(); + String key = (String) mapEntry.getKey(); + String value = (String) mapEntry.getValue(); + //Log.d("my_debug", "The key is: " + key + ",value is :" + value); + parameters.add(new BasicNameValuePair(key, value)); + } + } + + + try { + httppost.setEntity(new UrlEncodedFormEntity(parameters, "UTF-8")); + HttpResponse response = mHttpClient.execute(httppost); + if( response != null){ + HttpEntity r_entity = response.getEntity(); + byte[] buffer = EntityUtils.toByteArray(r_entity); //new byte[in.available()]; + mHttpClient.getConnectionManager().shutdown(); + int sC = response.getStatusLine().getStatusCode(); + if( sC == 200 ) { + return buffer; + }else{ + String ctv = r_entity.getContentType().getValue(); + Log.d( "sendPost", "http code: " + sC + ", content type: " + ctv); + return null; + } + + } + } catch (UnsupportedEncodingException e) { + Log.e("getInputStream", "nieudane pobranie", e); + } catch (ClientProtocolException e) { + Log.e("getInputStream", "nieudane pobranie", e); + } catch (IOException e) { + Log.e("getInputStream", "nieudane pobranie", e); + } + return null; + + } + + + //image/jpeg Content type + public byte[] getPicture(String url) { + Log.d("my_debug", "getPicture, url: "+url); + ServerCommunication(); + if( mHttpClient == null){ + Log.e("SECURITY", "Network not initialized"); + return null; + } + + //Log.d("my_debug", "getSms"); + HttpPost httppost = new HttpPost( hostPath + "/" + url); //sms_send_download.php"); + httppost.setHeader(new BasicHeader("Content-Type", "application/x-www-form-urlencoded")); + httppost.setHeader(new BasicHeader("charset", "UTF-8")); + List parameters = new ArrayList(); + parameters.add(new BasicNameValuePair("login", login)); + parameters.add(new BasicNameValuePair("pass", pass)); + + try { + httppost.setEntity(new UrlEncodedFormEntity(parameters, "UTF-8")); + HttpResponse response = mHttpClient.execute(httppost); + if( response != null){ + HttpEntity r_entity = response.getEntity(); + byte[] buffer = EntityUtils.toByteArray(r_entity); //new byte[in.available()]; + //response.getStatusLine(). + Header ct = r_entity.getContentType(); + String ctv = r_entity.getContentType().getValue(); + int sC = response.getStatusLine().getStatusCode(); + mHttpClient.getConnectionManager().shutdown(); + if( sC == 200 && ctv.toLowerCase().contains("jpg")) { + return buffer; + }else{ + Log.d( "GET_PICTURE", "http code: " + sC + ", content type: " + ctv); + return null; + } + + } + } catch (UnsupportedEncodingException e) { + com.likesoft.mdedal.Log.e("DEDAL", "Unsupported Encoding", e); + } catch (ClientProtocolException e) { + com.likesoft.mdedal.Log.e("DEDAL", "Client protocol", e); + } catch (IOException e) { + com.likesoft.mdedal.Log.e("DEDAL", "IO", e); + } + + + return null; + //Log.d(SRV, "Entity BasicNameValuePair za�adowane"); + + } +//todo: do poprawy - chyba nie działa pobieranie plików z Kollekto... + + /** + * @deprecated + * @param url + * @param path + * @param fileName + */ + void downloadFile (String url, String path, String fileName) { + + Log.d("my_debug", "downloadFile: url: "+url+" path: "+path+" fileName: "+fileName); + try { + + url = hostPath + "/" + url; + + File fId = new File(path); + if(!fId.isDirectory()) { + if (!fId.mkdirs()) { + } + } + + File myFile = new File(path+"/"+ fileName); + if( !myFile.exists()) { + myFile.createNewFile(); + + URL urlF = new URL(url+"/"+fileName); + + HttpURLConnection urlConnectionF; + if (urlF.getProtocol().toLowerCase().equals("https")) { + // trustAllHosts(); + HttpsURLConnection urlHttpsConnection = (HttpsURLConnection) urlF.openConnection(); + urlHttpsConnection.setHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + urlConnectionF = urlHttpsConnection; + } else { + urlConnectionF = (HttpURLConnection) urlF.openConnection(); + } + + + InputStream inF = new BufferedInputStream(urlConnectionF.getInputStream()); + + FileOutputStream fosF; + + fosF = new FileOutputStream(myFile); + byte buffer[] = new byte[10000]; + int x = 0; + while( (x = inF.read(buffer)) >0){ + fosF.write(buffer, 0, x); + Log.d(SRV, "Picture - czytam znaków: " + x); + } + fosF.flush(); + fosF.close(); + } + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + Log.e(SRV, "", e); + } catch (IOException e) { + // TODO Auto-generated catch block + Log.e(SRV, "", e); + } + } + /* + private static void trustAllHosts() { + + X509TrustManager easyTrustManager = new X509TrustManager() { + public void checkClientTrusted( + X509Certificate[] chain, + String authType) throws CertificateException { + // Oh, I am easy! + } + public void checkServerTrusted( + X509Certificate[] chain, + String authType) throws CertificateException { + com.likesoft.mdedal.Log.d("certyfikat", "MyHttpConnection -serverTrusted23: " + Arrays.toString(chain)); + + + } + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + }; + + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[] {easyTrustManager}; + + // Install the all-trusting trust manager + try { +// SSLContext sc = SSLContext.getInstance("SSL"); + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + + // +// SSLSocketFactory factory =sc.getSocketFactory(); +// SSLSocket socket =(SSLSocket)factory.createSocket("dedal.eos-ksi.pl", 443); +// socket.startHandshake(); +// SSLSession session = socket.getSession(); +// java.security.cert.Certificate[] servercerts = session.getPeerCertificates(); +// for (int i = 0; i < servercerts.length; i++) { +// System.out.print("-----BEGIN CERTIFICATE-----\n"); +// //System.out.print(Base64.encodeBytes().encode(servercerts[i].getEncoded())); +// // System.out.print(Base64.getEncoder().encode(servercerts[i].getEncoded())); +// byte[] e = servercerts[i].getEncoded(); +// System.out.print(Base64.encodeToString(e, 0)); +// System.out.print(servercerts[i].getEncoded()); +// System.out.print("\n-----END CERTIFICATE-----\n"); +// } +// socket.close(); + // + + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } catch (Exception e) { + e.printStackTrace(); + Log.d("my_debug", ""); + } + } + */ + public static DefaultHttpClient getNewHttpClient() { + try { + // trustAllHosts(); + KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); + trustStore.load(null, null); + + org.apache.http.conn.ssl.SSLSocketFactory sf = new DedalSSLSocketFactory(trustStore); + if(BuildConfig.DEBUG) { + sf.setHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + }else { + sf.setHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); +// sf.setHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.STRICT_HOSTNAME_VERIFIER); + } + + HttpParams params = new BasicHttpParams(); + HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); + HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); + + SchemeRegistry registry = new SchemeRegistry(); + + if(BuildConfig.DEBUG) { + registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + } + registry.register(new Scheme("https", (SocketFactory) sf, 443)); + + ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); + + return new DefaultHttpClient(ccm, params); + } catch (Exception e) { + Log.e("my_debug", "catch", e); + // return new DefaultHttpClient(); + return null; + } + } + + public void ServerCommunication() { + mHttpClient = DedalHttpConnection.getNewHttpClient(); + } +} diff --git a/app/src/main/java/com/likesoft/mdedal/DedalSSLSocketFactory.java b/app/src/main/java/com/likesoft/mdedal/DedalSSLSocketFactory.java new file mode 100644 index 0000000..6add1cb --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/DedalSSLSocketFactory.java @@ -0,0 +1,108 @@ +package com.likesoft.mdedal; + +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.util.Base64; + +import java.io.IOException; +import java.net.Socket; +import java.net.UnknownHostException; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +public class DedalSSLSocketFactory extends org.apache.http.conn.ssl.SSLSocketFactory { + SSLContext sslContext = SSLContext.getInstance("TLS"); + + public DedalSSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { + super(truststore); + + TrustManager tm = new X509TrustManager() { + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + com.likesoft.mdedal.Log.d("certyfikat", "MySSLSocketFactory -checkClientTrusted: " + Arrays.toString(chain)); + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + // com.likesoft.mdedal.Log.d("certyfikat", "MySSLSocketFactory -serverTrusted AA: " + Arrays.toString(chain)); + +// for (int i = 0; i < chain.length; i++) { +// // android.util.Log.d("cert Serial Number" + i + ":", chain[i].getSerialNumber().toString()); +// //Log.d( "cert", "validity: " + chain[0].checkValidity()); +// Collection> aN = chain[i].getSubjectAlternativeNames(); +// if( aN != null) { +// +// Object[] a = aN.toArray(); +// android.util.Log.d("cert AN", Arrays.toString(a)); +// } +// // Oh, I am easy! +// } + + if( chain.length>0){ + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(DedalHttpConnection.context); + if( DedalHttpConnection.certSerialNumber.length()==0) { //init + SharedPreferences.Editor e = prefs.edit(); + e.putString("certSerialNumber", chain[0].getSerialNumber().toString()); + e.commit(); + }else { //check + if( !chain[0].getSerialNumber().toString().equals(prefs.getString("certSerialNumber", "") )){ + // security problem + android.util.Log.e("SECURITY", "Cert Serial Number incorrect"); + throw new CertificateException("Cert Serial Number incorrect"); + } + } + + if( DedalHttpConnection.certSerialNumber.length()==0) { //init, gdy nie było jeszcze serial number + SharedPreferences.Editor e = prefs.edit(); + + byte[] sig; + try { + sig = DedalHelper. encodeFile(chain[0].getSignature()); + e.putString("certOdcisk", Base64.encodeToString(sig, Base64.DEFAULT)); + e.commit(); + } catch (Exception ex) { + android.util.Log.e("SECURITY", "Cert Signature encode incorrect"); + throw new CertificateException("Cert Signature incorrect"); + } + }else { //check + String chainSig = new String(chain[0].getSignature()); + + if( !chainSig.equals(DedalHttpConnection.certOdcisk )){ + // security problem + android.util.Log.e("SECURITY", "Cert Signature incorrect"); + throw new CertificateException("Cert Signature incorrect"); + } + } + + + } + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + }; + + sslContext.init(null, new TrustManager[] { tm }, null); + } + + @Override + public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { + return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); + } + + @Override + public Socket createSocket() throws IOException { + return sslContext.getSocketFactory().createSocket(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/likesoft/mdedal/DedalService.java b/app/src/main/java/com/likesoft/mdedal/DedalService.java new file mode 100644 index 0000000..c718b37 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/DedalService.java @@ -0,0 +1,1680 @@ +package com.likesoft.mdedal; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.net.Uri; +import android.os.IBinder; +import android.os.Build; +import android.preference.PreferenceManager; +import androidx.core.content.ContextCompat; +import android.telephony.TelephonyManager; + +//import com.likesoft.mdedaltest.R; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpVersion; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.PlainSocketFactory; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.scheme.SocketFactory; +import org.apache.http.entity.mime.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.entity.mime.content.ByteArrayBody; +import org.apache.http.entity.mime.content.FileBody; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; +import org.apache.http.message.BasicHeader; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpParams; +import org.apache.http.params.HttpProtocolParams; +import org.apache.http.protocol.HTTP; +import org.apache.http.util.EntityUtils; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.KeyStore; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.TreeSet; +import java.util.Vector; + +//import javax.net.ssl.SSLSocketFactory; +//import android.util.Log; + +public class DedalService extends Service { + + @SuppressLint({"MissingPermission", "HardwareIds"}) + private static String safeSubscriberId(Context ctx) { + try { + // Dostęp do IMSI tylko na API <= 28 (Pie) i z READ_PHONE_STATE + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P + && ContextCompat.checkSelfPermission(ctx, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { + TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); + if (tm != null) { + return tm.getSimState() == TelephonyManager.SIM_STATE_READY ? tm.getSubscriberId() : ""; + } + } + } catch (Exception ignored) { } + return ""; + } + + private static String safeLine1Number(Context ctx) { + try { + boolean hasPermission = + ContextCompat.checkSelfPermission(ctx, Manifest.permission.READ_PHONE_NUMBERS) == PackageManager.PERMISSION_GRANTED + || ContextCompat.checkSelfPermission(ctx, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED + || ContextCompat.checkSelfPermission(ctx, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED; + if (hasPermission) { + TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); + return tm != null ? tm.getLine1Number() : ""; + } + } catch (Exception ignored) { } + return ""; + } + + static Boolean isStopped = false; + private static final String SRV = "DedalService"; + SharedPreferences prefs; + String hostPath = ""; + String login = "";//prefs.getString("user", ""); + String pass = "";//prefs.getString("password", ""); + String gzip = "true"; +/* + private static void trustAllHosts() { + + X509TrustManager easyTrustManager = new X509TrustManager() { + public void checkClientTrusted( + X509Certificate[] chain, + String authType) throws CertificateException { + // Oh, I am easy! + } + + public void checkServerTrusted( + X509Certificate[] chain, + String authType) throws CertificateException { + Log.d("certyfikat", "DedalService serverTrusted: " + Arrays.toString(chain)); + // Oh, I am easy! + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + }; + + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[]{easyTrustManager}; + + // Install the all-trusting trust manager + try { + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } catch (Exception e) { + e.printStackTrace(); + Log.e(SRV, "", e); + } + } +*/ + public static HttpClient getNewHttpClient() { + try { + //trustAllHosts(); + KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); + trustStore.load(null, null); + + org.apache.http.conn.ssl.SSLSocketFactory sf = new DedalSSLSocketFactory(trustStore); +// sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER); + sf.setHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + + HttpParams params = new BasicHttpParams(); + HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); + HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); + + SchemeRegistry registry = new SchemeRegistry(); + registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + registry.register(new Scheme("https", (SocketFactory) sf, 443)); + + ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); + + return new DefaultHttpClient(ccm, params); + } catch (Exception e) { + return new DefaultHttpClient(); + } + } + + + //Object w = new Object(); + @SuppressLint("DefaultLocale") + private class WorkingThread implements Runnable { + + @Override + public void run() { + //while( true){ + + Context context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + hostPath = prefs.getString("hostName", ""); + login = prefs.getString("user", ""); + pass = DedalHelper.decodeB64(prefs.getString("password", "")); + + File fNext = new File(prefs.getString("dir", "") + "/dedalsrv.continue"); + if (fNext.exists()) { + fNext.delete(); + } + File fLock = new File(prefs.getString("dir", "") + "/dedalsrv.lock"); + try { + fLock.createNewFile(); + } catch (IOException e) { + Log.e(SRV, "", e); + } + File fconn = new File(prefs.getString("dir", "") + "/dedalsrv.connection"); + if (fconn.exists()) { + fconn.delete(); + } + + + //Your code goes here + File fLockLogin = new File(prefs.getString("dir", "") + "/dedalsrv.wrongLogin"); + Log.d(SRV, "Service upload check. "); + try { + if (!checkLoginConnection()) { + // zły login/haslo + if (!fLockLogin.exists()) { + fLockLogin.createNewFile(); + } + File fLockEnd = new File(prefs.getString("dir", "") + "/dedalsrv.lock"); + if (fLockEnd.exists()) { + fLockEnd.delete(); + } + return; + } else { + if (fLockLogin.exists()) { + fLockLogin.delete(); + } + } + + } catch (Exception cE) { + Log.e(SRV, "Problem połączenia." + cE.getMessage()); + Log.e(SRV, "", cE); + // błąd połączenia + File fLockEnd = new File(prefs.getString("dir", "") + "/dedalsrv.lock"); + if (fLockEnd.exists()) { + fLockEnd.delete(); + } + if (fLockLogin.exists()) { + fLockLogin.delete(); + } + + File fLockCon = new File(prefs.getString("dir", "") + "/dedalsrv.connection"); + try { + fLockCon.createNewFile(); + } catch (IOException econ) { + Log.e(SRV, "", econ); + } + + return; + } + + try { + + File fLockCon = new File(prefs.getString("dir", "") + "/dedalsrv.connection_password"); + if( fLockCon.exists()){ + fLockCon.delete(); + } + + uploadFiles(); + uploadModifications(); // przekazuje przez mobi.php, 5 nieudanych prób blokuje dostęp. + uploadFoldersModifications(); + uploadFoldersOrderModifications(); + uploadWidokProfilModifications(); + uploadKP(); + uploadKPWplaty(); + } catch (Exception cE) { + Log.e(SRV, "", cE); + } + try { + // tutaj pobierać pliki z serwera + checkNewIssues(); + + getKp(); + getKpWplaty(); + + } catch (Exception cE) { + Log.e(SRV, "", cE); + } + + File fLockEnd = new File(prefs.getString("dir", "") + "/dedalsrv.lock"); + if (fLockEnd.exists()) { + fLockEnd.delete(); + } + File fNextEnd = new File(prefs.getString("dir", "") + "/dedalsrv.continue"); + if (fNextEnd.exists()) { + fNextEnd.delete(); + } else { + int refreshPos = prefs.getInt("refresh", 2); + //android.R.id. + Resources res = getResources(); + int values[] = res.getIntArray(R.array.pref_sync_frequency_values); + res.getString(R.string.app_name); + + Log.d(SRV, "Sleep"); + +// int sleepTime =values[refreshPos]*1000; +// Log.d(SRV, "Sleep time: "+ sleepTime); +// Thread.sleep(sleepTime); //30sec=30000, 5min= 300000 + +// Alarm alarm = new Alarm(); +// alarm.CancelAlarm(context); +// alarm.SetAlarm(context); + + } + } + + public boolean PingVPN(URL url) { + try { + InetAddress address = InetAddress.getByName(url.getHost()); + + boolean reachable = address.isReachable(1000); + Log.d(SRV, "Is host reachable? " + reachable); + return reachable; + } catch (Exception e) { + Log.e("DEDAL", "PING VPN", e); + return false; + } + } + + private void setConnectionStatus( String status){ + File fStatus = new File(prefs.getString("dir", "") + "/dedal.status"); + try { + fStatus.createNewFile(); + //FileWriter(fStatus) + FileOutputStream fosStatus = new FileOutputStream(fStatus); + fosStatus.write(status.getBytes()); + fosStatus.flush(); + fosStatus.close(); + } catch (IOException e) { + Log.e(SRV, "", e); + } + } + private boolean checkLoginConnection() throws Exception { + // try { + Log.d(SRV, "checkLoginConnection"); + Context context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + login = prefs.getString("user", ""); + pass = DedalHelper.decodeB64(prefs.getString("password", "")); + + // get GPS position + Double latitude = gps.getLatitude(); + Double longitude = gps.getLongitude(); + + + File fDir = new File(prefs.getString("dir", "") + "/baza"); + if (!fDir.isDirectory()) { + fDir.mkdirs(); + } + + + String imsistring = safeSubscriberId(getApplicationContext()); + if (imsistring == null || imsistring.isEmpty()) imsistring = "IMSI"; + String mPhoneNumber = safeLine1Number(getApplicationContext()); + if (mPhoneNumber == null || mPhoneNumber.isEmpty()) mPhoneNumber = "PHONE_LikeSoft"; + + String asUser; + asUser = prefs.getString("asuser", login); + + //co 0,5h wysyłać pełną listę zleceń. + URL url = null; + try { + url = new URL( + hostPath + "/xml/getListaZlecenJson2.php"); + + }catch (MalformedURLException mE){ + setConnectionStatus("NOT_AUTHORIZED"); + return false; + } + Log.d(SRV, url.toString()); + + //check server IP and ping. + if( !PingVPN(url)){ + //return false; + throw new Exception("VPN not working"); + } + + DedalHttpConnection con = new DedalHttpConnection(getApplicationContext()); + Map params_post = new HashMap(); + params_post.put("connection", "check"); + params_post.put("asuser", asUser); + params_post.put("gzip", gzip); + params_post.put("latitude", latitude.toString()); + params_post.put("longitude", longitude.toString()); + params_post.put("GPS", ""+gps.isGPSEnabled); + params_post.put("imsi", "&imsi="+imsistring+"T"+mPhoneNumber); + + //con.ServerCommunication(); + String s = con.sendPost("xml/getListaZlecenJson2.php", params_post); + + if( s!= null && s.length()>0 ) { + Log.d(SRV, "odczytany bufor, size: " + s.length()); + Log.d(SRV, "odczytany bufor: " + s); + // urlConnection.disconnect(); + + JSONObject jFile = new JSONObject(s); + String jStatus = jFile.getString("status"); + if ("NO_DATA".equals(jStatus)) { + setConnectionStatus("Brak danych"); + return true; // nothing to update + } else if ("NOT_ALLOWED".equals(jStatus)) { + setConnectionStatus("NOT_ALLOWED"); + return true; + } else if ("NOT_AUTHORIZED".equals(jStatus)) { + setConnectionStatus("NOT_AUTHORIZED"); + + return false; + } else if ("RELOAD".equals(jStatus)) { + // zaloguj za inspektora + //String asUser = prefs.getString("asUser", ""); + Log.d(SRV, "RELOAD:" + jFile.toString()); + String newPass = jFile.getString("asPassword"); + Editor e = prefs.edit(); + e.putString("user", asUser); + e.putString("password", DedalHelper.encodeB64(newPass)); + e.putString("asUser", ""); + e.commit(); + + context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + login = prefs.getString("user", ""); + pass = DedalHelper.decodeB64(prefs.getString("password", "")); + + return checkLoginConnection(); + } else if ("OK".equals(jStatus)) { + setConnectionStatus(jFile.getString("valid_to")); + return true; + } + } +// } catch (Exception e) { +// +// Log.d(SRV, "problem"); +// } + return false; + } + + private void checkNewIssues( ) { +// try { + + TreeSet wczytaneZlecenia = new TreeSet(); + Log.d(SRV, "checkNewIssues"); + Context context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + login = prefs.getString("user", ""); + pass = DedalHelper.decodeB64(prefs.getString("password", "")); + + + // get GPS position + Double latitude = gps.getLatitude(); + Double longitude = gps.getLongitude(); + + + + + //todo: remove issues not assigned to user. + Vector filesToDelete = new Vector(); + File d = new File(prefs.getString("dir", "") + "/baza");//getApplicationContext().getFilesDir(); + String sf = d.getAbsolutePath(); + Log.d(SRV,sf); + File files[] = d.listFiles(new FilenameFilter() { + public boolean accept(File dir, String name) { + return name.toLowerCase().endsWith(".json") || name.toLowerCase().endsWith(".txt"); + } + }); + if( files != null) { + for (int i = 0; i < files.length; i++) { +// files[i].delete(); + filesToDelete.add(files[i].getName()); + //Log.d(SRV, "istnieje plik json: " + files[i].getName()); + } + } + + Map daty_modyfikacji_zlecen = wczytajDatyPoprzednichModyfikacji(); + + + try { + String imsistring = safeSubscriberId(getApplicationContext()); + if (imsistring == null || imsistring.isEmpty()) imsistring = "IMSI"; + String mPhoneNumber = safeLine1Number(getApplicationContext()); + if (mPhoneNumber == null || mPhoneNumber.isEmpty()) mPhoneNumber = "PHONE_LikeSoft"; + + String asUser; + asUser = prefs.getString("asuser", "");//login); + + DedalHttpConnection con = new DedalHttpConnection(getApplicationContext()); + Map params_post = new HashMap(); + params_post.put("asuser", asUser); + params_post.put("gzip", gzip); + params_post.put("latitude", latitude.toString()); + params_post.put("longitude", longitude.toString()); + params_post.put("GPS", ""+gps.isGPSEnabled); + params_post.put("imsi", "&imsi="+imsistring+"T"+mPhoneNumber); + + String s = con.sendPost("xml/getListaZlecenJson2.php", params_post); + + + Log.d(SRV, "odczytany bufor, size: " + s.length()); + DedalHelper.putFileContent(prefs.getString("dir", "") + "/baza/lista.profil.work", s); + + //Log.d(SRV, s); + JSONObject jFile = new JSONObject(s); + String jStatus = jFile.getString("status"); + if( "NO_DATA".equals(jStatus)){ + return; // nothing to update + }else if( "NOT_ALLOWED".equals(jStatus)){ + // remove all data + usunPliki(filesToDelete); + return; + }else if( "NOT_AUTHORIZED".equals(jStatus)){ + return; + }else if( "RELOAD".equals(jStatus)){ + // zaloguj za inspektora + return; + } + + JSONObject jProfiles = jFile.getJSONObject("profile"); + Iterator pKeys = jProfiles.keys(); + while( pKeys.hasNext()){ + String idProfilu = (String)pKeys.next(); + JSONObject jProfil = jProfiles.getJSONObject(idProfilu); + + JSONObject jZlecenia = null; + try{ + jZlecenia = jProfil.getJSONObject("zlecenia"); + }catch( JSONException jEx){ + // nie ma zleceń w tym profilu. + continue; + } + Log.d(SRV, "Odczytano zlecenia"); + Iterator keys = jZlecenia.keys(); + while( keys.hasNext()){ + String id = (String)keys.next(); + JSONObject jZlecenie = jZlecenia.getJSONObject(id); + + Log.d(SRV,"Zlecenie id:"+id);//+" JSON: " + jZlecenie.toString()); + + filesToDelete.remove(id+".json"); + filesToDelete.remove(id+".txt"); + + Boolean load = true; + File fId = new File(prefs.getString("dir", "") + "/baza/"+id+".json"); + if( fId.isFile()){ + Long lastMod=null;// = fId.lastModified(); + lastMod = daty_modyfikacji_zlecen.get(id); + //Date.parse(j.getString("data_zapisu")); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date dZapis = sdf.parse(jZlecenie.getString("data_zapisu")); + long lastZapis = dZapis.getTime(); + if( lastMod != null && lastMod.longValue() >= lastZapis){ + load = false; +// Log.d(SRV, "Data zapisu jest mniejsza lub równa niż modyfikacja, plik: "+ fId.getName()); + }else{ + Log.d(SRV, "Data zapisu "+lastMod+" jest większa niż modyfikacja "+lastZapis+", nadpisanie pliku zlecenia: "+ fId.getName()); + } + } catch (ParseException e) { + Log.e(SRV, "Parse", e); + } + }else{ // nowe zlecenie - wywołaj notyfikację. + broadcastNotification(fId.getName()); + } + +// //sprawdzic, czy uploady nowe są z tego zlecenia + File dir = new File(prefs.getString("dir", "")); + File dirUpload = new File(dir + "/upload"); + File dirZlecenie = new File(dirUpload + "/" +id); + if( dirZlecenie.isDirectory()){ + File f[] = dirZlecenie.listFiles(new FilenameFilter() { + public boolean accept(File dir, String name) { + return name.toLowerCase().endsWith(".mod"); + } + }); + if( f.length>0){ + load = false; + Log.d(SRV, "Jest inna modyfikacja w upload"); + } + } + + if( load){ + if( !wczytaneZlecenia.contains(id)){ + //loadToDisk(id); + markOnDisk(id); + + wczytaneZlecenia.add(id); + }else{ + Log.d(SRV, "Zlecenie id: " + id + " juz bylo wczytane"); + } + } + } + } + + + //usun pliki zlecen usunietych + usunPliki(filesToDelete); + + + //rename file + File dListaPrev = new File(prefs.getString("dir", "") + "/baza/lista.profil.work"); + File dListaNew = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + dListaPrev.renameTo(dListaNew); + + + File fconn = new File(prefs.getString("dir", "") + "/dedalsrv.connection"); + if( fconn.exists()){ + fconn.delete(); + } + + } catch (JSONException e) { + // TODO Auto-generated catch block + //e.printStackTrace(); + File fLock = new File(prefs.getString("dir", "") + "/dedalsrv.connection"); + try { + fLock.createNewFile(); + } catch (IOException econ) { + Log.e(SRV, "IO", econ); + } + } + + // wystartuj/obudz serwis + //Context context = getApplicationContext(); + Intent service = new Intent(context, DedalDownloadService.class); + context.startService(service); + + + } + + private void getKp() { + prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + SharedPreferences.Editor prefsEditor = prefs.edit(); + File KPDirectory = new File(prefs.getString("dir", "") + "/kp_json/"); + if (!KPDirectory.exists()) { + KPDirectory.mkdir(); + } + String KP_filename = KPDirectory.getAbsolutePath() + "/" + "kp.json"; + //String KP_filename_mod = KP_filename.replace(".json", ".mod"); + //DedalHelper.deleteFile(KP_filename_mod); + + prefsEditor.putString("KP_filename", KP_filename); + prefsEditor.commit(); + Log.d("DedalService: KP_filename", KP_filename); + + DedalHttpConnection con = new DedalHttpConnection(getApplicationContext()); + String response_str = con.sendPost("xml/getKPJson.php", null); + Log.d("response_str", response_str); + DedalHelper.putFileContent(KP_filename, response_str); + } + + private void getKpWplaty() { + prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + SharedPreferences.Editor prefsEditor = prefs.edit(); + File KPDirectory = new File(prefs.getString("dir", "") + "/kp_json/"); + if (!KPDirectory.exists()) { + KPDirectory.mkdir(); + } + String KPWplaty_filename = KPDirectory.getAbsolutePath() + "/" + "kp_wplaty.json"; + //String KP_filename_mod = KP_filename.replace(".json", ".mod"); + //DedalHelper.deleteFile(KP_filename_mod); + + prefsEditor.putString("KPWplaty_filename", KPWplaty_filename); + prefsEditor.commit(); + Log.d("DedalService: KPWplaty_filename", KPWplaty_filename); + + DedalHttpConnection con = new DedalHttpConnection(getApplicationContext()); + String response_str = con.sendPost("xml/getWplatyKpJson.php", null); + Log.d("response_str", response_str); + DedalHelper.putFileContent(KPWplaty_filename, response_str); + } + + private void usunPliki(Vector filesToDelete) { + if(filesToDelete.size()>0 ){ + //files[i].getName() + Log.d(SRV, "jest "+ filesToDelete.size() + " plików do usunięcia:"); + } + + for( int k = 0; k < filesToDelete.size(); k++){ + String name = (String) filesToDelete.elementAt(k); + //filesToDelete + File fToDel = new File(prefs.getString("dir", "") + "/baza/"+name); + fToDel.delete(); + Log.d(SRV, "usunięto plik: "+prefs.getString("dir", "") + "/baza/"+name); + } + } + + private Map wczytajDatyPoprzednichModyfikacji() { + // TODO Auto-generated method stub + Map listaZlecen = new HashMap(); + BufferedReader buf; + try { + String s = DedalHelper.getFileContent(prefs.getString("dir", "") + "/baza/lista.profil"); + if( s!= null && s.length()>0) { + JSONObject jFile = new JSONObject(s); + JSONObject jProfiles = jFile.getJSONObject("profile"); + Iterator pKeys = jProfiles.keys(); + + while (pKeys.hasNext()) { + String idProfilu = (String) pKeys.next(); + JSONObject jProfil = jProfiles.getJSONObject(idProfilu); + if (jProfil.has("zlecenia") && !"[]".equals(jProfil.getString("zlecenia"))) { + JSONObject jZlecenia = new JSONObject(jProfil.getString("zlecenia")); + Iterator keys = jZlecenia.keys(); + while (keys.hasNext()) { + + String id = (String) keys.next(); + JSONObject jZlecenie = jZlecenia.getJSONObject(id); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date dZapis; + try { + dZapis = sdf.parse(jZlecenie.getString("data_zapisu")); + long lastZapis = dZapis.getTime(); + listaZlecen.put(id, lastZapis); + // Log.d(SRV, "Zlecenie ID: "+ id + ", poprzedni czas mod: " + lastZapis); + } catch (ParseException e) { + Log.e(SRV, "", e); + } + } + } + } + } + } catch (JSONException e) { + Log.e(SRV, "", e); + } + return listaZlecen; + } + + + private void uploadKP() { + Log.d("my_debug", "uploadKP"); + File dir = new File(prefs.getString("dir", "")); + File fDstf = new File(dir + "/upload_kp"); + if( !fDstf.isDirectory()){ + fDstf.mkdirs(); + } + File files[] = fDstf.listFiles(); + if( fDstf != null) { + for (int i = 0; i < files.length; i++) { + uploadKPHttp(files[i].getAbsolutePath()); + } + } + } + + private void uploadKPWplaty() { + Log.d("my_debug", "uploadKPWplaty"); + File dir = new File(prefs.getString("dir", "")); + File fDstf = new File(dir + "/upload_kp_wplaty"); + if( !fDstf.isDirectory()){ + fDstf.mkdirs(); + } + File files[] = fDstf.listFiles(); + if( fDstf != null) { + for (int i = 0; i < files.length; i++) { + uploadKPWplatyHttp(files[i].getAbsolutePath()); + } + } + } + + private void uploadWidokProfilModifications() { + Log.d("my_debug", "uploadWidokProfilModifications"); + File dir = new File(prefs.getString("dir", "")); + File fDstf = new File(dir + "/upload_widok_profil_mod"); + if( !fDstf.isDirectory()){ + fDstf.mkdirs(); + } + File files[] = fDstf.listFiles(); + if( fDstf != null) + for (int i=0; i params_post = new HashMap(); + params_post.put("kp_json", DedalHelper.getFileContent(namePath)); + String response = con.sendPost("xml/setKPJson.php", params_post); + + if( "true".equals(response) ) { + //delete mod + String KP_filename = prefs.getString("KP_filename", ""); + String KP_filename_mod = KP_filename.replace(".json", ".mod"); + DedalHelper.deleteFile(KP_filename_mod); + DedalHelper.deleteFile(namePath); + } + else { + Log.d("SVC", "problem with upload kp, response: " + response); + } + } + + private void uploadKPWplatyHttp(String namePath) { + DedalHttpConnection con = new DedalHttpConnection(getApplicationContext()); + Map params_post = new HashMap(); + params_post.put("ids_wplat", DedalHelper.getFileContent(namePath)); + String response = con.sendPost("xml/updateWplatyKpJson.php", params_post); + + if( "true".equals(response) ) { + //delete mod + DedalHelper.deleteFile(namePath); + } + else { + Log.d("SVC", "problem with upload kp wplaty, response: " + response); + } + } + + private void uploadWidokProfilHttp(String namePath) { + ServerCommunication(); + //Log.d("my_debug", "upload zlecenie"); + try { + //Log.d(SRV, "uploading HTML urlencoded file... :" + namePath); + String sJson = DedalHelper.getFileContent(namePath); + Log.d(SRV, "JSON: " + sJson); + Log.d("my_debug", "namePath: "+namePath+", JSON: " + sJson); + JSONObject js = new JSONObject(sJson); + + String login = prefs.getString("user", ""); + String pass = DedalHelper.decodeB64(prefs.getString("password", "")); + HttpPost httppost = new HttpPost( hostPath + "/public/change_widok_profil_user.php"); +// + httppost.setHeader(new BasicHeader("Content-Type", "application/x-www-form-urlencoded")); + httppost.setHeader(new BasicHeader("charset", "UTF-8")); +// +// + List parameters = new ArrayList(); + parameters.add(new BasicNameValuePair( "login", login )); + parameters.add(new BasicNameValuePair( "pass", pass )); + + int nr = 1; + if( js.has("profil_kolumny") && js.has("id_profilu") ) { + JSONArray jKolumny = js.getJSONArray("profil_kolumny"); + String id_profilu = js.getString("id_profilu"); + for( int k=0; k< jKolumny.length(); k++) + { + String kod = jKolumny.getJSONObject(k).getString("kod"); + String nazwa = jKolumny.getJSONObject(k).getString("nazwa"); + + //parameters.add(new BasicNameValuePair("nr", Integer.toString(k))); + nr = k + 1; + parameters.add(new BasicNameValuePair("kod-"+nr, kod)); + //parameters.add(new BasicNameValuePair("nazwa", nazwa)); + } + parameters.add(new BasicNameValuePair("id_profilu", id_profilu)); + } + if( js.has("id_profilu") && js.has("reset") && "true".equals(js.getString("reset")) ) { + parameters.add(new BasicNameValuePair("id_profilu", js.getString("id_profilu"))); + parameters.add(new BasicNameValuePair("reset", "true")); + } + //parameters.add(new BasicNameValuePair("sub", "Zapisz zmiany")); + + httppost.setEntity(new UrlEncodedFormEntity(parameters, "UTF-8")); + + + Log.d(SRV, "Entity BasicNameValuePair zaladowane"); + + HttpResponse response = mHttpClient.execute(httppost); + if( response != null){ //todo sprawdzic, czy udalo się usunąć + HttpEntity r_entity = response.getEntity(); + String responseString = EntityUtils.toString(r_entity); + Log.d("my_debug", "response from change_widok_profile: "+responseString); + File fToDel = new File( namePath); + if( fToDel.exists()){ + fToDel.delete(); + } + } + + } catch (Exception e) { + Log.e(SRV, "", e); + } + + } + + private void uploadFolderOrderHttp(String namePath) { + ServerCommunication(); + //Log.d("my_debug", "upload zlecenie"); + try { + //Log.d(SRV, "uploading HTML urlencoded file... :" + namePath); + String sJson = DedalHelper.getFileContent(namePath); + Log.d(SRV, "JSON: " + sJson); + Log.d("my_debug", "namePath: "+namePath+", JSON: " + sJson); + JSONObject js = new JSONObject(sJson); + +// File fToDel = new File( namePath); +// if( fToDel.exists()){ +// fToDel.delete(); +// } + +// String id_zlecenia = js.getString("id_zlecenia"); +// + String login = prefs.getString("user", ""); + String pass = DedalHelper.decodeB64(prefs.getString("password", "")); + HttpPost httppost = new HttpPost( hostPath + "/public/change_folder_order.php"); +// + httppost.setHeader(new BasicHeader("Content-Type", "application/x-www-form-urlencoded")); + httppost.setHeader(new BasicHeader("charset", "UTF-8")); +// +// + List parameters = new ArrayList(); + + parameters.add(new BasicNameValuePair( "login", login )); + parameters.add(new BasicNameValuePair( "pass", pass )); + + parameters.add(new BasicNameValuePair("id_folder", js.getString("id_folder"))); + if(js.has("kolejnosc")) { + JSONArray ja = js.getJSONArray("kolejnosc"); + for( int i = 0 ; i parameters = new ArrayList(); + parameters.add(new BasicNameValuePair( "login", login )); + parameters.add(new BasicNameValuePair( "pass", pass )); + + if( js.has("zlecenie") ) { + JSONObject jZl = js.getJSONObject("zlecenie"); + + parameters.add(new BasicNameValuePair("id_zlecenia", jZl.getString("id_zlecenia"))); + parameters.add(new BasicNameValuePair("id_folder", jZl.getString("id_folder"))); + } + else if( js.has("new_folder") ) { + JSONObject jZl = js.getJSONObject("new_folder"); + parameters.add(new BasicNameValuePair("nazwa", jZl.getString("nazwa"))); + parameters.add(new BasicNameValuePair("operation", "new_folder")); + } + else if( js.has("delete_folder") ) { + JSONObject jZl = js.getJSONObject("delete_folder"); + parameters.add(new BasicNameValuePair("id_folder", jZl.getString("id_folder"))); + parameters.add(new BasicNameValuePair("operation", "delete_folder")); + } + else if( js.has("edit_folder") ) { + JSONObject jZl = js.getJSONObject("edit_folder"); + parameters.add(new BasicNameValuePair("id_folder", jZl.getString("id_folder"))); + parameters.add(new BasicNameValuePair("nazwa", jZl.getString("nazwa"))); + parameters.add(new BasicNameValuePair("operation", "edit_folder")); + } + //parameters.add(new BasicNameValuePair("sub", "Zapisz zmiany")); + + httppost.setEntity(new UrlEncodedFormEntity(parameters, "UTF-8")); + + + Log.d(SRV, "Entity BasicNameValuePair za�adowane"); + + HttpResponse response = mHttpClient.execute(httppost); + if( response != null){ //todo sprawdzic, czy udalo si� usun�� + HttpEntity r_entity = response.getEntity(); + String responseString = EntityUtils.toString(r_entity); + Log.d("my_debug", responseString); + File fToDel = new File( namePath); + if( fToDel.exists()){ + fToDel.delete(); + } + } + + } catch (Exception e) { + Log.e(SRV, "", e); + } + + } + + private void uploadZlecenieHttp(String namePath) { + ServerCommunication(); + //Log.d("my_debug", "upload zlecenie"); + try { + Log.d(SRV, "uploading HTML urlencoded file... :" + namePath); + String sJson = DedalHelper.getFileContent(namePath); + Log.d(SRV, "JSON: " + sJson); + JSONObject js = new JSONObject(sJson); + String id_zlecenia = js.getString("id_zlecenia"); + //id_zlecenia, folder + String login = prefs.getString("user", ""); + String pass = DedalHelper.decodeB64(prefs.getString("password", "")); + HttpPost httppost = new HttpPost( hostPath + "/public/mobi.php?id_zlecenia="+id_zlecenia); +// + httppost.setHeader(new BasicHeader("Content-Type", "application/x-www-form-urlencoded")); + httppost.setHeader(new BasicHeader("charset", "UTF-8")); + + + List parameters = new ArrayList(); + parameters.add(new BasicNameValuePair( "login", login )); + parameters.add(new BasicNameValuePair( "pass", pass )); + //petla.. + + JSONObject pola = js.getJSONObject("pola"); + + try { + Iterator k = pola.keys(); + while (k.hasNext()) { + String key = (String) k.next(); + + JSONObject jo = pola.getJSONObject(key); + dodajParams( jo, parameters); + } + + } catch (JSONException e) { + Log.e(SRV, "", e); + } + + + /// GPS /// + if( js.has("gps") ) { + Log.d("my_debug", "zlecenie gps"); + JSONObject gps = js.getJSONObject("gps"); + //Log.d("my_debug", "nana"); + try { + Iterator k = gps.keys(); + while (k.hasNext()) { + String key = (String) k.next(); + parameters.add(new BasicNameValuePair( key, gps.getString(key))); +// JSONObject jo = gps.getJSONObject(key); +// dodajParams(jo, parameters); + } + //Log.d("my_debug", "3upload: "+namePath); + + } catch (JSONException e) { + Log.e(SRV, "JSON", e); + } + } + /// GPS /// + + if( js.has("sub_stat_acc") ) { + parameters.add(new BasicNameValuePair("sub_stat_acc", js.getString("sub_stat_acc"))); + //Log.d("my_debug", "sub: "+js.getString("sub")); + } + + if( js.has("sub") ) { + parameters.add(new BasicNameValuePair("sub", js.getString("sub"))); + //Log.d("my_debug", "sub: "+js.getString("sub")); + } + else { + parameters.add(new BasicNameValuePair("sub", "Zapisz zmiany")); + //Log.d("my_debug", "sub - def: Zapisz zmiany"); + } + + parameters.add(new BasicNameValuePair("page", "wynik")); + //parameters.add(new BasicNameValuePair("sub", "Zapisz zmiany")); + + httppost.setEntity(new UrlEncodedFormEntity(parameters, "UTF-8")); + + + Log.d(SRV, "Entity BasicNameValuePair załadowane"); + Log.d(SRV, "host: "+hostPath + "/public/mobi.php?id_zlecenia="+id_zlecenia+"&login="+login+"&pass="+pass); + + HttpResponse response = mHttpClient.execute(httppost); + if( response != null){ //todo sprawdzic, czy udalo się, usun + + int respCode = response.getStatusLine().getStatusCode(); + //String h = response.getHeaders(); + + HttpEntity r_entity = response.getEntity(); + + String responseString = EntityUtils.toString(r_entity); + Log.d(SRV, "aktualizacja zlecenia HTTP code:" + respCode + " - response: "+responseString); + /// response log +//"Formularz zapisano" + //todo: wielojęzyczność - specjalny kod w HTML dodać. + if( !responseString.contains("Formularz zapisano")){ //responseString.contains("login_change")){ + Log.e(SRV, "login_change: Nie udalo sie wyslac zlecenia: "+ namePath); + File fLockCon = new File(prefs.getString("dir", "") + "/dedalsrv.connection_password"); + try { + fLockCon.createNewFile(); + } catch (IOException econ) { + Log.e(SRV, "", econ); + } + + + }else{ + File fToDel = new File( namePath); + if( fToDel.exists()){ + fToDel.delete(); + } + File fLockCon = new File(prefs.getString("dir", "") + "/dedalsrv.connection_password"); + if( fLockCon.exists()){ + fLockCon.delete(); + } + } + + }else{ + Log.e(SRV, "Nie udalo sie wyslac zlecenia: "+ namePath); + } + + } catch (Exception e) { + //e.printStackTrace(); + Log.e(SRV, "", e); + } + } + private void dodajParams(JSONObject jo, List parameters) { + // + //parameters.add(new BasicNameValuePair("zlecenie", xml)); + //JSONArray k = js; + try { + + if( !jo.has("no-sent") ) { + String name = null; + if( jo.has("id-orig")) { + name = "val_"+jo.getString("id-orig")+"-new[]"; + //parameters.add(new BasicNameValuePair( "val_"+jo.getString("id")+"-usun", jo.getString("wartosc")) ); + parameters.add(new BasicNameValuePair( "pow_"+jo.getString("id-orig")+"-tablet[]", jo.getString("id")) ); + } + + if (!jo.has("id-orig") && jo.has("id")) { + name = "val_"+jo.getString("id"); + } + + if(jo.has("usun") && jo.getString("usun").equals("true") ) { + if( !jo.has("id-orig") ) { + name = "val_"+jo.getString("id")+"-usun"; + } + else { + parameters.add(new BasicNameValuePair( "usun-id_tablet[]", jo.getString("id")) ); + } + } + if (name != null && !"foto".equals(jo.getString("typ_danych")) && jo.has("wartosc") ) { + String wartosc = jo.getString("wartosc"); + if( !"h".equals(wartosc)) { + parameters.add(new BasicNameValuePair(name, wartosc)); + } + } + + // ID DŁUŻNIKA W POLACH ACCEPT + if( jo.has("klient") && "accept".equals(jo.getString("klient")) && jo.has("id_dluznika")) { + Log.d("DedalService", "id_dluznika od wyslania: "+jo.getString("id_dluznika")); + parameters.add(new BasicNameValuePair( "val_dluznik_"+jo.getString("id"), jo.getString("id_dluznika")) ); + } + } + + JSONArray ja = jo.getJSONArray("childs"); + if( ja!= null && ja.length()>0){ + for ( int i=0; i parameters = new ArrayList(); + HttpPost httppost; +// httppost = new HttpPost( hostPath + "/public/zalaczniki_foto_add.php" ); + httppost = new HttpPost( hostPath + "/public/zalaczniki_add.php" ); + if( !folder.equals("foto_typ") ) { + parameters.add(new BasicNameValuePair( "folder", folder )); + } + parameters.add(new BasicNameValuePair( "login", login )); + parameters.add(new BasicNameValuePair( "pass", pass )); + parameters.add(new BasicNameValuePair( "usun", fToDel )); + parameters.add(new BasicNameValuePair( "id_zlecenia", id_zlecenia )); + httppost.setEntity(new UrlEncodedFormEntity(parameters, "UTF-8")); + + HttpResponse response = mHttpClient.execute(httppost); + if( response != null){ //todo sprawdzic, czy udalo si� usun�� + HttpEntity r_entity = response.getEntity(); + String responseString = EntityUtils.toString(r_entity); + Log.d(SRV, responseString); + image.delete(); + } + + } catch (Exception e) { + //e.printStackTrace(); + Log.e(SRV, "", e); + } + } + + private void uploadUserPhoto(File image, String id_zlecenia, String folder) { + ServerCommunication(); + try { + if( folder.equals("foto_typ") ) { + Log.d(SRV, "Uploading file... :" + image.getAbsolutePath()); + Log.d("my_debug", "Uploading file... :" + image.getAbsolutePath()); + Log.d("my_debug", "zdjecie foto_typ"); + HttpPost httppost = new HttpPost( hostPath + "/public/zalaczniki_foto_add.php?id_zlecenia="+id_zlecenia); + + //FileBody fileBody = new FileBody(image); + //ByteArrayBody(byte[] data, ContentType contentType, String filename) + byte[] imageBytes = DedalHelper.getFileContent(image.getAbsolutePath()).getBytes(); + byte[] bytes = DedalHelper.decodeFile(imageBytes); + ByteArrayBody byteBody = new ByteArrayBody(bytes, image.getName()); + MultipartEntityBuilder builder = MultipartEntityBuilder.create() + .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) + .addTextBody("login", login ) + .addTextBody("pass", pass ) + .addPart("dodaj", byteBody); + HttpEntity multiPartEntity = builder.build(); + httppost.setEntity(multiPartEntity); + + HttpResponse response = mHttpClient.execute(httppost); + //Log.d("my_debug", "response po zdjeciu: "+response); + if( response != null){ + HttpEntity r_entity = response.getEntity(); + String responseString = EntityUtils.toString(r_entity); + Log.d(SRV, responseString); + image.delete(); + } + } + else { + if ( image.exists() ) { + Log.d(SRV, "Uploading file... :" + image.getAbsolutePath()); + HttpPost httppost = new HttpPost(hostPath + "/public/zalaczniki_add.php?folder=" + folder + "&id_zlecenia=" + id_zlecenia); + + MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); + entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); + entityBuilder.addTextBody("login", login ) + .addTextBody("pass", pass ); + + //FileBody fileBody = new FileBody(image); + if ("log_file".equals(id_zlecenia)) { + if( image.lastModified() + 1000*3600*24*3 < System.currentTimeMillis() ){ + //ignore too old: + Log.e("LOG_TOO_OLD", "za stary log, ignorowanie:" + image.getName()); + if( image.lastModified() + 1000*3600*24*14 < System.currentTimeMillis() ){ + //usuń starsze niż 14 dni. + Log.e("LOG_TOO_OLD", "za stary log, USUWANIE:" + image.getName()); + image.delete(); + } + return; + } + if( image.length() > 10000000){ + Log.e("LOG_TOO_BIG", "za duzy log, ignorowanie: " + image.getName()); + //image.delete(); + return; + } + entityBuilder.addPart("log_file", new FileBody(image)); + } else { + //entityBuilder.addBinaryBody("dodaj", image); + byte[] imageBytes = DedalHelper.getCryptFileBytes(image.getAbsolutePath()); + ByteArrayBody byteBody = new ByteArrayBody(imageBytes, image.getName()); + entityBuilder.addPart("dodaj", byteBody); + } + HttpEntity entity = entityBuilder.build(); + httppost.setEntity(entity); + + HttpResponse response = mHttpClient.execute(httppost); + //Log.d("my_debug", "response po zdjeciu: "+response); + if (response != null) { + HttpEntity r_entity = response.getEntity(); + String responseString = EntityUtils.toString(r_entity); + Log.d(SRV, "responseString: " + responseString); + if ("log_file".equals(id_zlecenia)) { + if (responseString != null) { + String trimResponseString = responseString.trim(); + if ( trimResponseString.indexOf("true") >= 0 ) { + image.delete(); + } + } + } else { + image.delete(); + } + } + } + else { + Log.d(SRV, "file to uplaod doesn't exists: "+image.getAbsolutePath()); + } + } + + + } catch (Exception e) { + //e.printStackTrace(); + Log.e(SRV, "", e); + //e.printStackTrace(); + // Log.e(ServerCommunication.class.getName(), e.getLocalizedMessage(), e); + } + } + + + public void ServerCommunication() { + mHttpClient = DedalService.getNewHttpClient(); + } + + void markOnDisk(String m_id) { + File myDir = new File(prefs.getString("dir", "") + "/queue"); + if( !myDir.isDirectory()){ + myDir.mkdirs(); + } + File d_queue_prio = new File(prefs.getString("dir", "") + "/queue_prio"); + if( !d_queue_prio.isDirectory()){ + d_queue_prio.mkdirs(); + } + + File myFile = new File(prefs.getString("dir", "") + "/queue/"+m_id); + FileOutputStream fos; + try { + fos = new FileOutputStream(myFile); + fos.write("".getBytes()); + fos.flush(); + fos.close(); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + public DedalService() { + } + + @Override + public IBinder onBind(Intent intent) { + // TODO: Return the communication channel to the service. + throw new UnsupportedOperationException("Not yet implemented"); + } + + + Notification.Builder nB; + public static final int NOTIFICATION_ID=1; + /* (non-Javadoc) + * @see android.app.Service#onCreate() + */ + @Override + public void onCreate() { + // TODO Auto-generated method stub + super.onCreate(); + + Log.d(SRV, "Service DedalService created."); + nB = new Notification.Builder(this); + //nB.setAutoCancel(true) + nB.setTicker("Przyszło nowe zlecenie"); + nB.setSmallIcon(R.drawable.ic_launcher); + //icon? + + } + + private void broadcastNotification(String name){ + Intent startIntent = new Intent( this, MainActivity.class); + File f = new File(prefs.getString("dir", "") + "/baza/" + name); + Uri u = Uri.fromFile(f); + startIntent.setData(u); + //startActivity(intent); + + PendingIntent launchIntent = PendingIntent.getActivity(this, 0, startIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + + nB.setContentIntent(launchIntent); + Date d = new Date(); + //nB.setWhen(d.getTime ()); + nB.setWhen(System.currentTimeMillis()); + nB.setContentTitle("zlecenie nr: " + name); + nB.setContentText("priorytet 1 "); + + NotificationManager nM = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); + // Android 13+ requires POST_NOTIFICATIONS runtime permission + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { + Log.d(SRV, "Notification not sent: missing POST_NOTIFICATIONS permission."); + return; + } + } + // nM.notify(NOTIFICATION_ID, nB.getNotification()); + nM.notify(NOTIFICATION_ID, nB.build()); + Log.d(SRV, "Nofification sent."); + + } + + /* (non-Javadoc) + * @see android.app.Service#onDestroy() + */ + @Override + public void onDestroy() { + // TODO Auto-generated method stub + if( thread != null) + { + isStopped = true; + thread.interrupt(); + } + try { + thread.join(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + //e.printStackTrace(); + Log.e(SRV, "", e); + } + super.onDestroy(); + } + + /* (non-Javadoc) + * @see android.app.Service#onLowMemory() + */ + @Override + public void onLowMemory() { + // TODO Auto-generated method stub + super.onLowMemory(); + } + + GPSTracker gps; + /* (non-Javadoc) + * @see android.app.Service#onStartCommand(android.content.Intent, int, int) + */ + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + // TODO Auto-generated method stub + Log.d(SRV, "Service onStartCommand called."); + Log.d(SRV, "Intent: " + intent + ", flags: " + flags + ", startId: " + startId); + + + gps = new GPSTracker(this); +// gps = ListActivity.gps; + gps.getLocation(); + + // broadcastNotification("973009595.json"); + Context context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + Log.setFileName(prefs.getString("dir", "")); + Log.setEH(); + + if( thread == null){ + + // temporary HTTPS!!! EOS pre-produkcja + + // utworzyć strukturę katalogów + File d = new File(prefs.getString("dir", "") + "/baza"); + d.mkdirs(); + d = new File(prefs.getString("dir", "") + "/upload"); + d.mkdirs(); + d = new File(prefs.getString("dir", "") + "/mDedal"); + d.mkdirs(); + d = new File(prefs.getString("dir", "") + "/mDedalCam"); + d.mkdirs(); + + File myDir = new File(prefs.getString("dir", "") + "/queue"); + if( !myDir.isDirectory()){ + myDir.mkdirs(); + } + File d_queue_prio = new File(prefs.getString("dir", "") + "/queue_prio"); + if( !d_queue_prio.isDirectory()){ + d_queue_prio.mkdirs(); + } + + + + startThread(); + }else{ +// Context context = getApplicationContext(); +// prefs = PreferenceManager.getDefaultSharedPreferences(context); + File fNext = new File(prefs.getString("dir", "") + "/dedalsrv.continue"); + try { + fNext.createNewFile(); + } catch (IOException e) { + //e.printStackTrace(); + Log.e(SRV, "", e); + } + if( thread.isAlive()){ + thread.interrupt(); + }else{ + Log.d(SRV, "Watek serwisu byl zatrzymany. Restart watku"); + startThread(); + } + } + + return super.onStartCommand(intent, flags, startId); + } + + Thread thread = null; + private void startThread(){ + Log.d(SRV, "Start watku Serwisu."); + thread = new Thread(new WorkingThread()); + thread.start(); + + } + private HttpClient mHttpClient; + + String readFile(InputStream in) throws IOException { + StringBuffer sb = new StringBuffer(); + byte buffer[] = new byte[10000]; + int s = 0; + while ((s = in.read(buffer)) > 0) { + String st =new String(buffer, 0, s); + //Log.d(SRV, "i=" + s +", data:" + st); + sb.append(st); + } + return sb.toString(); + } +} diff --git a/app/src/main/java/com/likesoft/mdedal/DokumentyKollektoActivity.java b/app/src/main/java/com/likesoft/mdedal/DokumentyKollektoActivity.java new file mode 100644 index 0000000..755be1c --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/DokumentyKollektoActivity.java @@ -0,0 +1,655 @@ +package com.likesoft.mdedal; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Iterator; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.app.Activity; +import android.app.ActivityManager; +import android.app.ActivityManager.RunningServiceInfo; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.net.Uri; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.TableLayout; +import android.widget.TableRow; +import android.widget.TextView; + +public class DokumentyKollektoActivity extends Activity { + + LinearLayout lMain; + String id_zlecenia; + JSONArray dkJson; + SharedPreferences prefs; + boolean refreshingLista = true; + + private final class rowOpenFileListener implements OnClickListener { + File file; + public rowOpenFileListener (File file) { + this.file = file; + } + + @Override + public void onClick(View v) { + try { + openFile(getApplicationContext(), file); + } catch (IOException e) { + Log.e("DEDAL", "IO", e); + } + } + } + + private final class rowDownloadFileListener implements OnClickListener { + String fileName; + public rowDownloadFileListener (String fileName) { + this.fileName = fileName; + } + + @Override + public void onClick(View v) { + // obłsuga pliku do komunikacji z serwerem + //String commPath = prefs.getString("dir", "") + "/pliki_kollekto/communication.json"; + //File myFile = new File(commPath); + + Long time = (System.currentTimeMillis()); + String ts = Long.toString(time); + String commPath = prefs.getString("dir", "") + "/pliki_kollekto/comm_"+ts+".json"; + //File myFile = new File(commPath); + + String commJsString = readFile(commPath); + JSONObject commJs = null; + if( "".equals(commJsString) ) { + commJs = new JSONObject(); + } + else { + try { + commJs = new JSONObject(commJsString); + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + } + + try { + JSONObject zlecJs; + if( commJs.has(id_zlecenia) ) { + zlecJs = commJs.getJSONObject(id_zlecenia); + } + else { + zlecJs = new JSONObject(); + } + zlecJs.put(fileName, "get"); + commJs.put(id_zlecenia, zlecJs); + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + + writeFile(commPath, commJs.toString()); + + + // obsługa pliku zawierającym statusy + String statPath = prefs.getString("dir", "") + "/pliki_kollekto/statuses.json"; + File myFile = new File(statPath); + String statJsString = readFile(statPath); + JSONObject statJs = null; + if( "".equals(statJsString) ) { + statJs = new JSONObject(); + } + else { + try { + statJs = new JSONObject(statJsString); + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + } + + //zlecJs = new JSONObject(); + try { + JSONObject zlecJs; + if( statJs.has(id_zlecenia) ) { + zlecJs = statJs.getJSONObject(id_zlecenia); + } + else { + zlecJs = new JSONObject(); + } + zlecJs.put(fileName, "Żądanie pobrania"); + statJs.put(id_zlecenia, zlecJs); + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + + writeFile(statPath, statJs.toString()); + + //wystartuj/obudz servis + startDokumentyKollektoService(); + + DokumentyKollektoActivity.this.recreate(); + } + } + + private final class btnDeleteFileListener implements OnClickListener { + String fileName; + public btnDeleteFileListener (String fileName) { + this.fileName = fileName; + } + + @Override + public void onClick(View v) { + try { + File myFile = new File(prefs.getString("dir", "") + "/pliki_kollekto/"+id_zlecenia+"/"+fileName); + if( myFile.exists() ) { + myFile.delete(); + } + + //String commPath = prefs.getString("dir", "") + "/pliki_kollekto/communication.json"; + Long time = (System.currentTimeMillis()); + String ts = Long.toString(time); + String commPath = prefs.getString("dir", "") + "/pliki_kollekto/comm_"+ts+".json"; + + //String commJsString = readFile(commPath); + + JSONObject commJs = new JSONObject(); + JSONObject zlJs; + if( commJs.has(id_zlecenia) ) { + zlJs = commJs.getJSONObject(id_zlecenia); + } + else { + zlJs = new JSONObject(); + } + //JSONObject zlJs = commJs.getJSONObject(id_zlecenia); + //if( zlJs.has(fileName) ) { + zlJs.put(fileName, "delete"); + commJs.put(id_zlecenia, zlJs); + + writeFile(commPath, commJs.toString()); + + // obsługa pliku zawierającym statusy + String statPath = prefs.getString("dir", "") + "/pliki_kollekto/statuses.json"; + String statJsString = readFile(statPath); + JSONObject statJs = null; + //if( "".equals(statJsString) ) { + statJs = new JSONObject(statJsString); + //zlJs = statJs.getJSONObject(id_zlecenia); + if( statJs.has(id_zlecenia) ) { + zlJs = statJs.getJSONObject(id_zlecenia); + } + else { + zlJs = new JSONObject(); + } + zlJs.put(fileName, "Do pobrania"); + statJs.put(id_zlecenia, zlJs); + writeFile(statPath, statJs.toString()); + //} + + //wystartuj/obudz servis + startDokumentyKollektoService(); + + DokumentyKollektoActivity.this.recreate(); + + //} + + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Context context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + Log.setFileName(prefs.getString("dir", "")); + Log.setEH(); + + refreshingLista = true; + upServiceIfNeeded(); + + HorizontalScrollView lMainScroll = new HorizontalScrollView(this); + lMain = new LinearLayout(this); + lMain.setOrientation(LinearLayout.VERTICAL); + + ScrollView vertScroll = new ScrollView(this); + lMainScroll.addView(vertScroll); + + vertScroll.addView(lMain); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + id_zlecenia = extras.getString("id_zlecenia"); + try { + dkJson = new JSONArray(extras.getString("dkJson")); + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + Log.d("my_debug", "dokumentyKollektoActivity, id_zlecenia: "+id_zlecenia+", dkJson: "+dkJson.toString()); + } + + //TextView tv = new TextView(this); + //tv.setText("Dostępne dokumenty"); + //lMain.addView(tv); + + + wyswietlListe(); + + + setContentView(lMainScroll); + + this.setTitle("Dokumenty Kollekto, id_zlecenia: "+id_zlecenia); + + // wtatek który sprawdza czy zmienil sie plik: statuses.json. Jesli tak to odswiez liste. + Thread t =new Thread(new Runnable() { + + @Override + public void run() { + // TODO Auto-generated method stub + Long lastMod = null; + Long lastStatMod = null; + while( true ){ + if( !refreshingLista ) { + break; + } + try { + + File dLista = new File(prefs.getString("dir", "") + "/pliki_kollekto/statuses.json"); + if( dLista.isFile()){ + lastMod = dLista.lastModified(); + if (lastStatMod == null) { lastStatMod = lastMod; continue; } + //Log.d("my_debug", lastStatMod+ " | " +lastMod); + if ( !lastStatMod.equals(lastMod) ) { + lastStatMod = lastMod; + Log.d("my_debug", "DokumentyKollektoActivity: odswieżam liste"); + //DokumentyKollektoActivity.this.recreate(); + //DokumentyKollektoActivity.this.reload(); + lMain.post(new Runnable() { + + @Override + public void run() { + wyswietlListe(); + } + }); + + + } + } + Thread.sleep(1000); + } catch (InterruptedException e) { + break; + } + } + } + }); + t.start(); + } + + private void wyswietlListe(){ + + lMain.removeAllViews(); + + + + int colNum = 5; + TableLayout tl = new TableLayout(DokumentyKollektoActivity.this); + lMain.addView(tl); + tl.setPadding(0, 15, 0, 0); + TableRow rowHeader = new TableRow(DokumentyKollektoActivity.this); + tl.addView(rowHeader); + rowHeader.setBackgroundColor(Color.parseColor("#FFA500")); + TextView[] tvHeaders = new TextView[colNum]; + for(int i = 0; i < colNum; i++) { + tvHeaders[i] = new TextView(DokumentyKollektoActivity.this); + rowHeader.addView(tvHeaders[i]); + tvHeaders[i].setPadding(5, 3, 5, 2); + tvHeaders[i].setTextSize(25); + //tvHeaders[i].setBackgroundColor(Color.parseColor("#FFA500")); + } + tvHeaders[0].setText("Nazwa pliku"); + tvHeaders[1].setText("Typ"); + tvHeaders[2].setText("Opis"); + tvHeaders[3].setText("Rozmiar"); + tvHeaders[4].setText("Status"); + + String statPath = prefs.getString("dir", "") + "/pliki_kollekto/statuses.json"; + //File statFile = new File(statPath); + String statJsString = readFile(statPath); + JSONObject statJs = null; + JSONObject zlecStatJs = null; + try { + if( !"".equals(statJsString) ) { + statJs = new JSONObject(statJsString); + if( statJs.has(id_zlecenia) ) { + zlecStatJs = statJs.getJSONObject(id_zlecenia); + } + } + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + + JSONObject oneDokJson; + try { + // lista plików + for( int i=0 ; i < dkJson.length() ; i++) { + boolean pobrany = false; + boolean btnUsunBool = false; + oneDokJson = dkJson.getJSONObject(i); + TableRow rowDok = new TableRow(DokumentyKollektoActivity.this); + tl.addView(rowDok); + TextView[] tvDok = new TextView[colNum]; + for(int j = 0; j < colNum; j++) { + tvDok[j] = new TextView(DokumentyKollektoActivity.this); + tvDok[j].setPadding(5, 3, 5, 2); + tvDok[j].setTextSize(25); + rowDok.addView(tvDok[j]); + } + String fileName = oneDokJson.getString("nazwa_pliku"); + tvDok[0].setText(fileName); + tvDok[1].setText(oneDokJson.getString("typ")); + tvDok[2].setText(oneDokJson.getString("opis")); + tvDok[3].setText(oneDokJson.getString("rozmiar")); + String status = ""; + + // czytam status z pliku statuses.json + if( zlecStatJs != null && zlecStatJs.has(fileName) ) { + status = zlecStatJs.getString(fileName); + if("Pobrany".equals(status)) { + pobrany = true; + btnUsunBool = true; + } + if("Żądanie pobrania".equals(status)) { + btnUsunBool = true; + } + + } + // czytam status ze json'a w zleceniu + else { +// if( "null".equals(oneDokJson.getString("data_pobrania")) ) { +// status = "Do pobrania"; +// } +// else { +// btnUsunBool = true; +// pobrany = true; +// } + + if( oneDokJson.has("status") ) { + status = oneDokJson.getString("status"); + } + else { + if( "null".equals(oneDokJson.getString("data_pobrania")) ) { + status = "Do pobrania"; + } + else { + btnUsunBool = true; + pobrany = true; + } + } + + if ( !"Do pobrania".equals(status) ) { + btnUsunBool = true; + } + if ( "Pobrany".equals(status) ) { + pobrany = true; + } + + } + + if( "Do pobrania".equals(status) ) { + rowDok.setOnClickListener(new rowDownloadFileListener(fileName)); + rowDok.setBackgroundColor(Color.YELLOW); + } + + if( pobrany ) { + String path = prefs.getString("dir", "") + "/pliki_kollekto/"+id_zlecenia; + File myFile = new File(path+"/"+fileName); + if( myFile.exists()) { + status = "Pobrany, zobacz"; + rowDok.setOnClickListener(new rowOpenFileListener(myFile)); + + rowDok.setBackgroundColor(Color.GREEN); + } + else { + status = "Błąd - pobrany, jednak nie ma go na tablecie"; + } + } + tvDok[4].setText(status); + + if( btnUsunBool ) { + Button btnUsun = new Button(getApplicationContext()); + btnUsun.setText("Usuń"); + btnUsun.setOnClickListener(new btnDeleteFileListener(fileName)); + rowDok.addView(btnUsun); + } + + + + } + + //Log.d("my_debug", "Dokumenty kollekto, zlecStatJs: " + statJs.toString()); + if( statJs != null && statJs.has("limit") && "true".equals( statJs.getString("limit") ) ) { + Log.d("my_debug", "Dokumenty Kollekto: osiognieto limit"); + TextView warningTv = new TextView(DokumentyKollektoActivity.this); + warningTv.setText("Osiągnięto limit ilości dokumentów. Usuń niepotrzebne dokumenty aby pobrać nowe."); + lMain.addView(warningTv); + } + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + + + + + + } + + private boolean upServiceIfNeeded() { + // TODO Auto-generated method stub + boolean ret = false; + Log.d("my_debug", "upServiceIfNeeded, DokumentyKollektoService.stopService: "+ DokumentyKollektoService.stopService); + if ( DokumentyKollektoService.stopService ) { + try { + +// String commPath = prefs.getString("dir", "") + "/pliki_kollekto/communication.json"; +// String commJsString = readFile(commPath); +// Log.d("my_debug", "commfile: "+commJsString); +// if ( "".equals(commJsString) || commJsString == null ) { +// return ret; +// } + + File dir = new File(prefs.getString("dir", "")); + File fDstf = new File(dir + "/pliki_kollekto"); + if( !fDstf.isDirectory()){ + fDstf.mkdirs(); + } + File files[] = fDstf.listFiles(); + String commJsString = ""; + boolean keepService = false; + if( fDstf != null) { + for (int i=0; i serviceClass) { + ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { + if (serviceClass.getName().equals(service.service.getClassName())) { + return true; + } + } + return false; + } + + private void startDokumentyKollektoService() { + // wystartuj/obudz serwis + Log.d("my_debug", "startDokumentyKollektoService, DokumentyKollektoService.stopService: "+ DokumentyKollektoService.stopService); + if ( DokumentyKollektoService.stopService ) { + Context context = getApplicationContext(); + Intent service = new Intent(context, DokumentyKollektoService.class); + context.startService(service); + } + } + + @Override + protected void onDestroy() { + // TODO Auto-generated method stub + refreshingLista = false; + //DokumentyKollektoService.stopService = true; + super.onDestroy(); + + //onDestroyD(this); + } +} diff --git a/app/src/main/java/com/likesoft/mdedal/DokumentyKollektoService.java b/app/src/main/java/com/likesoft/mdedal/DokumentyKollektoService.java new file mode 100644 index 0000000..89bf832 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/DokumentyKollektoService.java @@ -0,0 +1,266 @@ +package com.likesoft.mdedal; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.json.JSONException; +import org.json.JSONObject; + +import android.app.Service; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.IBinder; +import android.preference.PreferenceManager; + +public class DokumentyKollektoService extends Service { + + public static boolean stopService = true; + SharedPreferences prefs; + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + stopService = false; + // TODO Auto-generated method stub + Thread t = new Thread(new Runnable() { + @Override + public void run() { + //tutaj będzie akcja + + while ( true ) { + if( stopService ) { + break; + } + + try { + Log.d("my_debug", "DokumentyKollektoService"); + + File dir = new File(prefs.getString("dir", "")); + File fDstf = new File(dir + "/pliki_kollekto"); + if( !fDstf.isDirectory()){ + fDstf.mkdirs(); + } + File files[] = fDstf.listFiles(); + String commJsString = ""; + boolean keepService = false; + if( fDstf != null) { + for (int i=0; i params = new HashMap(); + params.put("json", commJsString); + String responseJsString = conn.sendPost("json/plikiKollekto.php", params); + //Log.d("my_debug", "responseJsString: " + responseJsString); + + JSONObject responseJs = new JSONObject(responseJsString); // z tego czytam i tego nie modyfikuje + JSONObject responseJsCopy = new JSONObject(responseJsString); // tutaj robibie zmiany i później to zapisywane jest do pliku + + // obsługa pliku zawierającym statusy + String statJsString = readFile(prefs.getString("dir", "") + "/pliki_kollekto/statuses.json"); + JSONObject statJs = new JSONObject(statJsString); // z tego czytam + JSONObject statJsCopy = new JSONObject(statJsString);// w tym bede robic zmiany + + + + // parsowanie odpowiedzi z serwera, jeśli jest wpis downloading to znaczy że trzeba pobrać plik + Iterator pKeys = responseJs.keys(); + boolean limit = false; + boolean new_comm = false; + boolean save_stats = false; + while( pKeys.hasNext()){ + + String id_zlecenia = (String)pKeys.next(); + + JSONObject jZlecenie = responseJs.getJSONObject(id_zlecenia); + JSONObject jZlecenieCopy = responseJsCopy.getJSONObject(id_zlecenia); + + JSONObject statZl; + JSONObject statZlCopy = null; + if ( statJs.has(id_zlecenia) ) { + statZl = statJs.getJSONObject(id_zlecenia); + statZlCopy = statJsCopy.getJSONObject(id_zlecenia); + } + else { + statZl = new JSONObject(); + statJs.put(id_zlecenia, statZl); + } + + Iterator pKeys2 = jZlecenie.keys(); + while( pKeys2.hasNext()){ + Log.d("my_debug", "temp: "+responseJs.toString()); + String nazwa_pliku = (String)pKeys2.next(); + Log.d("my_debug", "temp, nazwa_pliku: "+nazwa_pliku); + String stat = jZlecenie.getString(nazwa_pliku); + // zmiany w pliku communication.json + if( "get".equals(stat) || "check".equals(stat) || "delete".equals(stat)) { + keepService = true; + } + if( "deleted".equals(stat) ) { + jZlecenieCopy.remove(nazwa_pliku); + } + if( "aborted".equals(stat) ) { + jZlecenieCopy.remove(nazwa_pliku); + } + if( "limit".equals(stat) ) { + limit = true; + jZlecenieCopy.remove(nazwa_pliku); + // todo: komunikat że osiągnięto limit + + statZlCopy.put(nazwa_pliku, "Do pobrania"); + // // + } + if( "downloading".equals(stat) ) { + // todo: pobierz zdjęcie fizycznie + String login = prefs.getString("user", ""); + conn.downloadFile("data/pliki_kollekto/"+login+"/"+id_zlecenia, prefs.getString("dir", "") + "/pliki_kollekto/"+id_zlecenia, nazwa_pliku); + jZlecenieCopy.remove(nazwa_pliku); + + //JSONObject statZl = statJs.getJSONObject(id_zlecenia); + statZlCopy.put(nazwa_pliku, "Pobrany"); + //DokumentyKollektoActivity.this.recreate(); + // // + } + + // zmiany w pliku statuses.json + // if( "downloading".equals(stat) ) { + // statJs + // } + } + + } + + if(limit) { + statJsCopy.put("limit", "true"); + } + else { + if ( statJs.has("limit") ) { + statJsCopy.remove("limit"); + } + } + + // / + + if( !statJs.equals(statJsCopy) ) { + writeFile(prefs.getString("dir", "") + "/pliki_kollekto/statuses.json", statJsCopy.toString()); + } + + + responseJsCopy = cleenResponseJs(responseJsCopy); + // Jesli po przetworzeniu odpowiedzi nadal cos w niej jest (znaczy ze trzeba stworzyc nowy plik z poloczeniem aby znowu byl wyslany(np. pozostal status check)) + Log.d("my_debug", "responseJsCopy: " + responseJsCopy.toString()+", respnseJsCopy.length: " + responseJsCopy.length() ); + if( responseJsCopy != null && !"".equals(responseJsCopy.toString().trim()) && responseJsCopy.length() > 0 ) { + Long time = (System.currentTimeMillis()); + String ts = Long.toString(time); + String newCommPath = prefs.getString("dir", "") + "/pliki_kollekto/comm_"+ts+".json"; + Log.d("my_debug", "tworze plik: " + newCommPath); + writeFile(newCommPath, responseJsCopy.toString()); + } + + // po przetworzeniu nalezy usunac wyslany plik komunikacyjny + File doneCommFile = new File(commPath); + Log.d("my_debug", "should delete: "+commPath); + if( doneCommFile.exists() ) { + Log.d("my_debug", "delete: "+commPath); + doneCommFile.delete(); + } + } + } + + + + if( !keepService ) { + stopService = true; + } + + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + + try { + int sleepTime = 10000; // 30s + Thread.sleep(sleepTime); + } catch (InterruptedException e) { + Log.d("DEDAL", "Interrupted", e); + } + } + + } + + private JSONObject cleenResponseJs(JSONObject responseJs) { + Iterator pKeys = responseJs.keys(); + boolean limit = false; + try { + while( pKeys.hasNext()){ + String id_zlecenia = (String)pKeys.next(); + JSONObject jZlecenie = responseJs.getJSONObject(id_zlecenia); + if( jZlecenie.length() == 0 ) { + responseJs.remove(id_zlecenia); + } + } + } catch (JSONException e) { + Log.e("DEDAL", "JSON", e); + } + return responseJs; + } + }); + t.start(); + + return super.onStartCommand(intent, flags, startId); + } + + @Override + public IBinder onBind(Intent arg0) { + // TODO Auto-generated method stub + return null; + } + + public void writeFile(String path, String content) { + DedalHelper.putFileContent(path, content); + } + + public String readFile(String path) { + + String content = ""; + try { + File myFile = new File(path); + if( myFile.isFile()){ + BufferedReader buf; + buf = new BufferedReader(new FileReader(myFile)); + content = buf.readLine(); + buf.close(); + } + } catch (IOException e) { + Log.e("DEDAL", "IO", e); + } + return content; + } + +} diff --git a/app/src/main/java/com/likesoft/mdedal/FragmentMainActivity.java b/app/src/main/java/com/likesoft/mdedal/FragmentMainActivity.java new file mode 100644 index 0000000..7d336cd --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/FragmentMainActivity.java @@ -0,0 +1,331 @@ +package com.likesoft.mdedal; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.view.View; +import android.widget.Button; +import android.widget.FrameLayout; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.ScrollView; + + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +/** + * Created by darek on 2016-01-10. + */ +public class FragmentMainActivity extends DedalActivity { + @Override + public View.OnClickListener getZapisz_zmiany(JSONObject jo, String typ) { + return null; + } + + boolean modified = false; + + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + // TODO Auto-generated method stub + super.onActivityResult(requestCode, resultCode, data); + if (data.hasExtra("json") && data.hasExtra("id")) { + // check if radio, find parent to set up value + try { + File dst = new File(prefs.getString("dir", "") + "/baza/" + m_id + ".mod"); + String sJson = DedalHelper.getFileContent(dst.getAbsolutePath()); + js = new JSONObject(sJson);//fs.read(buffer)); + + JSONObject jo = find_element_from_Array( js, data.getExtras().getString("id")); //todo check if not null + if( TYPE_RADIOBUTTON.equals(jo.getString(STRUCT_TYP_DANYCH)) ){ + // find parent + String parent = jo.getString("parent"); + Log.d("my_debug", "szukanie parenta" + parent);// + JSONObject jParent = find_element_from_Array(js, parent); + if( jParent!= null && TYPE_RADIOLISTA.equals(jParent.getString(STRUCT_TYP_DANYCH)) ){ + jParent.put(STRUCT_WARTOSC, jo.getInt("id_wiersz_szablonu")); + } + } + // stopAutozapis(); + // autoZapisStop = false; + mod_json_files(false); + + setModified(); + //MainActivity.this.reload(); + return; + + } catch (JSONException e) { + e.printStackTrace(); + } + + } + } + + @Override + protected void setModified() { + + if( !modified) { + llNaglowek.setBackgroundColor(Color.parseColor("#EBA0DD")); + Button bZapisz = new Button(this); + bZapisz.setText("Zapisz"); + bZapisz.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (modified) { + komunikat_obowiazkowe=""; + komunikat_walidacja=""; + zapiszZmiany(jo); + String komunikat = ""; + if( !komunikat_obowiazkowe.equals("") || !komunikat_walidacja.equals("") ) { + if( !komunikat_obowiazkowe.equals("") ) { + komunikat = res.getString(R.string.walid_pola_obowiazkowe) + ": \n"+komunikat_obowiazkowe + "\n"; + Log.d("my_debug", "Nie wypełniłeś pól obowiązkowych: " + komunikat); + } + if( !komunikat_walidacja.equals("") ) { + komunikat += "\n"+res.getString(R.string.walid_zle_wypelnione)+": \n"+komunikat_walidacja + "\n"; + } + } + if(komunikat!= ""){ + AlertDialog.Builder alertDialog = new AlertDialog.Builder(FragmentMainActivity.this); + alertDialog.setTitle( "Zapisywanie danych");//res.getString(R.string.zakanczanie_wizyty) ); //todo + alertDialog.setMessage(komunikat); + alertDialog.setPositiveButton("Anuluj", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + mod_json_files(false); + dialog.dismiss(); + } + }); + alertDialog.show(); + return; + }else { + modified = false; + saved = true; + } + } + finish(); + } + }); + llNaglowek.addView(bZapisz); + } + modified = true; + } + + @Override + protected void stopAutozapis() { + zapiszZmiany(jo); + } + + @Override + protected void mod_json_files(boolean mod_upload) { + + } + + @Override + protected void forceDoZapis(String key, String kod) { + + } + + String tmpFileName = ""; + //http://www.vogella.com/tutorials/AndroidIntent/article.html + @Override + public void onCreate(Bundle bundle) { + super.onCreate(bundle); + res = getResources(); + Context context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + // setContentView(R.layout.activity_main); + + + + LinearLayout.LayoutParams linLayoutParam = new LinearLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); + + LinearLayout rl = new LinearLayout(this); + rl.setLayoutParams(linLayoutParam); + rl.setOrientation(LinearLayout.VERTICAL); +// rl.setBackgroundColor(Color.YELLOW); + + wyswietlNaglowek( rl ); +// if( bModified){ +// llNaglowek.setBackgroundColor(Color.parseColor("#EBA0DD")); +// } + + sw = new ScrollView(this); + rl.addView(sw); + + HorizontalScrollView hs = new HorizontalScrollView(this); + hs.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); + sw.addView(hs); + + LinearLayout llh = new LinearLayout(this); + int x = this.getWindow().getAttributes().width; + int xx = this.getWindowManager().getDefaultDisplay().getWidth(); //getRealSize(p); + Log.d("my_debug", "szerokość ekranu: "+ x+ ", real x: = " + xx); + llh.setLayoutParams( linLayoutParam); +// llh.setBackgroundColor(Color.RED); + hs.addView(llh); + + LinearLayout ll = new LinearLayout(this); + ll.setOrientation(LinearLayout.VERTICAL); + ll.setPadding(20, 5, 5, 5); //zmiana + ll.setLayoutParams( linLayoutParam); + ll.setMinimumWidth(xx); +// ll.setBackgroundColor(Color.GREEN); + llh.addView(ll); + + try { + Bundle extras = getIntent().getExtras(); + String filePathName = extras.getString("filePathName"); + tmpFileName = filePathName; + if( filePathName == null ) return; + + String sJson = DedalHelper.getFileContent(filePathName); + js = new JSONObject(sJson);//fs.read(buffer)); + + params = js.getJSONObject("param"); + m_id = params.getString("id_zlecenia"); + + String id = extras.getString("id"); + jo = find_element_from_Array(js, id); + find_powtarzalne(jo, 0); + boolean enabled = true; // + // enabled = Boolean.parseBoolean(extras.getString("enable")); + String sEnable = extras.getString("enable"); + if( !"true".equals(sEnable)){ + enabled = false; + } + + String status_interwencji = null; + if( getIntent().hasExtra("status_interwencji") ) { + status_interwencji = extras.getString("status_interwencji"); + } + + // wyswietlOpis(ll, jo); + wyswietlOpis(llNaglowek, jo); + + Log.d("my_debug", "Fragment, enabled"+enabled); + + JSONArray ja = jo.getJSONArray(STRUCT_CHILDS); + if (ja != null && ja.length() > 0) { + for (int i = 0; i < ja.length(); i++) { + wyswietlPole(ll, ja.getJSONObject(i), true, enabled, status_interwencji); + } + } + + } catch (JSONException e) { + e.printStackTrace(); + } + // TextView view = (TextView) findViewById(R.id.editTextHost); + // view.setText(inputString); + + // set LinearLayout as a root element of the screen + // setContentView(rl, linLayoutParam); + setContentView(rl); + + if( supportOnLoadReferences != null ) { + supporRadioRef(supportOnLoadReferences, View.GONE); + } + } + + JSONObject jo; + boolean saved = false; + + LinearLayout llNaglowek; + protected void wyswietlNaglowek(LinearLayout rl) { + LinearLayout ll = new LinearLayout(this); + llNaglowek = ll; + ll.setOrientation(LinearLayout.HORIZONTAL); + ll.setPadding(20, 5, 5, 5); + ll.setBackgroundColor(Color.parseColor("#9BF1F2")); + + HorizontalScrollView hw = new HorizontalScrollView(this); + rl.addView(hw); + hw.addView(ll); + + Button bAnuluj = new Button(this); + bAnuluj.setText("Anuluj"); + bAnuluj.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + modified = false; + finish(); + } + }); + llNaglowek.addView(bAnuluj); + } + + //@Override + public void onCreateFromResource(Bundle bundle) { + super.onCreate(bundle); + setContentView(R.layout.activity_main); + Bundle extras = getIntent().getExtras(); + String inputString = extras.getString("json"); + + + + try { + js = new JSONObject(inputString); + params = js.getJSONObject("param"); + m_id = params.getString("id_zlecenia"); + + String id = extras.getString("id"); + jo = find_element_from_Array(js, id); + find_powtarzalne(jo, 0); + LinearLayout ll = (LinearLayout)findViewById(R.id.linearLayoutMain); + sw = (ScrollView)findViewById(R.id.scrollView1); + boolean enabled = true; // todo: przekazac? + wyswietlPole(ll, jo, true, enabled); + + + } catch (JSONException e) { + e.printStackTrace(); + } + + } + @Override + public void finish() { + Intent intent = new Intent(); +// EditText editText= (EditText) findViewById(R.id.returnValue); +// String string = editText.getText().toString(); + // String string = "aqq"; +// if( modified) { +// zapiszZmiany(jo); +// } + + if( saved ) { + // intent.putExtra("json", js.toString()); + try { + saveToModFile(js); + intent.putExtra("json","true"); + + } catch (IOException e) { + e.printStackTrace(); + } + + } + try { + intent.putExtra("id", jo.getString("id")); + intent.putExtra("status", "OK"); + intent.putExtra("tmpName",tmpFileName); + + } catch (JSONException e) { + e.printStackTrace(); + } + + setResult(RESULT_OK, intent); + super.finish(); + } + +} diff --git a/app/src/main/java/com/likesoft/mdedal/GPSTracker.java b/app/src/main/java/com/likesoft/mdedal/GPSTracker.java new file mode 100644 index 0000000..5a2876a --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/GPSTracker.java @@ -0,0 +1,252 @@ +package com.likesoft.mdedal; + +import java.util.Iterator; + +import android.Manifest; +import android.app.AlertDialog; +import android.app.Service; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.location.GpsSatellite; +import android.location.GpsStatus; +import android.location.GpsStatus.Listener; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.os.Bundle; +import android.os.IBinder; +import android.provider.Settings; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +//import android.util.Log; + +public class GPSTracker extends Service implements LocationListener, Listener { + + private final Context mContext; + + // flag for GPS status + boolean isGPSEnabled = false; + + // flag for network status + boolean isNetworkEnabled = false; + + // flag for GPS status + boolean canGetLocation = false; + + Location location; // location + double latitude; // latitude + double longitude; // longitude + public int liczbaSatelitow = 0; + + // The minimum distance to change Updates in meters + private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 5;//10; // 10 meters + + // The minimum time between updates in milliseconds + private static final long MIN_TIME_BW_UPDATES = 1000 * 300;// 30sec // 60 * 1; // 1 minute + + // Declaring a Location Manager + protected LocationManager locationManager; + + public GPSTracker(Context context) { + this.mContext = context; + getLocation(); + } + + public Location getLocation() { + try { + locationManager = (LocationManager) mContext + .getSystemService(LOCATION_SERVICE); + + // Check runtime permissions for Android M+ + boolean hasFine = ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; + boolean hasCoarse = ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED; + boolean hasLocation = hasFine || hasCoarse; + + // getting GPS status + isGPSEnabled = locationManager + .isProviderEnabled(LocationManager.GPS_PROVIDER); + + // getting network status + isNetworkEnabled = locationManager + .isProviderEnabled(LocationManager.NETWORK_PROVIDER); + + if (!isGPSEnabled && !isNetworkEnabled) { + // no network provider is enabled + } else { + this.canGetLocation = true; + // First get location from Network Provider + if (isNetworkEnabled && hasLocation) { + try { + locationManager.requestLocationUpdates( + LocationManager.NETWORK_PROVIDER, + MIN_TIME_BW_UPDATES, + MIN_DISTANCE_CHANGE_FOR_UPDATES, this); + } catch (SecurityException ignored) { } + if (locationManager != null) { + try { + location = locationManager + .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); + } catch (SecurityException ignored) { } + if (location != null) { + latitude = location.getLatitude(); + longitude = location.getLongitude(); + } + } + } + // GPS status listener (no permission required) + try { locationManager.addGpsStatusListener(this); } catch (Exception ignored) { } + + if (locationManager != null && hasLocation) { + try { + locationManager.requestLocationUpdates( + LocationManager.GPS_PROVIDER, + MIN_TIME_BW_UPDATES, + MIN_DISTANCE_CHANGE_FOR_UPDATES, this); + } catch (SecurityException ignored) { } + try { + location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); + } catch (SecurityException ignored) { } + } + // if GPS Enabled get lat/long using GPS Services + if (isGPSEnabled && location != null) { + latitude = location.getLatitude(); + longitude = location.getLongitude(); + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return location; + } + + /** + * Stop using GPS listener + * Calling this function will stop using GPS in your app + * */ + public void stopUsingGPS() { + if (locationManager != null) { + locationManager.removeUpdates(GPSTracker.this); + } + } + + /** + * Function to get latitude + * */ + public double getLatitude() { + if (location != null) { + latitude = location.getLatitude(); + } + + // return latitude + return latitude; + } + + /** + * Function to get longitude + * */ + public double getLongitude() { + if (location != null) { + longitude = location.getLongitude(); + } + + // return longitude + return longitude; + } + + /** + * Function to check GPS/wifi enabled + * @return boolean + * */ + public boolean canGetLocation() { + return this.canGetLocation; + } + + /** + * Function to show settings alert dialog + * On pressing Settings button will lauch Settings Options + * */ + public void showSettingsAlert() { + AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); + + // Setting Dialog Title + alertDialog.setTitle("GPS jest wymagany"); + + // Setting Dialog Message + alertDialog.setMessage("GPS jest wyłączony. Czy chcesz go teraz włączyć?"); + + // On pressing Settings button + alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); + mContext.startActivity(intent); + } + }); + + // on pressing cancel button + alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + + // Showing Alert Message + alertDialog.show(); + } + + @Override + public void onLocationChanged(Location location) { + this.location = location; + } + + @Override + public void onProviderDisabled(String provider) { + isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); + } + + @Override + public void onProviderEnabled(String provider) { + isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + } + + @Override + public IBinder onBind(Intent arg0) { + return null; + } + + @Override + public void onGpsStatusChanged(int event) { + // TODO Auto-generated method stub + //GpsStatus status = new GpsStatus(n); + // TODO Auto-generated method stub +// int permissionCheckGPS = ContextCompat.checkSelfPermission(getApplicationContext(), +// Manifest.permission.ACCESS_FINE_LOCATION); +// +// if (permissionCheckGPS == PackageManager.PERMISSION_GRANTED) { + Iterable gs = null; + try { + GpsStatus status = locationManager.getGpsStatus(null); + liczbaSatelitow= 0;//status.getMaxSatellites(); + if( status == null){ + return; + } + gs = status.getSatellites(); + } catch (SecurityException ignored) { return; } + if (gs == null) return; + Iterator it = gs.iterator(); + while( it.hasNext()){ + GpsSatellite g = it.next(); + liczbaSatelitow++; + } + +// } + } +} + diff --git a/app/src/main/java/com/likesoft/mdedal/KPActivity.java b/app/src/main/java/com/likesoft/mdedal/KPActivity.java new file mode 100644 index 0000000..dd8f473 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/KPActivity.java @@ -0,0 +1,374 @@ +package com.likesoft.mdedal; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.Spinner; +import android.widget.TableLayout; +import android.widget.TableRow; +import android.widget.TextView; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +//import com.fasterxml.jackson.databind.ObjectMapper; +//import com.likesoft.mdedaltest.R; + +public class KPActivity extends Activity { + + private Map STATUS_NAMES = null; + //private LinearLayout lMain = null; + private SharedPreferences prefs = null; + private TableLayout tl = null; + private LinearLayout lCancelReason = null; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + STATUS_NAMES = new HashMap(); + STATUS_NAMES.put("aktywne", "Aktywne"); + STATUS_NAMES.put("zuzyte", "Zużyte"); + STATUS_NAMES.put("anulowane", "Anulowane"); + + prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + + LinearLayout lMain = new LinearLayout(this); + lMain.setOrientation(LinearLayout.VERTICAL); + + ScrollView vScrollMain = new ScrollView(this); + HorizontalScrollView hScroll = new HorizontalScrollView(this); + vScrollMain.addView(hScroll); + hScroll.addView(lMain); + setContentView(vScrollMain); + + LinearLayout footer = new LinearLayout(this); + footer.setOrientation(LinearLayout.HORIZONTAL); + lMain.addView(footer); + + Button wyjdz = new Button(this); + wyjdz.setText("Wyjdź"); + wyjdz.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + footer.addView(wyjdz); + + //lMain.addView(getCancelReason()); + lCancelReason = new LinearLayout(this); + lCancelReason.setOrientation(LinearLayout.VERTICAL); + lMain.addView(lCancelReason); + + tl = new TableLayout(this); + lMain.addView(tl); + drawTable(); + + + } + + private void drawTable() { + + String KP_filename = prefs.getString("KP_filename", ""); + KP_filename = DedalHelper.getModOrJsonFileName(KP_filename); + + String KP_json = DedalHelper.getFileContent(KP_filename); + JSONArray KP_json_arr = null; + try { + KP_json_arr = new JSONArray(KP_json); + } catch (JSONException e) { + e.printStackTrace(); + } + + // obsługa nulla + if ( KP_json_arr != null ) { // obsługa nulla + + tl.removeAllViews(); + tl.setPadding(0, 15, 0, 0); + + TableRow tr_head = new TableRow(this); + tl.addView(tr_head); + + TextView twH = new TextView(this); + twH.setText("LP"); + twH.setPadding(5, 3, 5, 2); + tr_head.addView(twH); + + TextView twH2 = new TextView(this); + twH2.setText("KP"); + twH2.setPadding(5, 3, 5, 2); + tr_head.addView(twH2); + + TextView twH3 = new TextView(this); + twH3.setText("Status"); + twH3.setPadding(5, 3, 5, 2); + tr_head.addView(twH3); + + TextView twH4 = new TextView(this); + twH4.setText("Operacje"); + twH4.setPadding(5, 3, 5, 2); + tr_head.addView(twH4); + + for( int i = 0 ; i < KP_json_arr.length() ; i++ ) { + try { + JSONObject KP_obj = KP_json_arr.getJSONObject(i); + String status = KP_obj.getString("status"); + TableRow tr = new TableRow(this); + tr.setMinimumHeight(110); + tl.addView(tr); + + TextView tw = new TextView(this); + tw.setText(""+(i+1)); + tw.setPadding(5, 3, 5, 2); + tr.addView(tw); + + TextView tw2 = new TextView(this); + tw2.setText(KP_obj.getString("kp")); + tw2.setPadding(5, 3, 5, 2); + tr.addView(tw2); + + TextView tw3 = new TextView(this); + String status_text = STATUS_NAMES.get(status); + if( KP_obj.has("powod_anulowania") && !"".equals(KP_obj.getString("powod_anulowania")) && !"null".equals(KP_obj.getString("powod_anulowania")) ) { + status_text += "\nPowód: "+KP_obj.getString("powod_anulowania"); + } + tw3.setText(status_text); + tw3.setPadding(5, 3, 5, 2); + tr.addView(tw3); + + + + Button bt = new Button(this); + bt.setPadding(5, 3, 5, 2); + tr.addView(bt); + + if ("aktywne".equals(status) ) { + bt.setText("Anuluj"); + bt.setOnClickListener(new ShowCancelReasonOnClickListener(KP_json_arr, KP_obj)); + } + else if ("anulowane".equals(status) ) { + bt.setText("Przywróć"); + bt.setOnClickListener(new ActionOnClickListener(KP_json_arr, KP_obj, "restore")); + } + + } catch (JSONException e) { + e.printStackTrace(); + } + } + // obsługa nulla + } + else { + tl.removeAllViews(); + tl.setPadding(0, 15, 0, 0); + TextView label = new TextView(this); + label.setText("Błąd pobierania danych. Sprawdź połączenie z internetem."); + label.setPadding(5, 3, 5, 2); + tl.addView(label); + }// obsługa nulla + + } + + private class spinnerCancelOnItemSelectedListener implements AdapterView.OnItemSelectedListener { + + ArrayList items = null; + LinearLayout lInny = null; + EditText etInny = null; + + spinnerCancelOnItemSelectedListener(ArrayList items, LinearLayout lInny, EditText etInny) { + this.items = items; + this.lInny = lInny; + this.etInny = etInny; + } + + @Override + public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { + if( "inny".equals(items.get(position)) ) { + lInny.post(new Runnable() { + @Override + public void run() { + lInny.removeAllViews(); + TextView tv = new TextView(KPActivity.this); + tv.setText("Wpisz: "); + lInny.addView(tv); + lInny.addView(etInny); + } + }); + } + else { + lInny.post(new Runnable() { + @Override + public void run() { + lInny.removeAllViews(); + } + }); + } + } + + @Override + public void onNothingSelected(AdapterView parentView) { + + } + + } + + private class ShowCancelReasonOnClickListener implements OnClickListener { + JSONObject kp_obj = null; + JSONArray kp_arr = null; + + ShowCancelReasonOnClickListener(JSONArray kp_arr, JSONObject kp_obj) { + this.kp_obj = kp_obj; + this.kp_arr = kp_arr; + } + + @Override + public void onClick(View v) { + + lCancelReason.post(new Runnable() { + @Override + public void run() { + lCancelReason.removeAllViews(); + lCancelReason.addView(getCancelReason(kp_arr, kp_obj)); + } + }); + } + } + private class ActionOnClickListener implements OnClickListener { + + JSONObject kp_obj = null; + JSONArray kp_arr = null; + String action = "cancel"; // 'cancel' | 'restore' + Spinner cancelSpin = null; + EditText etInny = null; + + ActionOnClickListener(JSONArray kp_arr, JSONObject kp_obj, String action) { + this.kp_obj = kp_obj; + this.kp_arr = kp_arr; + this.action = action; + } + + ActionOnClickListener(JSONArray kp_arr, JSONObject kp_obj, String action, Spinner cancelSpin, EditText etInny) { + this.kp_obj = kp_obj; + this.kp_arr = kp_arr; + this.action = action; + this.cancelSpin = cancelSpin; + this.etInny = etInny; + } + + @Override + public void onClick(View v) { + try { + if ("cancel".equals(action) ) { + kp_obj.put("status", "anulowane"); + if( cancelSpin != null ) { + String powod = cancelSpin.getSelectedItem().toString(); + if( etInny != null && !"".equals(etInny.getText().toString().trim()) ) { + powod += ": " + etInny.getText(); + } + kp_obj.put("powod_anulowania", powod); + } + } + else if("restore".equals(action)) { + kp_obj.put("status", "aktywne"); + kp_obj.put("powod_anulowania", ""); + } + + String KP_filename = prefs.getString("KP_filename", ""); + KP_filename = KP_filename.replace(".json", ".mod"); + + // copy to .mod + DedalHelper.putFileContent(KP_filename, kp_arr.toString()); + + //copy to upload folder + String dir_upload = prefs.getString("dir", ""); + dir_upload += "/upload_kp"; + File fup = new File(dir_upload); + if( !fup.isDirectory()){ + fup.mkdirs(); + } + //String upload_file_name = KP_filename.replace(".json", ""); + String upload_file_name = "kp_"+(new Date()).getTime() + ".mod"; + DedalHelper.putFileContent(dir_upload + "/" + upload_file_name, kp_arr.toString()); + + drawTable(); + lCancelReason.post(new Runnable() { + @Override + public void run() { + lCancelReason.removeAllViews(); + } + }); + + //wystartuj/obudź serwis + Context context = getApplicationContext(); + Intent service = new Intent(context, DedalService.class); + context.startService(service); + + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + + private LinearLayout getCancelReason(JSONArray KP_json_arr, JSONObject KP_obj){ + LinearLayout lCancelReason = new LinearLayout(this); + lCancelReason.setOrientation(LinearLayout.VERTICAL); + //lMain.addView(lCancelReason); + + TextView tv = new TextView(this); + tv.setText("Powód: "); + lCancelReason.addView(tv); + + Spinner spinCancelReason = new Spinner(this); + lCancelReason.addView(spinCancelReason); + + ArrayList items = new ArrayList(); + items.add("anulowany"); + //items.add("zagubiony"); + //items.add("zniszczony"); + //items.add("inny"); + + ArrayAdapter aa = new ArrayAdapter( + this, + android.R.layout.simple_spinner_item, + items.toArray()); + + aa.setDropDownViewResource( + android.R.layout.simple_spinner_dropdown_item); + + LinearLayout lInny = new LinearLayout(this); + lCancelReason.addView(lInny); + + EditText etInny = new EditText(this); + + //spinCancelReason.setOnItemSelectedListener(new CustomOnItemSelectedListener()); + spinCancelReason.setOnItemSelectedListener(new spinnerCancelOnItemSelectedListener(items, lInny, etInny)); + spinCancelReason.setAdapter(aa); + + Button bAnuluj = new Button(this); + bAnuluj.setText("Anuluj KP"); + bAnuluj.setOnClickListener(new ActionOnClickListener(KP_json_arr, KP_obj, "cancel", spinCancelReason, etInny)); + + lCancelReason.addView(bAnuluj); + + return lCancelReason; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/likesoft/mdedal/KPWplatyActivity.java b/app/src/main/java/com/likesoft/mdedal/KPWplatyActivity.java new file mode 100644 index 0000000..bc047b7 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/KPWplatyActivity.java @@ -0,0 +1,267 @@ +package com.likesoft.mdedal; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.TableLayout; +import android.widget.TableRow; +import android.widget.TextView; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.util.Date; +import java.util.Iterator; + + +public class KPWplatyActivity extends Activity { + + private SharedPreferences prefs = null; + //private LinearLayout lMain = null; + private LinearLayout lContent = null; + private JSONObject KPWplaty_json = null; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + + LinearLayout lMain = new LinearLayout(this); + lMain.setOrientation(LinearLayout.VERTICAL); + //lMain.setPadding(50, 15, 15, 15); + + ScrollView vScroll = new ScrollView(this); + vScroll.addView(lMain); + + setContentView(vScroll); + + LinearLayout footer = new LinearLayout(this); + footer.setOrientation(LinearLayout.HORIZONTAL); + lMain.addView(footer); + + Button wyjdz = new Button(this); + wyjdz.setText("Wyjdź"); + wyjdz.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + footer.addView(wyjdz); + + // REFRESH BUTTON + RefreshLayoutAndThread rlat = new RefreshLayoutAndThread(this) { + @Override + protected void whenThreadNeedToReaoad() { + + } + + @Override + protected void setLastGPSInfo_abstr() { + + } + + @Override + protected void onServiceFinisz() { + drawTable(); + } + }; + LinearLayout refreshLayout = rlat.getRefreshLayout(); + refreshLayout.setPadding(10, 0, 0, 0); + TextView textUpload = rlat.getTextUpload(); + footer.addView(textUpload); + rlat.setLastUpdateInfo(); + rlat.start(); + footer.addView(refreshLayout); + + lContent = new LinearLayout(this); + lContent.setOrientation(LinearLayout.VERTICAL); + lMain.addView(lContent); + + drawTable(); + } + + private void drawTable() { + String KPWplaty_filename = prefs.getString("KPWplaty_filename", ""); + KPWplaty_filename = DedalHelper.getModOrJsonFileName(KPWplaty_filename); + + String KPWplaty_json_string = DedalHelper.getFileContent(KPWplaty_filename); + try { + KPWplaty_json = new JSONObject(KPWplaty_json_string); + } catch (JSONException e) { + e.printStackTrace(); + } + + lContent.removeAllViews(); + lContent.setPadding(0, 15, 0, 0); + + if( KPWplaty_json == null ) return; + + Iterator k = KPWplaty_json.keys(); + while (k.hasNext()) { + String id_fundusz = (String) k.next(); + try { + JSONObject fundusz_obj = KPWplaty_json.getJSONObject(id_fundusz); + LinearLayout funduszLayout = new LinearLayout(this); + funduszLayout.setOrientation(LinearLayout.VERTICAL); + lContent.addView(funduszLayout); + + TextView titleTv = new TextView(this); + titleTv.setText("" + fundusz_obj.getString("nazwa_funduszu") + ", nr karty: " + fundusz_obj.getString("nr_karty")); + titleTv.setTextSize(30); + funduszLayout.addView(titleTv); + + TableLayout tl = new TableLayout(this); + funduszLayout.addView(tl); + JSONArray wplatyJson = fundusz_obj.getJSONArray("wplaty"); + if( wplatyJson != null && wplatyJson.length() > 0 ) { + // header + TableRow tr_head = new TableRow(this); + tl.addView(tr_head); + + TextView twH = new TextView(this); + twH.setText("LP"); + twH.setPadding(5, 3, 5, 2); + tr_head.addView(twH); + + /*TextView twH2 = new TextView(this); + twH2.setText("Zlecenie"); + twH2.setPadding(5, 3, 5, 2); + tr_head.addView(twH2);*/ + + TextView twH1 = new TextView(this); + twH1.setText("KP"); + twH1.setPadding(5, 3, 5, 2); + tr_head.addView(twH1); + + TextView twH2 = new TextView(this); + twH2.setText("Nr sprawy"); + twH2.setPadding(5, 3, 5, 2); + tr_head.addView(twH2); + + + TextView twH3 = new TextView(this); + twH3.setText("Kwota"); + twH3.setPadding(5, 3, 5, 2); + tr_head.addView(twH3); + + for( int i = 0 ; i < wplatyJson.length() ; i++ ) { + JSONObject wplataJson = wplatyJson.getJSONObject(i); + + TableRow tr = new TableRow(this); + tl.addView(tr); + + TextView tw = new TextView(this); + tw.setText(""+(i+1)); + tw.setPadding(5, 3, 5, 2); + tr.addView(tw); + + /*TextView tw2 = new TextView(this); + tw2.setText(wplataJson.getString("id_zlecenia")); + tw2.setPadding(5, 3, 5, 2); + tr.addView(tw2);*/ + + TextView tw1 = new TextView(this); + tw1.setText(wplataJson.getString("kp")); + tw1.setPadding(5, 3, 5, 2); + tr.addView(tw1); + + TextView tw2 = new TextView(this); + tw2.setText(wplataJson.getString("nr_sprawy")); + tw2.setPadding(5, 3, 5, 2); + tr.addView(tw2); + + TextView tw3 = new TextView(this); + tw3.setText(wplataJson.getString("kwota")); + tw3.setPadding(5, 3, 5, 2); + tr.addView(tw3); + } + + TableRow tr = new TableRow(this); + tl.addView(tr); + + TextView sumaTvLabel = new TextView(this); + sumaTvLabel.setText("Suma"); + sumaTvLabel.setTextSize(30); + sumaTvLabel.setPadding(5, 3, 5, 2); + tr.addView(sumaTvLabel); + + TableRow.LayoutParams params = (TableRow.LayoutParams) sumaTvLabel.getLayoutParams(); + params.span = 2; //amount of columns you will span + sumaTvLabel.setLayoutParams(params); + + TextView sumaTv = new TextView(this); + sumaTv.setText(fundusz_obj.getString("suma")+" zł"); + sumaTv.setTextSize(30); + sumaTv.setPadding(5, 3, 5, 2); + tr.addView(sumaTv); + } + + if ( fundusz_obj.getString("nr_karty") != null && fundusz_obj.getString("nr_karty").length() > 0 ) { //Mateusz - no display if don't have card + Button bWplacam = new Button(this); + bWplacam.setText("Wpłacam"); + bWplacam.setOnClickListener(new WplacamOnClickListener(id_fundusz)); + funduszLayout.addView(bWplacam); + } + + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + + private class WplacamOnClickListener implements OnClickListener { + + String id_fundusz = null; + + WplacamOnClickListener(String id_fundusz) { + this.id_fundusz = id_fundusz; + } + + @Override + public void onClick(View v) { + //copy to upload folder + String dir_upload = prefs.getString("dir", ""); + dir_upload += "/upload_kp_wplaty"; + File fup = new File(dir_upload); + if( !fup.isDirectory()){ + fup.mkdirs(); + } + + //String upload_file_name = KP_filename.replace(".json", ""); + String upload_file_name = "kp_wplaty_"+(new Date()).getTime() + ".mod"; + + JSONArray ids_wplat = new JSONArray(); + try { + JSONObject fundusz_obj = KPWplaty_json.getJSONObject(id_fundusz); + JSONArray wplatyJson = fundusz_obj.getJSONArray("wplaty"); + for( int i = 0 ; i < wplatyJson.length() ; i++ ) { + JSONObject wplataJson = wplatyJson.getJSONObject(i); + ids_wplat.put(wplataJson.get("id")); + } + + DedalHelper.putFileContent(dir_upload + "/" + upload_file_name, ids_wplat.toString()); + } catch (JSONException e) { + e.printStackTrace(); + } + + + //wystartuj/obudź serwis + Context context = getApplicationContext(); + Intent service = new Intent(context, DedalService.class); + context.startService(service); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/likesoft/mdedal/ListActivity.java b/app/src/main/java/com/likesoft/mdedal/ListActivity.java new file mode 100644 index 0000000..64dbe4c --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/ListActivity.java @@ -0,0 +1,3473 @@ +package com.likesoft.mdedal; + +import android.Manifest; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ClipData; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.Point; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.StrictMode; +import android.preference.PreferenceManager; +import android.provider.Settings; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.SparseArray; +import android.view.DragEvent; +import android.view.Gravity; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnDragListener; +import android.view.View.OnTouchListener; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.EditText; +import android.widget.HorizontalScrollView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.ScrollView; +import android.widget.SearchView; +import android.widget.SearchView.OnQueryTextListener; +import android.widget.Spinner; +import android.widget.TableLayout; +import android.widget.TableRow; +import android.widget.TextView; +import android.widget.Toast; +import android.widget.ToggleButton; + +import com.likesoft.mdedal.gui.MTextView; +//import com.likesoft.mdedaltest.R; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +//import android.util.Log; +//import com.likesoft.mdedaltest.PreferActivityTest; + +public class ListActivity extends Activity { + private static final int REQUEST_READ_PHONE_STATE = 5001; + private static final int REQUEST_ACCESS_FINE_LOCATION = 5002; + private static final int REQUEST_POST_NOTIFICATIONS = 5003; + private static final int REQUEST_APP_PERMISSIONS = 4000; + private static final int REQUEST_MANAGE_ALL_FILES = 4001; + + protected Class getMainActivity() { + return MainActivity.class; + } + protected Class getTableHeadersActivity() { + return TableHeadersActivity.class; + } + protected Class getCalendarActivity() { + return CalendarActivity.class; + } + protected Class getKPActivity() { + return KPActivity.class; + } + protected Class getKPWplatyActivity() { + return KPWplatyActivity.class; + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + // TODO Auto-generated method stub + super.onConfigurationChanged(newConfig); + Context context = getApplicationContext(); + Log.d(LOG, "onConfigurationChanged: " + newConfig.toString()); + Intent intent = getIntent(); + intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + finish(); + startActivity(intent); + } + + public final static String LOG = "ListActivity"; + String sf = null; + ArrayList names = null; + + public static String readFile(InputStream in) throws IOException { + StringBuffer sb = new StringBuffer(); + byte buffer[] = new byte[1000]; + int s = 0; + while ((s = in.read(buffer)) > 0) { + String st =new String(buffer, 0, s); + sb.append(st); + } + in.close(); + return sb.toString(); + } + +// String hostPath = "http://javax.pl/dedal/demo"; +// String hostPath = "http://192.168.1.23/svn/dedal/src"; + SharedPreferences prefs; + + private final class Wyswietl_linie_konca_Thread implements Runnable { + TableLayout tl; + public Wyswietl_linie_konca_Thread(TableLayout _tl) { + tl = _tl; + } + @Override + public void run() { + + // TODO Auto-generated method stub + wyswietl_linie_konca(tl); + } +} + + private final class MyWiersTRThread implements Runnable { + TableLayout tl; JSONArray jKolumny; + JSONObject jZlecenie; int i; + public MyWiersTRThread(TableLayout _tl, JSONArray _jKolumny, + JSONObject _jZlecenie, int _i) { + tl = _tl; + jKolumny = _jKolumny; + jZlecenie = _jZlecenie; + i = _i; + } + @Override + public void run() { + // TODO Auto-generated method stub + try { + wyswietl_wierszTR(tl, jKolumny, jZlecenie, i); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} + + private final class MyTabelaThread implements Runnable { + + JSONArray jKolumny; TableLayout tl; + ArrayList aM; + public MyTabelaThread(JSONArray _jKolumny, TableLayout _tl, + ArrayList _aM) { + + jKolumny = _jKolumny; + tl = _tl; + aM = _aM; + } + @Override + public void run() { + // TODO Auto-generated method stub + try { + wyswietl_tabele_zlecen(jKolumny, tl, aM); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} + +// private final class MyWyswietlLinieThread implements Runnable { +// JSONArray Kolumny; +// TableRow tr; +// JSONObject jZlecenie; +// public MyWyswietlLinieThread(JSONArray _Kolumny, TableRow _tr, +// JSONObject _jZlecenie) { +// Kolumny = _Kolumny; +// tr = _tr; +// jZlecenie = _jZlecenie; +// } +// +// @Override +// public void run() { +// // TODO Auto-generated method stub +// try { +// wyswietlLinie(Kolumny, tr, jZlecenie); +// } catch (JSONException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } +// } +//} + + private final class EditFolderOnClickListener implements OnClickListener { + @SuppressWarnings("deprecation") + @Override + public void onClick(View v) { + String title = null; + if( id_folder > 0 ) { + int pos = findPosFolder(id_folder); + String nazwa_folderu = folderNazwy.get(pos); + title = "Edycja folderu: " + nazwa_folderu; + } + else { + title = "Dodawanie nowego folderu"; + } + //String nazwa_folderu = "costam"; + + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ListActivity.this); + AlertDialog alertDialog = alertDialogBuilder.create(); + alertDialog.setTitle( title ); + LinearLayout ll = new LinearLayout(ListActivity.this); + ll.setOrientation(LinearLayout.VERTICAL); + + // Edycja folderu + if( id_folder > 0 ) { + LinearLayout ll_edit_folder = new LinearLayout(ListActivity.this); + ll_edit_folder.setOrientation(LinearLayout.HORIZONTAL); + TextView tw1 = new TextView(ListActivity.this); + tw1.setText("Nowa nazwa folderu:"); + EditText et = new EditText(ListActivity.this); + et.setMinWidth(60); + maxId++; + et.setId(maxId); + Log.d("my_debug", "przed id: "+et.getId()); + ll_edit_folder.addView(tw1); + ll_edit_folder.addView(et); + Button b_edit_folder = new Button(ListActivity.this); + b_edit_folder.setText("OK"); + b_edit_folder.setOnClickListener(new Edit_folder_onlick(et, alertDialog)); + ll_edit_folder.addView(b_edit_folder); + + Button b_delete_folder = new Button(ListActivity.this); + b_delete_folder.setText("Usuń folder"); + b_delete_folder.setOnClickListener(new Delete_folder_onlick(et, alertDialog)); + ll_edit_folder.addView(b_delete_folder); + + ll.addView(ll_edit_folder); + } + ///// + + // Nowy folder + LinearLayout ll_new_folder = new LinearLayout(ListActivity.this); + ll_new_folder.setOrientation(LinearLayout.HORIZONTAL); + TextView tw1 = new TextView(ListActivity.this); + tw1.setText("Dodaj nowy folder:"); + EditText et = new EditText(ListActivity.this); + et.setMinWidth(60); + maxId++; + et.setId(maxId); + Log.d("my_debug", "przed id: "+et.getId()); + ll_new_folder.addView(tw1); + ll_new_folder.addView(et); + Button b_new_folder = new Button(ListActivity.this); + b_new_folder.setText("OK"); + b_new_folder.setOnClickListener(new New_folder_onlick(et, alertDialog)); + ll_new_folder.addView(b_new_folder); + ///// + + ll.addView(ll_new_folder); + alertDialog.setView(ll); + //alertDialog.setPositiveButton("OK", new New_folder_onlick(et)); + alertDialog.setButton("Anuluj", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + //mod_json_files(false); + dialog.dismiss(); + } + }); + alertDialog.show(); + } + + private int findPosFolder(int id_folder) { + int pos = 0; + for( pos = 0 ; pos < folderIds.size() ; pos++ ) { + if( folderIds.get(pos) == id_folder ) { + break; + } + } + return pos; + + } + } + + private final class MyComparator_sortInFolder implements + Comparator { + + JSONArray jkolejnosc_zlecen; + + public MyComparator_sortInFolder(JSONArray jkolejnosc_zlecen) { + this.jkolejnosc_zlecen = jkolejnosc_zlecen; + } + + @Override + public int compare(JSONObject lhs, JSONObject rhs) { + // TODO Auto-generated method stub + try { + //Log.d("my_debug", "trara: "+ lhs.getString("id_zlecenia")+" | "+rhs.getString("id_zlecenia")); + //Log.d("my_debug", "trara: "+ find_kol(lhs.getString("id_zlecenia"))+" | "+find_kol(lhs.getString("id_zlecenia"))); + if( find_kol(lhs.getString("id_zlecenia")) < find_kol(rhs.getString("id_zlecenia")) ) { + return -1; + } + else { + return 1; + } + //return lhs.getString(sortCol).compareTo(rhs.getString(sortCol)) *bSortASC; + } catch (JSONException e) { + } + return 0; + } + + private int find_kol(String id_zlecenia) { + int i = 0; + for( i = 0 ; i < jkolejnosc_zlecen.length() ; i++) { + try { + //Log.d("my_debug", "oj "+i+": |"+jkolejnosc_zlecen.getString(i)+"|"+id_zlecenia+"|"); + if( jkolejnosc_zlecen.getString(i).equals(id_zlecenia)) { + break; + } + } catch (JSONException e) { + // TODO Auto-generated catch block + Log.e(LOG, "", e); + } + } + return i; + } + } + +private final class Delete_folder_onlick implements OnClickListener { + + //int id; + EditText et; + AlertDialog alertDialog; + + public Delete_folder_onlick(EditText et, AlertDialog alertDialog) { + this.et = et; + this.alertDialog = alertDialog; + } + + @Override + public void onClick(View arg0) { + if( et != null ) { + String nazwa = et.getText().toString(); + + try { + JSONObject mainJs = new JSONObject(); + JSONObject contentJs = new JSONObject(); + contentJs.put("id_folder", id_folder); + //contentJs.put("operation", "delete"); + //contentJs.put("id_folder", id_folder_gui); + mainJs.put("delete_folder", contentJs); + + changeIdFolderInListaProfil(id_folder, 0); + removeFolderFromListaProfil(id_folder); + + Date d = new Date(); + String genName = "folder_"+d.getTime() + ".mod"; + File dstDir = new File(prefs.getString("dir", "") + "/upload_folders_mod"); + if( !dstDir.isDirectory()){ dstDir.mkdirs(); } + DedalHelper.putFileContent(prefs.getString("dir", "") + "/upload_folders_mod/" + genName, mainJs.toString()); + + // wystartuj/obudz serwis + Context context = getApplicationContext(); + Intent service = new Intent(context, DedalService.class); + context.startService(service); + + //((DialogInterface)alertDialog).dismiss(); + alertDialog.dismiss(); + } catch (JSONException e) { + // TODO Auto-generated catch block + Log.e(LOG, "", e); + } + } + else { + Log.d("my_debug", "et jest null");//, id: "+id); + } + } + } + + private final class Edit_folder_onlick implements OnClickListener { + + //int id; + EditText et; + AlertDialog alertDialog; + + public Edit_folder_onlick(EditText et, AlertDialog alertDialog) { + this.et = et; + this.alertDialog = alertDialog; + } + + @Override + public void onClick(View arg0) { + if( et != null ) { + String nazwa = et.getText().toString(); + + try { + JSONObject mainJs = new JSONObject(); + JSONObject contentJs = new JSONObject(); + contentJs.put("nazwa", nazwa); + contentJs.put("id_folder", id_folder); + //contentJs.put("operation", "edit"); + //contentJs.put("id_folder", id_folder_gui); + mainJs.put("edit_folder", contentJs); + + changeFolderNameInListaProfil(id_folder, nazwa); + + Date d = new Date(); + String genName = "folder_"+d.getTime() + ".mod"; + File dstDir = new File(prefs.getString("dir", "") + "/upload_folders_mod"); + if( !dstDir.isDirectory()){ dstDir.mkdirs(); } + + DedalHelper.putFileContent(prefs.getString("dir", "") + "/upload_folders_mod/" + genName, mainJs.toString()); + + // wystartuj/obudz serwis + Context context = getApplicationContext(); + Intent service = new Intent(context, DedalService.class); + context.startService(service); + + //((DialogInterface)alertDialog).dismiss(); + alertDialog.dismiss(); + } catch (JSONException e) { + Log.e(LOG, "", e); + } + } + else { + Log.d("my_debug", "et jest null");//, id: "+id); + } + } + } + + private final class New_folder_onlick implements OnClickListener { + + //int id; + EditText et; + AlertDialog alertDialog; + + public New_folder_onlick(EditText et, AlertDialog alertDialog) { + this.et = et; + this.alertDialog = alertDialog; + } + + @Override + public void onClick(View arg0) { + if( et != null ) { + String nazwa = et.getText().toString(); + + try { + JSONObject mainJs = new JSONObject(); + JSONObject contentJs = new JSONObject(); + contentJs.put("nazwa", nazwa); + //contentJs.put("operation", "new"); + //contentJs.put("id_folder", id_folder_gui); + mainJs.put("new_folder", contentJs); + + addFolderInListaProfil( nazwa ); + + Date d = new Date(); + String genName = "folder_"+d.getTime() + ".mod"; + File dstDir = new File(prefs.getString("dir", "") + "/upload_folders_mod"); + if( !dstDir.isDirectory()){ dstDir.mkdirs(); } + + DedalHelper.putFileContent(prefs.getString("dir", "") + "/upload_folders_mod/" + genName, mainJs.toString()); + + // wystartuj/obudz serwis + Context context = getApplicationContext(); + Intent service = new Intent(context, DedalService.class); + context.startService(service); + + //((DialogInterface)alertDialog).dismiss(); + alertDialog.dismiss(); + } catch (JSONException e) { + Log.e(LOG, "", e); + } + } + else { + Log.d("my_debug", "et jest null");//, id: "+id); + } + } + } + +// public class MyClickListener implements OnClickListener{ +// String name = ""; +// public MyClickListener(String n){ +// super(); +// name = n; +// } +// +// public void onClick(View v) { +// // TODO Auto-generated method stub +// +// +// Intent intent = new Intent(ListActivity.this, +// getMainActivity()); +// File f = new File(sf + "/" + name); +// Uri u = Uri.fromFile(f); +// intent.setData(u); +// startActivity(intent); +// } +// } + + public class CustomOnItemSelectedListener implements OnItemSelectedListener { + + public void onItemSelected(AdapterView parent, View view, int pos, + long id) { + + Toast.makeText(parent.getContext(), + "Wybrano profil : " + parent.getItemAtPosition(pos).toString(), + Toast.LENGTH_LONG).show(); + + id_profilu = profileIds.get(pos); + //todo filtry: narazie zakomentowane + //filterItems = new ArrayList(); // czyszczenie filtra wyboru. + + //JSONObject jProfil; + try { + jProfil = jProfiles.getJSONObject(id_profilu); + curPage = 0; + wyswietlListe(); + } catch (JSONException e) { + Log.e(LOG, "", e); + } + + } + @Override + public void onNothingSelected(AdapterView arg0) { + // TODO Auto-generated method stub + } + } + + public class CustomOnFolderSelectedListener implements OnItemSelectedListener { + + public void onItemSelected(AdapterView parent, View view, int pos, + long id) { + + if(id_folder != folderIds.get(pos)) { + Log.d("my_debug", "onitemselected, id_folder old: "+id_folder+", id_folder new: "+folderIds.get(pos)); + id_folder = folderIds.get(pos); + curPage = 0; + wyswietlListe(); + } + + } + @Override + public void onNothingSelected(AdapterView arg0) { + // TODO Auto-generated method stub + } + } + + private void addFolderInListaProfil( String nazwa ) { + try { + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + if( dLista.isFile()){ + String sJson = DedalHelper.getFileContent(dLista.getAbsolutePath()); + JSONObject jFile = new JSONObject(sJson); + + int max_id_folder = 0; + for(int i = 0 ; i < folderIds.size(); i++) { + if ( folderIds.get(i) > max_id_folder ) { + max_id_folder = folderIds.get(i); + } + } + int id_folder_new = max_id_folder + 1; + + Log.d("my_debug", "jfile folder: "+jFile.getString("foldery")); + + JSONObject jFolders; + + if( !jFile.has("foldery") || "null".equals(jFile.getString("foldery")) ) { + //Log.d("my_debug", "new json"); + jFolders = new JSONObject(); + jFile.put("foldery", jFolders); + } + else { + + jFolders = jFile.getJSONObject("foldery"); + //Log.d("my_debug", "exist json, "+jFolders.toString()); + } + JSONObject jFolder = new JSONObject(); + jFolder.put("id_folder", id_folder_new); + jFolder.put("nazwa", nazwa); + + jFolders.put(Integer.toString(id_folder_new), jFolder); + + DedalHelper.putFileContent(prefs.getString("dir", "") + "/baza/lista.profil", jFile.toString()); + } + } catch (JSONException e) { + Log.e(LOG, "", e); + } + } + + private void changeFolderNameInListaProfil(int id_folder, String nazwa) { + try { + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + if( dLista.isFile()){ + String sJson = DedalHelper.getFileContent(dLista.getAbsolutePath()); + JSONObject jFile = new JSONObject(sJson); + + JSONObject jFolders = jFile.getJSONObject("foldery"); + JSONObject jFolder = jFolders.getJSONObject(Integer.toString(id_folder)); + jFolder.put("nazwa", nazwa); + + DedalHelper.putFileContent(prefs.getString("dir", "") + "/baza/lista.profil", jFile.toString()); + } + } catch (JSONException e) { + Log.e(LOG, "", e); + } + } + + private void removeFolderFromListaProfil(int id_folder) { + try { + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + if( dLista.isFile()){ + String sJson = DedalHelper.getFileContent(dLista.getAbsolutePath()); + JSONObject jFile = new JSONObject(sJson); + JSONObject jFolders = jFile.getJSONObject("foldery"); + jFolders.remove(Integer.toString(id_folder)); + DedalHelper.putFileContent(prefs.getString("dir", "") + "/baza/lista.profil", jFile.toString()); + } + } catch (JSONException e) { + Log.e(LOG, "", e); + } + } + + private void changeIdFolderInListaProfil(int id_folder_old, int id_folder_new) { + try { + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + if( dLista.isFile()){ + + String sJson = DedalHelper.getFileContent(dLista.getAbsolutePath()); + JSONObject jFile = new JSONObject(sJson); + + JSONObject jProfiles = jFile.getJSONObject("profile"); + Iterator pKeys = jProfiles.keys(); + //Boolean break_ = false; + + while( pKeys.hasNext()){ + String idProfilu = (String)pKeys.next(); + JSONObject jProfil = jProfiles.getJSONObject(idProfilu); + JSONObject jZlecenia = jProfil.getJSONObject("zlecenia"); + Iterator pKeys2 = jZlecenia.keys(); + while( pKeys2.hasNext() ){ + String id_zlecenia = (String)pKeys2.next(); + JSONObject jZlecenie = jZlecenia.getJSONObject(id_zlecenia); + if(jZlecenie.has("id_folder") && !jZlecenie.getString("id_folder").equals("null") && jZlecenie.getInt("id_folder") == id_folder_old) { + if(id_folder_new == 0) { + jZlecenie.put("id_folder", "null"); + } + else { + jZlecenie.put("id_folder", id_folder_new); + } + } + } + } + + DedalHelper.putFileContent(prefs.getString("dir", "") + "/baza/lista.profil", jFile.toString()); + } + } catch (JSONException e) { + Log.e(LOG, "", e); + } + } + + public class ChangeZlecenieFolderSelectedListener implements + OnItemSelectedListener { + + private JSONObject jZlecenie; + + public ChangeZlecenieFolderSelectedListener(JSONObject jZlecenie){ + this.jZlecenie = jZlecenie; + } + + + @Override + public void onItemSelected(AdapterView parent, View view, int pos, + long id) { + if( folderIdsForOrders.get(pos) != null ) { + + //Log.d("my_debug", "change listener, id_zlecenia: "+id_zlecenia+", id_folder: "+id_folder); + + try { + int id_folder_gui = folderIdsForOrders.get(pos); + int id_zlecenia = jZlecenie.getInt("id_zlecenia"); + + + int id_folder_json = 0; + if( jZlecenie.getString("id_folder").equals("null") ){ + id_folder_json = 0; + } + else { + id_folder_json = jZlecenie.getInt("id_folder"); + } + + // jeśli zlecenie zaznaczone w guiu jest takie samo jak w jsonie to nie ma sensu generować plików ( return ) + if( id_folder_json == id_folder_gui) { + return; + } + + Log.d("my_debug", "change listener, id_zlecenia: "+id_zlecenia+", id_folder: "+id_folder_gui); + + jZlecenie.put("id_folder", id_folder_gui); + + setIdFolderInListaProfil(id_zlecenia, id_folder_gui); + + JSONObject mainJs = new JSONObject(); + JSONObject contentJs = new JSONObject(); + contentJs.put("id_zlecenia", id_zlecenia); + contentJs.put("id_folder", id_folder_gui); + mainJs.put("zlecenie", contentJs); + + Date d = new Date(); + String genName = "folder_"+d.getTime() + ".mod"; + File dstDir = new File(prefs.getString("dir", "") + "/upload_folders_mod"); + if( !dstDir.isDirectory()){ dstDir.mkdirs(); } + + DedalHelper.putFileContent(prefs.getString("dir", "") + "/upload_folders_mod/" + genName, mainJs.toString()); + + /* + // wystartuj/obudź serwis + Context context = getApplicationContext(); + Intent service = new Intent(context, DedalService.class); + context.startService(service); + */ + } catch (JSONException e) { + Log.e(LOG, "", e); + } + + } + } + + + + private void setIdFolderInListaProfil(int id_zlecenia, int id_folder) { + try { + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + if( dLista.isFile()){ + String sJson = DedalHelper.getFileContent(dLista.getAbsolutePath()); + JSONObject jFile = new JSONObject(sJson); + + JSONObject jProfiles = jFile.getJSONObject("profile"); + Iterator pKeys = jProfiles.keys(); + //Boolean break_ = false; + + while( pKeys.hasNext()){ + String idProfilu = (String)pKeys.next(); + JSONObject jProfil = jProfiles.getJSONObject(idProfilu); + JSONObject jZlecenia = jProfil.getJSONObject("zlecenia"); + Iterator pKeys2 = jZlecenia.keys(); + while( pKeys2.hasNext() ){ + String id_zlecenia_curr = (String)pKeys2.next(); + if ( id_zlecenia_curr.equals( Integer.toString(id_zlecenia) ) ) { + JSONObject jZlecenie = jZlecenia.getJSONObject(Integer.toString(id_zlecenia)); + if(id_folder == 0) { + jZlecenie.put("id_folder", "null"); + } + else { + jZlecenie.put("id_folder", id_folder); + } + } + else { + continue; + } + } +// if( break_ ) { +// break; +// } + } + DedalHelper.putFileContent(prefs.getString("dir", "") + "/baza/lista.profil", jFile.toString()); + } + + + + } catch (JSONException e) { + Log.e(LOG, "", e); + } + + } + + + @Override + public void onNothingSelected(AdapterView arg0) { + // TODO Auto-generated method stub + + } + + } + + //long lastProfileMod = 0; + //TextView textDataMod; + TextView textGPSMod; + //TextView textUpload; + //ProgressBar progress; + ToggleButton checkZaakceptowane; + boolean isCheckedZaakceptowane = true; + + JSONObject jProfiles; + Spinner sortSpinner = null; + + ArrayList items = new ArrayList(); + ArrayList profileIds = new ArrayList(); + JSONObject jProfil; // obecnie wybrany profil + String id_profilu; //obecnie wybrany id_profilu + LinearLayout listaLayout; + Spinner spinProfil; + Spinner spinFolder; + +// ArrayList sortItems = new ArrayList(); +// ArrayList sortItemsKod = new ArrayList(); + + FilterColumns filterColumns = new FilterColumns(); + + private static final String DEFAULT_SORT_COL = "data_zlecenia"; + +// String sortCol = "data_zlecenia"; +// int bSortASC = -1; +// ArrayList filterItems = new ArrayList(); + + int versionNumber = 0; + String versionName = "Wersja ?"; +// EditText etSearch; + + String search = ""; + + // kkuz: do obsługi katalogów zleceń + int id_folder = -1; // -1 - oznacza brak wybrania folderu (czyli pokaż wszystkie), 0 oznacza pokazanie zleceń nieprzypisnych do folderu + ArrayList folderIds = new ArrayList(); + ArrayList folderNazwy = new ArrayList(); + + ArrayList folderIdsForOrders = new ArrayList(); + ArrayList folderNazwyForOrders = new ArrayList(); + + SparseArray trId_id_zlecenia = new SparseArray(); + + int maxId = 0; + + int curPage = 0; + final int linesPerPage = 50; + int linesCount = -1; // wyswietl liste oblicza. + TextView tIlosc; + + // private boolean isPortret = false; + double latitude; + double longitude; + public static GPSTracker gps; + + RefreshLayoutAndThread rlat = null; + + protected String getDefaultHost(){ + return "";//https://dedal.eos-ksi.pl"; + } + protected String getDefaultFolder(){ + return "/likesoft"; + } + + + @Override + protected void onResume() { + // TODO Auto-generated method stub + super.onResume(); + Log.d("my_debug", "onresume"); + // jeśli użytkownik wrócił z Ustawień i przyznał uprawnienie zarządzania plikami, + // a UI nie został jeszcze zainicjalizowany, to teraz wykonaj inicjalizację + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (Environment.isExternalStorageManager()) { + if (spinProfil == null) { + setupUIAndLogic(); + } + } + } + wyswietlListe(); + + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == REQUEST_APP_PERMISSIONS) { + // Evaluate which permissions were granted and continue initialization. + boolean anyDenied = false; + for (int r : grantResults) { + if (r != PackageManager.PERMISSION_GRANTED) { anyDenied = true; break; } + } + if (anyDenied) { + // Show a short explanation and continue with reduced functionality + Toast.makeText(this, "Część uprawnień nie została przyznana. Aplikacja uruchomi się, ale niektóre funkcje mogą być niedostępne.", Toast.LENGTH_LONG).show(); + } + // kontynuuj inicjalizację bez restartu + setupUIAndLogic(); + return; + } + + // legacy/requested individually - keep fallback + switch (requestCode) { + case REQUEST_READ_PHONE_STATE: + // fallthrough - do a gentle retry of initialization + setupUIAndLogic(); + break; + case REQUEST_ACCESS_FINE_LOCATION: + // nothing special + break; + case REQUEST_POST_NOTIFICATIONS: + // notifications permission handled by service when needed + break; + + default: + break; + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + + super.onCreate(savedInstanceState); + // setContentView(R.layout.activity_list); +// if(BuildConfig.DEBUG) +// StrictMode.enableDefaults(); + + //if (DEVELOPER_MODE) + if(BuildConfig.DEBUG){ + StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() + // .detectDiskReads() + // .detectDiskWrites() + .detectNetwork() // or .detectAll() for all detectable problems + .penaltyLog() + .build()); + StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() + .detectLeakedSqlLiteObjects() + // .detectLeakedClosableObjects() + .penaltyLog() + //.penaltyDeath() + .build()); + } + + // centralna prośba o uprawnienia runtime + if (!ensurePermissions()) { + // permissions request started, poczekaj na callback + return; + } + + // jeśli wszystkie wymagane uprawnienia już są przyznane, wykonaj resztę inicjalizacji + setupUIAndLogic(); + + } + + /** + * Sprawdza jakie uprawnienia potrzebne i uruchamia request jeśli coś brakuje. + * Zwraca true gdy wszystkie wymagane uprawnienia są już przyznane. + */ + private boolean ensurePermissions() { + ArrayList toRequest = new ArrayList(); + // telephony: proś o READ_PHONE_STATE dla starych SDK, oraz READ_PHONE_NUMBERS dla nowszych + if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { + toRequest.add(Manifest.permission.READ_PHONE_STATE); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED) { + toRequest.add(Manifest.permission.READ_PHONE_NUMBERS); + } + } + // location (app używa GPSTracker) - prośba o ACCESS_FINE_LOCATION jeśli nieprzyznane + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED + && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + toRequest.add(Manifest.permission.ACCESS_FINE_LOCATION); + } + // notifications (Android 13+) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { + toRequest.add(Manifest.permission.POST_NOTIFICATIONS); + } + } + // WRITE_EXTERNAL_STORAGE only for Android < Q as before + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + toRequest.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + } + // Storage permissions - różne podejście dla różnych wersji Androida + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + // Android 11+ - MANAGE_EXTERNAL_STORAGE wymaga specjalnego ekranu Settings + if (!Environment.isExternalStorageManager()) { + // Wyświetl dialog z wyjaśnieniem przed przejściem do ustawień + new AlertDialog.Builder(this) + .setTitle("Wymagane uprawnienie") + .setMessage("Aplikacja potrzebuje dostępu do pamięci urządzenia, aby zapisywać pliki zleceń i zdjęć. " + + "Zostaniesz przekierowany do ustawień, aby przyznać uprawnienie 'Wszystkie pliki'.") + .setPositiveButton("OK", (dialog, which) -> { + try { + Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); + Uri uri = Uri.fromParts("package", getPackageName(), null); + intent.setData(uri); + startActivityForResult(intent, REQUEST_MANAGE_ALL_FILES); + } catch (Exception e) { + // Fallback dla niektórych urządzeń + Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); + startActivityForResult(intent, REQUEST_MANAGE_ALL_FILES); + } + }) + .setNegativeButton("Anuluj", (dialog, which) -> { + Toast.makeText(this, "Aplikacja nie będzie działać poprawnie bez dostępu do pamięci", Toast.LENGTH_LONG).show(); + finish(); + }) + .setCancelable(false) + .show(); + return false; + } + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + // Android 10 - WRITE_EXTERNAL_STORAGE + requestLegacyExternalStorage w manifeście + if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + toRequest.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + } else { + // Android < 10 - standardowe uprawnienia + if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + toRequest.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + } + + if (toRequest.size() > 0) { + String[] arr = toRequest.toArray(new String[0]); + ActivityCompat.requestPermissions(this, arr, REQUEST_APP_PERMISSIONS); + return false; + } + return true; + } + + /** + * Przeniesiona część inicjalizacji, która ma się wykonać po przyznaniu uprawnień lub jeśli już są przyznane. + */ + private void setupUIAndLogic() { + // ensure default prefs exist (do not tie to permission) + Context context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + Editor e = prefs.edit(); + if (!prefs.contains("dir")) { + e.putString("dir", Environment.getExternalStorageDirectory()+ "/dedal/init"); + } + e.putBoolean("tablet", true); + e.putInt("refresh", 2); + e.apply(); + + // READ_PHONE_STATE (only if really needed) + int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE); + if (permissionCheck != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE); + return; + } + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { +// if (Settings.System.canWrite(ListActivity.this )) { +// // Do stuff here +// Log.d( "ttt","ttt"); +// } +// else { +// Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS); +// intent.setData(Uri.parse("package:" + this.getPackageName() )); +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// startActivity(intent); +// } +// } + //Log.d("my_debug", "oncreate, id_profilu: "+id_profilu); + //Context context = getApplicationContext(); + //prefs = PreferenceManager.getDefaultSharedPreferences(context); +// if( prefs.getString("dir","").equals("")){ +// // call preferences / login dialog. +// Intent i = new Intent(this, getPreferActivity()); +// startActivityForResult(i, SHOW_PREFERENCES); +// } +// Log.setFileName(prefs.getString("dir", Environment.getExternalStorageDirectory()+ "/likesoftdemo")); + + //this.getExternalFilesDir() + //getExternalFilesDir(null) + Log.setFileName(prefs.getString("dir", Environment.getExternalStorageDirectory()+ getDefaultFolder())); + Log.setEH(); + + //Editor e = prefs.edit(); + File d = new File( prefs.getString("dir", "")); + if( !prefs.getString("dir", "").equals("")){ + if( !d.isDirectory()){ + d.mkdirs(); + } + if( !d.isDirectory()){ + Toast.makeText(context, "nie udalo się utworzyć katalogu do zapisu", Toast.LENGTH_LONG); + } + } + Log.d(LOG, "work directory: " +d.getAbsolutePath()); + if( ! getDefaultHost().equals("")){ + Log.d(LOG, "hostname=" + prefs.getString("hostname", "") + ", ustawiam default: " + getDefaultHost()); + e.putString("hostName", getDefaultHost()); + } + e.commit(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + + + + gps = new GPSTracker(this); + gps.getLocation(); + + // check if GPS enabled + if(gps.canGetLocation() && gps.isGPSEnabled){ + + latitude = gps.getLatitude(); + longitude = gps.getLongitude(); + //Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show(); + Log.d(LOG, "Your Location is - \nLat: " + latitude + "\nLong: " + longitude + ", liczba satelitow: " + gps.liczbaSatelitow); + }else{ + // can't get location + // GPS or Network is not enabled + // Ask user to enable GPS/network in settings + gps.showSettingsAlert(); + } + + //Context context = getApplicationContext(); + + PackageInfo pinfo; + try { + pinfo = getPackageManager().getPackageInfo(getPackageName(), 0); + versionNumber = pinfo.versionCode; + versionName = pinfo.versionName; + } catch (NameNotFoundException e2) { + Log.e(LOG, "", e2); + } + + +// Intent service = new Intent(context, DedalService.class); +// context.startService(service); + + + +// RelativeLayout rl = new RelativeLayout(this); + + + LinearLayout rl = new LinearLayout(this); + + rl.setOrientation(LinearLayout.VERTICAL); + //rl.setLayoutParams(LayoutParams.WRAP_CONTENT); + //rl.setMinimumWidth() + //TextView tw = new TextView(this); +// tw.setText("Lista zleceń."); +// tw.setLayoutParams(LayoutParams.WRAP_CONTENT); +// rl.addView(tw); +// tw = new TextView(this); + //tw.setText(" Wersja aplikacji:" + versionName );//+ ", :"+ versionNumber); + setTitle("mDedal - Wersja aplikacji: " + versionName ); + //rl.addView(tw); + + Button headers = new Button(this); + headers.setText("Z"); + headers.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + + Log.d("my_debug", "id_profilu: "+id_profilu); + + Intent intent = new Intent(ListActivity.this, getTableHeadersActivity()); + intent.putExtra("id_profilu", id_profilu); + startActivity(intent); + } + }); + + Button calendar_btn = new Button(this); + calendar_btn.setText("K"); + calendar_btn.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + + //Log.d("my_debug", "id_profilu: "+id_profilu); + + Intent intent = new Intent(ListActivity.this, getCalendarActivity()); + intent.putExtra("id_profilu", id_profilu); + startActivity(intent); + } + }); + + HorizontalScrollView scrollFilter = new HorizontalScrollView(this); + //scrollFilter + rl.addView(scrollFilter); + +// LinearLayout maniLin = new LinearLayout(this); +// maniLin.setOrientation(LinearLayout.VERTICAL); +// scrollFilter.addView(maniLin); + + LinearLayout filterL = new LinearLayout(this); + filterL.setOrientation(LinearLayout.HORIZONTAL); + + //rl.addView( filterL); + scrollFilter.addView( filterL); + + filterL.addView(headers); + filterL.addView(calendar_btn); + + Spinner spin = new Spinner(this); + spinProfil = spin; + filterL.addView(spin); + + Spinner spin_folder = new Spinner(this); + spinFolder = spin_folder; + filterL.addView(spin_folder); + + Button nowy_folder_button = new Button(this); + nowy_folder_button.setText("+"); + nowy_folder_button.setOnClickListener(new EditFolderOnClickListener()); + filterL.addView(nowy_folder_button); + + textGPSMod = new TextView(this); + textGPSMod.setPadding(20, 0, 20, 0); + textGPSMod.setTextAppearance(this, R.style.OpisTextLista); + filterL.addView(textGPSMod); + + //////////////////////////////// + rlat = new RefreshLayoutAndThread(this) { +// @Override +// protected void reloadContent() { +// wyswietlListe(); +// } + @Override + protected void whenThreadNeedToReaoad() { + try { + //Log.d("my_debug", "tera123; "); + int pos = spinProfil.getSelectedItemPosition(); + int pos_folder = spinFolder.getSelectedItemPosition(); + String idProfilu = "EMPTY"; + String idFolder = "Wszystkie"; + if( profileIds.size()>pos && pos >=0){ + idProfilu =profileIds.get(pos); + } + if ( folderIds.size() > pos_folder && pos_folder >= 0 ) { + idFolder = Integer.toString(folderIds.get(pos_folder)); + } + + String sJson = DedalHelper.getFileContent(prefs.getString("dir", "") + "/baza/lista.profil"); + JSONObject jFile = new JSONObject(sJson); + loadFromJson( jFile); + + Log.d("my_debug", "id_profilu w watku: " + id_profilu); + String idProfiluNew = "Nowy"; + if( profileIds.size()>pos && pos >=0){ + idProfiluNew =profileIds.get(pos); + } + if( idProfilu.equals(idProfiluNew)){ + spinProfil.setSelection(pos); + }else{ + spinProfil.setSelection(0); + } + + String idFolderNew = "Nowy"; + if ( folderIds.size() > pos_folder && pos_folder >= 0 ) { + idFolderNew = Integer.toString(folderIds.get(pos_folder)); + } + if( idFolder.equals(idFolderNew)){ + spinFolder.setSelection(pos_folder); + }else{ + spinFolder.setSelection(0); + } + + wyswietlListe(); + +// } catch (FileNotFoundException e) { +// Log.e(LOG, "", e); + } catch (JSONException e) { + Log.e(LOG, "", e); +// } catch (IOException e) { +// Log.e(LOG, "", e); + } + } + @Override + protected void setLastGPSInfo_abstr() { + setLastGPSInfo(); + } + }; //new RefreshLayoutAndThread(getApplicationContext()); + LinearLayout refreshLayout = rlat.getRefreshLayout(); + filterL.addView(refreshLayout); + /////////////////////////// + + Resources res = getResources(); +// if( "1".equals(res.getString(R.string.Portret))){ + + if( true ){ + filterL = new LinearLayout(this); + filterL.setOrientation(LinearLayout.HORIZONTAL); + scrollFilter = new HorizontalScrollView(this); + //scrollFilter + rl.addView(scrollFilter); + scrollFilter.addView( filterL); + } + + SearchView searchView = new SearchView(this); + searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default + searchView.setQueryHint("Wpisz szukane słowo"); + + searchView.setOnQueryTextListener(new OnQueryTextListener() { + + + @Override + public boolean onQueryTextSubmit(String query) { + // TODO Auto-generated method stub + Context context = getApplicationContext(); + Toast.makeText(context, + "szukaj słowa : " + query, + Toast.LENGTH_LONG).show(); + search = query; + wyswietlListe(); + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + // TODO Auto-generated method stub + search = newText; //nie dzia�a + return false; + } + }); + + filterL.addView(searchView); + checkZaakceptowane = new ToggleButton(this); + checkZaakceptowane.setTextOff("Wszystkie zlecenia"); + checkZaakceptowane.setTextOn("Schowane zakończone"); + checkZaakceptowane.setChecked(isCheckedZaakceptowane); + checkZaakceptowane.setOnCheckedChangeListener(new OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, + boolean isChecked) { + isCheckedZaakceptowane = isChecked; + curPage = 0; + wyswietlListe(); + + } + }); + filterL.addView(checkZaakceptowane); + + + // todo: temp commented +// textUpload = new TextView(this); +// textUpload.setPadding(20, 0, 20, 0); +// filterL.addView(textUpload); + TextView textUpload = rlat.getTextUpload(); + filterL.addView(textUpload); + +// filterL = new LinearLayout(this); +// filterL.setOrientation(LinearLayout.HORIZONTAL); +// rl.addView( filterL); + + Button bPrev = new Button(this); + bPrev.setText("<<"); + bPrev.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + + Log.d("my_debug", "page: "+curPage); + if( curPage >0){ + curPage--; + wyswietlListe(); + } + } + }); + filterL.addView(bPrev); +// + tIlosc = new TextView(this); + tIlosc.setText("strona " + (curPage+1) );//+ "/" +(linesCount/linesPerPage+1) ); + filterL.addView(tIlosc); + + Button bNext = new Button(this); + bNext.setText(">>"); + bNext.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + + Log.d("my_debug", "page: "+curPage); + if( curPage < linesCount/linesPerPage){ + curPage++; + wyswietlListe(); + } + } + }); + filterL.addView(bNext); + + Button bClearFilters = new Button(this); + bClearFilters.setText("Czyść filtry"); + bClearFilters.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + filterColumns.reset(); + + Log.d("my_debug", "bClearFilters onclick"); + wyswietlListe(); + } + }); + filterL.addView(bClearFilters); + + Button bShowKP = new Button(this); + bShowKP.setText("KP"); + bShowKP.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(ListActivity.this, getKPActivity()); + intent.putExtra("id_profilu", id_profilu); + startActivity(intent); + } + }); + filterL.addView(bShowKP); + + Button bKPWplaty = new Button(this); + bKPWplaty.setText("Wpłaty KP"); + bKPWplaty.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(ListActivity.this, getKPWplatyActivity()); + intent.putExtra("id_profilu", id_profilu); + startActivity(intent); + } + }); + filterL.addView(bKPWplaty); + + setLastGPSInfo(); + // todo: temp commented, should be: rlat->setLastUpdateInfo(); + rlat.setLastUpdateInfo(); + + + File fLockLogin = new File(prefs.getString("dir", "") + "dedalsrv.wrongLogin"); + if(fLockLogin.exists() || checkIfFirstLogin()){ + Intent i = new Intent(this, getPreferActivity()); + startActivityForResult(i, SHOW_PREFERENCES); + } + //setLastUpdateInfo(); + + + ////////////////// + //Thread t =new Thread(rlat); + rlat.start(); + ////////////////////// + + HorizontalScrollView hs = new HorizontalScrollView(this); + rl.addView(hs); + + ScrollView sw = new ScrollView(this); + hs.addView(sw); + LinearLayout lla = new LinearLayout(this); + //lla.setFocusableInTouchMode(false); + listaLayout = lla; +// ll.setId(1001); + lla.setOrientation(LinearLayout.VERTICAL); +// lla.setPadding(15, 3, 15, 5); + lla.setBackgroundColor(Color.parseColor("#FFA500")); + sw.addView(lla); + + + folderNazwy = new ArrayList(); + folderIds = new ArrayList(); + folderNazwyForOrders = new ArrayList(); + folderIdsForOrders = new ArrayList(); + + folderNazwy.add( "Wszystkie" ); + folderIds.add( -1 ); + folderNazwyForOrders.add( "Nie wybrano" ); + folderIdsForOrders.add( 0 ); + + + // File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + + + Log.d(LOG, "Wczytywanie listy start."); + try { + String sJson = DedalHelper.getFileContent(prefs.getString("dir", "") + "/baza/lista.profil"); + + if( sJson!= null && sJson.length()>0) { + JSONObject jFile = new JSONObject(sJson); + loadFromJson(jFile); + Log.d("my_debug", "przed set id_porfilu, profileIds.size():" + profileIds.size() + ", id_profilu: " + id_profilu); + if (profileIds != null && profileIds.size() > 0 && id_profilu != null && !"0".equals(id_profilu)) { + Log.d("my_debug", "first if"); + int pos = -1; + for (int i = 1; i < profileIds.size(); i++) { + Log.d("my_debug", "petla. i: " + i + ", profileIds.get(i): " + profileIds.get(i) + ", id_profilu: " + id_profilu); + if (profileIds.get(i) == id_profilu) { + pos = i; + break; + } + } + if (pos > -1) { + spinProfil.setSelection(pos); + } + } + } + +// } catch (FileNotFoundException e1) { +// // TODO Auto-generated catch block +// e1.printStackTrace(); + } catch (JSONException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); +// } catch (IOException e1) { +// // TODO Auto-generated catch block +// e1.printStackTrace(); + } + Log.d(LOG, "Wczytywanie listy JSON zakonczone."); + +// //Profile +// jProfiles = jFile.getJSONObject("profile"); +// Iterator pKeys = jProfiles.keys(); +// while( pKeys.hasNext()){ +// String idProfilu = (String)pKeys.next(); +// JSONObject jProfil = jProfiles.getJSONObject(idProfilu); +// items.add( jProfil.getString("nazwa_profilu")); +// profileIds.add( idProfilu); +// } +// +// ArrayAdapter aa = new ArrayAdapter( +// this, +// android.R.layout.simple_spinner_item, +// items.toArray()); +// +// aa.setDropDownViewResource( +// android.R.layout.simple_spinner_dropdown_item); +// +// spin.setOnItemSelectedListener(new CustomOnItemSelectedListener()); +// spin.setAdapter(aa); +// +// // kkuz: FOLDERY +// JSONObject jFolders = jFile.getJSONObject("foldery"); +// Iterator pKeys2 = jFolders.keys(); +// +// folderNazwy.add( "Nie wybrano" ); +// folderIds.add( 0 ); +// +// while( pKeys2.hasNext()){ +// String idFolder = (String)pKeys2.next(); +// JSONObject jFolder = jFolders.getJSONObject(idFolder); +// //Log.d("my_debug","nazwa1: "+jFolder.getString("nazwa")); +// folderNazwy.add( jFolder.getString("nazwa")); +// folderIds.add( jFolder.getInt("id_folder") ); +// +// folderNazwyForOrders.add( jFolder.getString("nazwa")); +// folderIdsForOrders.add( jFolder.getInt("id_folder") ); +// } +// +// } +// +// } catch (FileNotFoundException e1) { +// Log.e(LOG, "", e1); +// } catch (JSONException fe) { +// Log.e(LOG, "", fe); +// } catch (IOException ie) { +// Log.e(LOG, "", ie); +// } +// +// ArrayAdapter aa_foldery = new ArrayAdapter( +// this, +// android.R.layout.simple_spinner_item, +// folderNazwy.toArray()); +// +// aa_foldery.setDropDownViewResource( +// android.R.layout.simple_spinner_dropdown_item); +// spinFolder.setAdapter(aa_foldery); +// spinFolder.setOnItemSelectedListener(new CustomOnFolderSelectedListener()); + + Log.d("my_debug", "wyswietl_liste w oncreate"); + wyswietlListe(); + + rl.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); + rl.setFocusableInTouchMode(true); + + rl.setOnDragListener(new MyDragListenerBack()); + setContentView(rl); + + } + + private void loadFromJson( JSONObject jFile){ + Log.d("my_debug", "loadFromJson"); + + folderNazwy = new ArrayList(); + folderIds = new ArrayList(); + folderNazwyForOrders = new ArrayList(); + folderIdsForOrders = new ArrayList(); + + folderNazwy.add( "Wszystkie" ); + folderIds.add( -1 ); + folderNazwyForOrders.add( "Nie wybrano" ); + folderIdsForOrders.add( 0 ); + + final String DEFAULT_PROFILE_NAME = "Inspektor-Windykacja"; + + try{ + + // PROFILE + jProfiles = jFile.getJSONObject("profile"); + Iterator pKeys = jProfiles.keys(); + items = new ArrayList(); + profileIds = new ArrayList(); + Integer set_selection_default = null; + for( int i = 0 ; pKeys.hasNext() ; i++ ){ + String idProfilu = (String)pKeys.next(); + JSONObject jProfil_ = jProfiles.getJSONObject(idProfilu); + String nazwa_profilu = jProfil_.getString("nazwa_profilu"); + if( DEFAULT_PROFILE_NAME.equals(nazwa_profilu) ) { + id_profilu = idProfilu; + jProfil = jProfil_; + set_selection_default = i; + } + items.add(nazwa_profilu); + profileIds.add( idProfilu); + } + + ArrayAdapter aa = new ArrayAdapter( + this, + android.R.layout.simple_spinner_item, + items.toArray()); + + aa.setDropDownViewResource( + android.R.layout.simple_spinner_dropdown_item); + + spinProfil.setOnItemSelectedListener(new CustomOnItemSelectedListener()); + spinProfil.setAdapter(aa); + + // DEFAULT + if( set_selection_default != null && set_selection_default >= 0 ) { + spinProfil.setSelection(set_selection_default); + } + + // kkuz: FOLDERY + JSONObject jFolders = null; + //Log.d(LOG, "Lista: " + jFile.toString()); +// if( !jFile.has("foldery") || "null".equals(jFile.getString("foldery")) ) { +// //Log.d("my_debug", "new json"); +// jFolders = new JSONObject(); +// jFile.put("foldery", jFolders); +// } + // dkuz: poprawka jakiś błąd z generacją, przychodzi pusta tabela z serwera. + jFolders = jFile.optJSONObject("foldery"); + if( jFolders == null){ + jFolders = new JSONObject(); + jFile.put("foldery", jFolders); + } + + + //jFolders = jFile.getJSONObject("foldery"); + //JSONArray jFolders = jFile.getJSONArray("foldery"); + Iterator pKeys2 = jFolders.keys(); + + folderNazwy.add( "Nie wybrano" ); + folderIds.add( 0 ); + //if_profilu; + //String i = id_profilu; + //HashMap temp = new HashMap(); + +// HashMap temp = count_orders_per_folder(jFile, id_profilu); +// Log.d("my_debug", "temp: "+temp); + while( pKeys2.hasNext()){ + String idFolder = (String)pKeys2.next(); + JSONObject jFolder = jFolders.getJSONObject(idFolder); + //Log.d("my_debug","nazwa1: "+jFolder.getString("nazwa")); +// Integer count = 0; +// if( !"null".equals(idFolder) && temp.get(Integer.parseInt(idFolder)) != null ) { +// count = temp.get(Integer.parseInt(idFolder)); +// } + folderNazwy.add( jFolder.getString("nazwa") ); //+", "+count ); + folderIds.add( jFolder.getInt("id_folder") ); + + folderNazwyForOrders.add( jFolder.getString("nazwa")); + folderIdsForOrders.add( jFolder.getInt("id_folder") ); + } + +// if( jFolders!= null && jFolders.length()>0){ +// for ( int i=0; i count_orders_per_folder(String id_profilu) { + Log.d("my_debug", "count_orders_per_folder"); + HashMap temp = new HashMap(); + try { + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + if( dLista.isFile()){ + String sJson = DedalHelper.getFileContent(prefs.getString("dir", "") + "/baza/lista.profil"); + JSONObject jFile = new JSONObject(sJson);//buf.readLine()); + JSONObject jProfiles = jFile.getJSONObject("profile"); + Iterator pKeys = jProfiles.keys(); + //Boolean break_ = false; + int count_all = 0; + while( pKeys.hasNext()){ + String idProfilu = (String)pKeys.next(); + //Log.d("my_debug", "idProfil: "+idProfilu+", id_profilu: "+id_profilu); + if( idProfilu.equals(id_profilu) ) { + JSONObject jProfil = jProfiles.getJSONObject(idProfilu); + JSONObject jZlecenia = jProfil.getJSONObject("zlecenia"); + Iterator pKeys2 = jZlecenia.keys(); + while( pKeys2.hasNext() ){ + String id_zlecenia_curr = (String)pKeys2.next(); + JSONObject jZlecenie = jZlecenia.getJSONObject(id_zlecenia_curr); + //Log.d("my_debug", "id_folder_curr: "+jZlecenie.getString("id_folder")); + int id_folder_curr = 0; + if( !"null".equals(jZlecenie.getString("id_folder")) ) { + id_folder_curr = jZlecenie.getInt("id_folder"); + } + int count = 0; + if( temp.get(id_folder_curr) != null ) { + count = temp.get(id_folder_curr); + } + count++; + //Log.d("my_debug", id_folder_curr+ ", put count:"+count); + temp.put(id_folder_curr, count ); + + count_all++; + temp.put(-1, count_all ); + } + } +// if( break_ ) { +// break; +// } + } +// } + + + } + } catch (JSONException e) { + Log.e(LOG, "", e); +// } catch (FileNotFoundException e) { +// // TODO Auto-generated catch block +// Log.e(LOG, "", e); +// } catch (IOException e) { +// // TODO Auto-generated catch block +// Log.e(LOG, "", e); + } + return temp; + } + + //String sLastInfo = ""; +/////// + +///////// + private void setLastGPSInfo(){ + //gps.isGPSEnabled + //gps.getLocation(); + latitude = gps.getLatitude(); + longitude = gps.getLongitude(); + + textGPSMod.post(new Runnable() { + @Override + public void run() { + if( !gps.isGPSEnabled){ + textGPSMod.setText("GPS!" ); + textGPSMod.setTextColor(Color.RED); + }else{ + textGPSMod.setText("GPS\n("+gps.liczbaSatelitow+")"); //+gps.isGPSEnabled +// + " pozycja \nx:"+latitude + ", y:"+longitude); + textGPSMod.setTextColor(Color.BLACK); + } + } + }); + + + } +// private int licznikUpdates=0; +// //private static String kreciolek[] = new String[]{"|", "/", "-", "\\"}; +// private String sAktualizacja = ""; +/////////// + +//////////// +//TableLayout + private void wyswietlListe(){ + + if( listaLayout!= null) { + listaLayout.removeAllViews(); + TextView tw = new TextView(this); + if( id_profilu != null) { + tw.setText("Trwa wczytywanie listy zleceń.. " );//+ id_profilu); + }else{ + //zaloguj się. + tw.setText("Zaloguj się." ); +// Intent i = new Intent(ListActivity.this, getPreferActivity()); +// startActivityForResult(i, SHOW_PREFERENCES); + } + Log.d("my_debug", "id_profilu w wyswietlListe: "+id_profilu); + tw.setTextSize(26); + listaLayout.addView(tw); + if( jProfil != null){ + + listaLayout.post(new Runnable() { + + @Override + public void run() { + JSONArray jKolumny; + try { + jKolumny = jProfil.getJSONArray("profil_kolumny"); + JSONObject jZlecenia= new JSONObject(jProfil.getString("zlecenia")); + listaLayout.removeAllViews(); + wyswietlListe( listaLayout, jZlecenia, jKolumny); + } catch (JSONException e) { + //Log.e(LOG, "", e); + listaLayout.removeAllViews(); + TextView tw = new TextView(ListActivity.this); + tw.setText("Brak zleceń"); + tw.setTextSize(26); + listaLayout.addView(tw); + + } + + } + }); + } + } + + } + private void wyswietlListe(LinearLayout lla, JSONObject jZlecenia, JSONArray jKolumny) + throws JSONException { + // obsługa nulla + if (jZlecenia == null) { + lla.removeAllViews(); + TextView tw; + tw = new TextView(this); + tw.setText("Błąd pobierania danych. Sprawdź połączenie z internetem."); + lla.addView(tw); + + } else {// obsługa nulla + //////// ilość zleceń w folderze + HashMap temp = count_orders_per_folder(id_profilu); + Log.d("my_debug", "temp: " + temp); + ArrayList folderNazwy_loc = new ArrayList(); + for (int k = 0; k < folderIds.size(); k++) { + int id_folderu = folderIds.get(k); + String count = ", 0"; + //Log.d("my_debug", "id_folderu: "+id_folderu); + if (temp.get(id_folderu) != null) { + count = ", " + temp.get(id_folderu); + } + + folderNazwy_loc.add(folderNazwy.get(k) + count); + } + ArrayAdapter aa_1 = new ArrayAdapter( + this, + android.R.layout.simple_spinner_item, + folderNazwy_loc.toArray()); + + aa_1.setDropDownViewResource( + android.R.layout.simple_spinner_dropdown_item); + //spinFolder.setOnItemSelectedListener(null); + if (id_folder == -1) { + spinFolder.setAdapter(aa_1); + } + spinFolder.setOnItemSelectedListener(new CustomOnFolderSelectedListener()); + ///////// + + Iterator keys = jZlecenia.keys(); + + + TableLayout tl = new TableLayout(this); + tl.setPadding(0, 15, 0, 0); + //tl.setGravity(Gravity.TOP); + lla.addView(tl); + names = new ArrayList(); + TableRow tr = new TableRow(this); + // tr.setPadding(5, 10, 5, 10); + + // tr.setBackgroundColor(Color.parseColor("#FAFAD2"));// #FAFAD2 + TextView tw; + tw = new TextView(this); + tw.setText("Data \nzapisu"); + tw.setPadding(5, 3, 5, 2); + tr.addView(tw); + + for (int k = 0; k < jKolumny.length(); k++) { + MTextView mtw = new MTextView(this); + mtw.setTextAppearance(this, R.style.OpisText); + String kod = jKolumny.getJSONObject(k).getString("kod"); + mtw.setCode(kod); + String nazwa = jKolumny.getJSONObject(k).getString("nazwa"); + + int j = filterColumns.getIndexOfCode(kod); + if (j >= 0) { + mtw.setTextColor(Color.RED); + int bSortASC = filterColumns.getBSortASC(j); + int lp = j + 1; + nazwa = nazwa + " | " + lp + "."; + if (bSortASC > 0) { + nazwa = nazwa + " [/\\]"; + + } else if (bSortASC < 0) { + nazwa = nazwa + " [\\/]"; + } + } + /* + if( kod.equals(sortCol)){ + mtw.setTextColor(Color.RED); + if( bSortASC>0){ + nazwa = nazwa + " [/\\]"; + + }else{ + nazwa = nazwa + " [\\/]"; + } + } + */ + + // + mtw.setText(nazwa); + //tw.setBackgroundColor(Color.parseColor("#AFA5F0"));// #FAFAD2 + mtw.setPadding(5, 3, 5, 2); + // tw.setTextSize(TypedValue.COMPLEX_UNIT_MM, 5); + mtw.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (v instanceof MTextView) { + MTextView mtw = (MTextView) v; + + // wyswietl dialog filtrowania/sortowania + + wyswietlFiltrKolumny(mtw.getCode()); + + // bSortASC *=-1; + // sortCol = mtw.getCode(); + + // wyswietlListe(); + } + + } + + }); + tr.addView(mtw); + + } + + MTextView mtw_folder = new MTextView(this); + mtw_folder.setTextAppearance(this, R.style.OpisText); + mtw_folder.setText("Grupa"); + //tw.setBackgroundColor(Color.parseColor("#AFA5F0"));// #FAFAD2 + mtw_folder.setPadding(5, 3, 5, 2); + tr.addView(mtw_folder); + + tl.addView(tr); + + ArrayList aM = new ArrayList(); + + //Log.d("ListActivity", "Kolumna sortowania: "+ sortCol + ", bSortASC:"+ bSortASC); + + + while (keys.hasNext()) { + + String id = (String) keys.next(); + JSONObject jZlecenie = jZlecenia.getJSONObject(id); + if ((id_folder > 0 && jZlecenie.has("id_folder") && !jZlecenie.getString("id_folder").equals("null") && jZlecenie.getInt("id_folder") == id_folder) || + (id_folder == 0 && jZlecenie.getString("id_folder").equals("null")) || + id_folder == -1) { + if (isCheckedZaakceptowane) { + //JSONObject p = jZlecenie.getJSONObject("param"); + String status = jZlecenie.getString("status"); + if (!"wykonane_zaak".equals(status)) { + aM.add(jZlecenie); + } + } else + aM.add(jZlecenie); + } + } + + boolean do_normal = true; + //Log.d("my_debug", "łojojojoj"); + if (id_folder > 0) { + File dtemp = new File(prefs.getString("dir", "") + "/temp/kolejnosc_foldery_" + id_folder + ".json"); + JSONArray jkolejnosc_zlecen; + if (dtemp.exists()) { + String sJson = DedalHelper.getFileContent(dtemp.getAbsolutePath()); + JSONObject jFile = new JSONObject(sJson); + if (jFile.has("kolejnosc")) { + jkolejnosc_zlecen = jFile.getJSONArray("kolejnosc"); + if (jkolejnosc_zlecen != null) { + //Log.d("my_debug", "jkolejnosc_zlecen: "+jkolejnosc_zlecen.toString()); + Collections.sort(aM, new MyComparator_sortInFolder(jkolejnosc_zlecen)); + do_normal = false; + } + } + //Log.d("my_debug", "1: "+jKolumny.toString()); + } else { + //if(aM) + //Log.d("my_debug", "nie ma pliku"); + Collections.sort(aM, new Comparator() { + @Override + public int compare(JSONObject lhs, JSONObject rhs) { + // TODO Auto-generated method stub + try { + //Log.d("my_debug", "sortuje po serwerze"); + if (lhs.has("kolejnosc_w_folderze") && !lhs.getString("kolejnosc_w_folderze").equals("null") && + rhs.has("kolejnosc_w_folderze") && !rhs.getString("kolejnosc_w_folderze").equals("null")) { + //Log.d("my_debug", "kol w fol: "+lhs.getInt("kolejnosc_w_folderze")+"|"+rhs.getInt("kolejnosc_w_folderze")); + if (lhs.getInt("kolejnosc_w_folderze") < rhs.getInt("kolejnosc_w_folderze")) { + return -1; + } else { + return 1; + } + } else { + return 0; + } + } catch (JSONException e) { + Log.e(LOG, "", e); + } + return 0; + } + }); + do_normal = false; + } + } + if (do_normal) { + Log.d("my_debug", "do normal"); + Collections.sort(aM, new Comparator() { + @Override + public int compare(JSONObject lhs, JSONObject rhs) { + // TODO Auto-generated method stub + try { + boolean do_default = false; + if (filterColumns.getSize() > 0) { + int comp_val = 0; + for (int i = 0; i < filterColumns.getSize(); i++) { + String sortCol = filterColumns.getSortCol(i); + int bSortASC = filterColumns.getBSortASC(i); + comp_val = lhs.getString(sortCol).compareTo(rhs.getString(sortCol)) * bSortASC; + if (comp_val == 0) { + continue; + } else { + return comp_val; + } + } + return comp_val; + + } else { + do_default = true; + } + + if (do_default) { + if (lhs.has(DEFAULT_SORT_COL) && rhs.has(DEFAULT_SORT_COL)) { + return lhs.getString(DEFAULT_SORT_COL).compareTo(rhs.getString(DEFAULT_SORT_COL)) * (-1); + } + return 0; + } + + } catch (JSONException e) { + } + return 0; + } + }); + } + + // wyswietl_tabele_zlecen(jKolumny, tl, aM); + Thread wt = new Thread(new MyTabelaThread(jKolumny, tl, aM)); + wt.start(); + + if (id_folder > 0) { + Button b = new Button(ListActivity.this); + b.setText("Zapisz kolejność na serwerze"); + b.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + Date d = new Date(); + String genName = "kolejnosc_foldery_" + d.getTime() + ".mod"; + File dstDir = new File(prefs.getString("dir", "") + "/upload_kolejnosc_foldery_mod"); + if (!dstDir.isDirectory()) { + dstDir.mkdirs(); + } + File dtemp = new File(prefs.getString("dir", "") + "/temp/kolejnosc_foldery_" + id_folder + ".json"); + if (dtemp.exists()) { + JSONObject jFile; + try { + String sJson = DedalHelper.getFileContent(dtemp.getAbsolutePath()); + jFile = new JSONObject(sJson); + jFile.put("id_folder", id_folder); + + DedalHelper.putFileContent(prefs.getString("dir", "") + "/upload_kolejnosc_foldery_mod/" + genName, jFile.toString()); + + } catch (JSONException e) { + Log.e(LOG, "", e); + } + } + // wystartuj/obudz serwis + Context context = getApplicationContext(); + Intent service = new Intent(context, DedalService.class); + context.startService(service); + } + }); + LinearLayout llb = new LinearLayout(this); + llb.setOrientation(LinearLayout.HORIZONTAL); + llb.addView(b); + listaLayout.addView(llb); + + } + spinProfil.setFocusable(true); + spinProfil.requestFocus(); + + } // obsługa nulla + } + private void wyswietl_tabele_zlecen(JSONArray jKolumny, TableLayout tl, + ArrayList aM) throws JSONException { + TextView tw; + int i = 0; + trId_id_zlecenia.clear(); +// int limit = 0; + int poczatkowy = linesPerPage * curPage; + int koncowy = linesPerPage * (curPage+1); + + for( int z=0; z= koncowy ){ + i++; + continue; + } + + +// wyswietl_wierszTR(tl, jKolumny, jZlecenie, i); + tl.post(new MyWiersTRThread(tl, jKolumny, jZlecenie, i%linesPerPage)); + + if( i%10 == 0){ + try { + Thread.sleep(50); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + i++; + } + linesCount = i; + //wyswietl_linie_konca(tl); + tl.post(new Wyswietl_linie_konca_Thread(tl)); + } + private void wyswietl_linie_konca(TableLayout tl) { + TextView tw; + TableRow tr = new TableRow(this); + tr.setPadding(5, 1, 5, 0); + tw = new TextView(this); + tw.setText(" "); + tr.addView(tw); + + tl.addView( tr); + + + tIlosc.setText("strona " + (curPage+1) + " / " +(linesCount/linesPerPage+1)); + } + private void wyswietl_wierszTR(TableLayout tl, JSONArray jKolumny, + JSONObject jZlecenie, int i) throws JSONException { + + String id = jZlecenie.getString("id_zlecenia"); + Integer id_int = jZlecenie.getInt("id_zlecenia"); + + TableRow tr = utworz_wiersz(i, id, id_int); + + TextView tw; + tw = wyswietl_status_zlecenia(id); + tw.setBackgroundColor(Color.LTGRAY); + //sprawdzic, czy uploady nowe są z tego zlecenia + sprawdzUploadyZlecenia(tw, id); + tr.addView(tw); + + wyswietlLinie(jKolumny, tr, jZlecenie); +// tr.post(new MyWyswietlLinieThread(jKolumny, tr, jZlecenie)); + + tr.setPadding(5, 1, 5, 0); + tl.addView(tr); + } + + private TableRow utworz_wiersz(int i, String id, Integer id_int) { + TableRow tr; + tr = new TableRow(this); + tr.setId(i); + trId_id_zlecenia.put(i, id_int); + maxId = i; + tr.setGravity(Gravity.CENTER_VERTICAL); +// tr.setBackgroundColor(Color.parseColor("#FAFAD2"));// #FAFAD2 + ustawClickListener(tr); + + if( names == null ) { + names = new ArrayList(); + } + + names.add(id + ".json"); + return tr; + } + private TextView wyswietl_status_zlecenia(String id) { + + File file = new File(prefs.getString("dir", "") + "/baza/" + id + ".json"); + Date date = new Date(file.lastModified()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd \nHH:mm:ss"); + File fileMod = new File(prefs.getString("dir", "") + "/baza/" + id + ".mod"); + + TextView tw; + tw = new TextView(this); + tw.setText(sdf.format(date)); + tw.setTextAppearance(this, R.style.OpisTextLista); + + if( fileMod.isFile()){ + tw.setText("Jeszcze nie \nwysłane na serwer!"); + } + return tw; + } + private void wyswietl_foldery(TableRow tr, JSONObject jZlecenie + ) throws JSONException { + + ArrayAdapter aa_foldery = new ArrayAdapter( + this, + android.R.layout.simple_spinner_item, + folderNazwyForOrders.toArray()); + + aa_foldery.setDropDownViewResource( + android.R.layout.simple_spinner_dropdown_item); + + Spinner spin_folder = new Spinner(this); + + int selected_pos = 0; + + spin_folder.setAdapter(aa_foldery); + + //Log.d("my_debug", "tro1"); + for(int pos = 0 ; pos < folderIdsForOrders.size() ; pos++ ) { + //Log.d("my_debug", "id_zlecenia: "+jZlecenie.getString("id_zlecenia")+", pos: "+pos+", folderIds.get(pos): " +folderIds.get(pos)+", jZlecenie.getInt(id_folder): "+jZlecenie.getInt("id_folder")); + if( jZlecenie.getString("id_folder").equals("null") ){ + selected_pos = 0; + } + else if( folderIdsForOrders.get(pos) == jZlecenie.getInt("id_folder") ) { + selected_pos = pos; + break; + } + } + //Log.d("my_debug", "tro2"); + spin_folder.setSelection(selected_pos); + spin_folder.setOnItemSelectedListener(new ChangeZlecenieFolderSelectedListener(jZlecenie)); + + spin_folder.setBackgroundColor(Color.WHITE); + + tr.addView(spin_folder); + + if( id_folder > 0 ) { + + tr.setOnDragListener(new MyDragListener(Color.CYAN, Color.GREEN)); + TextView tw_move = new TextView(this); + tw_move.setText("przesuń"); + tr.addView(tw_move); + tw_move.setOnTouchListener(new MyTouchListener(tr)); + } + + } + + public void showDatePickerDialog(TextView tv, Integer nr_zlecenia, String data_walidacja_do) { + //DialogFragment newFragment = new DatePickerFragment(); + DatePickerFragment newFragment = new DatePickerFragment(); + newFragment.nr_zlecenia = nr_zlecenia; + newFragment.act = this; + newFragment.data_walidacja_do = data_walidacja_do; + newFragment.tv = tv; + //newFragment.show(((FragmentActivity) getActivity()).getSupportFragmentManager(), "datePicker"); + newFragment.show(getFragmentManager(), "datePicker"); + + } + + private static final String DATA_KOD = "nast_wizyta_data"; + private static final String DATA_TYP_KOD = "nast_wizyta_typ"; + + private void wyswietlLinie(JSONArray jKolumny, TableRow tr, + final JSONObject jZlecenie) throws JSONException { + for( int k=0; k< jKolumny.length(); k++) + { + TextView tw = new TextView(this); + tw.setTextAppearance(this, R.style.OpisText); + tw.setBackgroundColor(Color.WHITE);// #FAFAD2 + tw.setPadding(5, 10, 5, 5); + + String kod =jKolumny.getJSONObject(k).getString("kod"); + + if( kod.equals(DATA_KOD)) { + + // sprawdz, czy pierwsza wizyta + //if( pierwsza_wizyta(jKolumny)) + String typ = jZlecenie.getString(DATA_TYP_KOD); + //Log.d("my_debug", "Data wizyty: " +jZlecenie.getString(DATA_KOD)+ ", typ:" + typ); + if( typ==null || typ.equals("") || typ.equals("null") || typ.equals("pierwsza_wizyta") || typ.equals("nastepna_wizyta") ) { + //nast_wizyta_typ + //Log.d("my_debug", "Możliwa edycja daty"); + Integer rowId = tr.getId(); + final Integer nr_zlecenia = trId_id_zlecenia.get(rowId); + tw.setBackgroundColor(Color.YELLOW); + tw.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + String data_obslugi = null; + try { + data_obslugi = jZlecenie.getString("data_obslugi"); + } catch (JSONException e) { + e.printStackTrace(); + } + TextView tv = (TextView)view; + showDatePickerDialog(tv, nr_zlecenia, data_obslugi); + + Log.d("my_debug", "Wybrano edycje daty wizyty nr: " + nr_zlecenia + " po zmianie "); + // wyswietlListe(); + } + }); + } +// else{ +// Toast.makeText(this, "Nie można zmieniać daty tego zlecenia", +// Toast.LENGTH_LONG).show(); +// } + } + + tw.setText(DedalHelper.getValueFromKod(kod, jZlecenie)); + + + tr.addView(tw); + + } + //foldery + wyswietl_foldery(tr, jZlecenie ); + } + + private void sprawdzUploadyZlecenia(TextView tw, String id) { + File dir = new File(prefs.getString("dir", "")); + File dirUpload = new File(dir + "/upload"); + File dirZlecenie = new File(dirUpload + "/"+ id); + if( dirZlecenie.isDirectory()){ + File f[] = dirZlecenie.listFiles(new FilenameFilter() { + public boolean accept(File dir, String name) { + return name.toLowerCase().endsWith(".mod"); + } + }); + if( f.length>0){ + //tw.setText("Jest inna \nmodyfikacja w upload!"); + tw.setText("Wysyłka na \nserwer"); + Log.d("ListActivity", "Jest inna modyfikacja w upload"); + } + } + } + private String getCurDate(){ + Date d = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd"); + return sdf.format(d); + } + + boolean checkIfFirstLogin(){ + //sprawdz, czy pierwsze zalogowanie bylo + boolean firstLogin = false; + File fFirstLogin = new File(prefs.getString("dir", "") + "/dedalsrv.firstLogin"); + if( fFirstLogin.isFile()) { + BufferedReader buf = null; + try { + String sFile = ""; + if (fFirstLogin.exists()) { + buf = new BufferedReader(new FileReader(fFirstLogin)); + sFile = buf.readLine().toLowerCase(); + buf.close(); + } + String curDate = getCurDate(); + if (!sFile.contains(curDate)) { + //return true; + firstLogin = true; + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + //zapisz bieżącą datę do pliku + PrintWriter pw; + try { + pw = new PrintWriter( + new FileWriter(fFirstLogin, false)); + pw.write(getCurDate()); + pw.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return firstLogin; + } + private void ustawClickListener(TableRow tr) { + tr.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + // TODO Auto-generated method stub + v.setBackgroundColor(Color.RED); + if( v instanceof ViewGroup){ + ViewGroup vg = (ViewGroup)v; + int cc = vg.getChildCount(); + for( int i=0; i0){ + String id_zlecenia = ""+id + ".json"; + +// if( id_zlecenia.equals(names.get(cur_id))){ +// // można biezace edytować +// ret = false; +// break; +// } + + +// AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); +// alertDialog.setTitle( "Uwaga");//res.getString(R.string.zakanczanie_wizyty) ); +// alertDialog.setMessage("Posiadasz nieprzerobione stare wizyty.
" + +// " Zaplanuj sprawy na kolejne dni." + +// " Sprawa nr. " + id_zlecenia + " z dnia: "+nast_wizyta_data ); +// alertDialog.setPositiveButton("Anuluj", new DialogInterface.OnClickListener() { +// public void onClick(DialogInterface dialog,int which) { +// //mod_json_files(false); +// dialog.dismiss(); +// } +// }); +// alertDialog.show(); + + if( nr_sprawy!= null){ + message += "nr. sprawy: " + id + " z dnia: " + nast_wizyta_data + "\n"; + }else { + message += "zlecenie nr. " + id + " z dnia: " + nast_wizyta_data + "\n"; + } + + //return; + // ret = true; + //break; + ilosc_nieprzerobionych++; + if( ilosc_nieprzerobionych>=10){ + break; + } + } + } + } + } + if( ilosc_nieprzerobionych>0){ + AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); + alertDialog.setTitle( "Uwaga");//res.getString(R.string.zakanczanie_wizyty) ); +// alertDialog.setMessage("Posiadasz nieprzerobione stare wizyty. Zaplanuj sprawy na kolejne dni"); + alertDialog.setMessage( "Posiadasz nieprzerobione stare wizyty.\n" + + " Zaplanuj sprawy na kolejne dni.\n" + + "wyświetlone pierwsze " + ilosc_nieprzerobionych + " wizyt:\n"+ + message); + alertDialog.setPositiveButton("Anuluj", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + //mod_json_files(false); + dialog.dismiss(); + + Intent intent = new Intent(ListActivity.this, + getMainActivity()); + File f = new File(prefs.getString("dir", "") + + "/baza/" + names.get(cur_id)); + Uri u = Uri.fromFile(f); + intent.setData(u); + intent.putExtra("filename", names.get(cur_id)); + startActivity(intent); + + + } + }); + alertDialog.show(); + ret = true; // blokuj wejście, czekaj na zamknięcie dialogu. + } + + } catch (JSONException e) { + e.printStackTrace(); + } + return ret; + } + + + private final class MyTouchListener implements OnTouchListener { + + TableRow tr; + + public MyTouchListener (TableRow tr) { + this.tr = tr; + } + + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + ClipData data = ClipData.newPlainText("", ""); + //DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); + //view.startDrag(data, shadowBuilder, view, 0); + //view.setVisibility(View.INVISIBLE); + //DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(tr); + MyDragShadowBuilder myShadowBuilder = new MyDragShadowBuilder(tr); + + Point point = new Point(); + point.set(10, 0); + Point point2 = new Point(); + point2.set(300, 20); + //shadowBuilder.onProvideShadowMetrics(point2, point); + //tr.startDrag(data, shadowBuilder, view, 0); + tr.startDrag(data, myShadowBuilder, view, 0); + tr.setVisibility(View.INVISIBLE); + return true; + } else { + return false; + } + } + } + + private static class MyDragShadowBuilder extends View.DragShadowBuilder { + + public MyDragShadowBuilder(View v) { + super(v); + } + + @Override + public void onProvideShadowMetrics (Point size, Point touch){ + int width = getView().getWidth(); + int height = getView().getHeight(); + + size.set(width, height); + touch.set(width-20,10); + } + } + + class MyDragListenerBack implements OnDragListener { + + @Override + public boolean onDrag(View onDropEl, DragEvent event) { + int action = event.getAction(); + View movingEl = (View) event.getLocalState(); + movingEl = ((View)movingEl.getParent()); + switch (event.getAction()) { + case DragEvent.ACTION_DRAG_STARTED: + // do nothing + break; + case DragEvent.ACTION_DRAG_ENTERED: + //v.setBackgroundDrawable(enterShape); + //onDropEl.setBackgroundColor(Color.GRAY); + break; + case DragEvent.ACTION_DRAG_EXITED: + //v.setBackgroundDrawable(normalShape); + //onDropEl.setBackgroundColor(Color.RED); + break; + case DragEvent.ACTION_DROP: + // Dropped, reassign View to ViewGroup + movingEl.setVisibility(View.VISIBLE); + break; + case DragEvent.ACTION_DRAG_ENDED: + //v.setBackgroundDrawable(normalShape); + default: + break; + } + return true; + } + + } + + class MyDragListener implements OnDragListener { + + int color_entered = 0; + int color_exited = 0; + + public MyDragListener(int color_entered, int color_exited) { + this.color_entered = color_entered; + this.color_exited = color_exited; + } + + @Override + public boolean onDrag(View onDropEl, DragEvent event) { + int action = event.getAction(); + View movingEl = (View) event.getLocalState(); + + int side = Math.round(event.getY() - onDropEl.getMeasuredHeight() / 2 ); // side < 0 uposzczone po lewej stronie elementu, side > 0 upuszczone po prawej stronie + switch (event.getAction()) { + case DragEvent.ACTION_DRAG_STARTED: + // do nothing + break; + case DragEvent.ACTION_DRAG_ENTERED: + //v.setBackgroundDrawable(enterShape); + onDropEl.setBackgroundColor(color_entered); + break; + case DragEvent.ACTION_DRAG_EXITED: + //v.setBackgroundDrawable(normalShape); + //onDropEl.setBackgroundColor(color_exited); + onDropEl.setBackgroundColor(0x00000000); + break; + case DragEvent.ACTION_DROP: + // Dropped, reassign View to ViewGroup + + int id_moving = ((View)movingEl.getParent()).getId(); + int id_drop = onDropEl.getId(); + + JSONObject jmain = new JSONObject(); + JSONArray jfolder = new JSONArray(); + // create Json + +// float x = event.getX(); +// float y = event.getY(); + + + Log.d("my_debug", "side: "+side); + + + //try { + for (int i = 0 ; i < 200 ; i++ ) { + + //int tr_id = trIds.get(i); + TableRow v = (TableRow)ListActivity.this.findViewById(i); + if ( v == null) { + break; + } + if( i == id_drop || i == id_moving) { + //if( id_drop < id_moving ) { + if( i == id_drop ) { + //i = id_moving; + TableRow v_temp = null; + //JSONObject jcurr = null; + if(side >= 0 ) { + + v_temp = (TableRow)ListActivity.this.findViewById(id_drop); + jfolder.put(trId_id_zlecenia.get(id_drop)); + + v_temp = (TableRow)ListActivity.this.findViewById(id_moving); + if( v_temp != null ) { + jfolder.put(trId_id_zlecenia.get(id_moving)); + } + } + else { + v_temp = (TableRow)ListActivity.this.findViewById(id_moving); + if( v_temp != null ) { + jfolder.put(trId_id_zlecenia.get(id_moving)); + } + + v_temp = (TableRow)ListActivity.this.findViewById(id_drop); + jfolder.put(trId_id_zlecenia.get(id_drop)); + //jprofil.put(jcurr); + } + } + if( i == id_moving ) { + continue; + } + } + else { + JSONObject jcurr = new JSONObject(); + + jfolder.put(trId_id_zlecenia.get(i)); + } + } + + + + try { + jmain.put("kolejnosc", jfolder); + } catch (JSONException e1) { + Log.e(LOG, "", e1); + } + + Log.d("my_debug", jmain.toString()); + + onDropEl.setBackgroundColor(Color.DKGRAY); + movingEl.setVisibility(View.VISIBLE); + + String genName = "kolejnosc_foldery_"+id_folder+".json"; + File dstDir = new File(prefs.getString("dir", "") + "/temp"); + if( !dstDir.isDirectory()){ dstDir.mkdirs(); } + File fMod = new File(prefs.getString("dir", "") + "/temp/" + genName); + FileOutputStream fos; + try { + fos = new FileOutputStream(fMod); + fos.write(jmain.toString().getBytes()); + fos.flush(); + fos.close(); + } catch (FileNotFoundException e) { + Log.e(LOG, "", e); + } catch (IOException e) { + Log.e(LOG, "", e); + } + //TableHeadersActivity.this.recreate(); + //drawContent(); + wyswietlListe(); + + break; + case DragEvent.ACTION_DRAG_ENDED: + //v.setBackgroundDrawable(normalShape); + default: + break; + } + return true; + } + + } + + + private void wyswietlFiltrKolumny(final String code) { + // TODO Auto-generated method stub + + // checkboxy wartosci + Set wartosci = wczytajWartosciKolumny( code ); + final ArrayList listaCheckbox = new ArrayList(); + + AlertDialog.Builder alertDialog = new AlertDialog.Builder(ListActivity.this); + alertDialog.setTitle( "Filtrowanie/Sortowanie po kolumnie" ); + // alertDialog.setMessage( "Wybierz opcję:" ); + final LinearLayout lDialog = new LinearLayout(ListActivity.this); + lDialog.setOrientation(LinearLayout.VERTICAL); + + final LinearLayout ll = new LinearLayout(ListActivity.this); + ll.setOrientation(LinearLayout.VERTICAL); + + // sortowanie ASC, DESC + RadioGroup rg = new RadioGroup(this); + rg.setOrientation(LinearLayout.HORIZONTAL); + lDialog.addView(rg); + CheckBox cb; + final RadioButton rbBezSortowania = new RadioButton(this); + rbBezSortowania.setText("Bez sortowania"); // todo + rg.addView(rbBezSortowania); + rbBezSortowania.setChecked(true); + final RadioButton rbRosnaco = new RadioButton(this); + rbRosnaco.setText("Rosnąco"); // todo + rg.addView(rbRosnaco); + final RadioButton rbMalejaco = new RadioButton(ListActivity.this); + rbMalejaco.setText("Malejąco"); // todo + rg.addView(rbMalejaco); + + int j = -1; + if( filterColumns.getSize() > 0 ) { + j = filterColumns.getIndexOfCode(code); + if( j >= 0 ) { + //Log.d("my_debug", "sortColArr: "+sortColArr+", code: "+code+", j: "+j+"bSortASCArr.get(j): "+bSortASCArr.get(j)); + if( filterColumns.getBSortASC(j) > 0 ) { + rbRosnaco.setChecked(true); + } else if( filterColumns.getBSortASC(j) < 0 ) { + rbMalejaco.setChecked(true); + } + else { + rbBezSortowania.setChecked(true); + } + } + } + + /* + if( sortCol.equals(code) ){ + if( bSortASC<0){ + + rbRosnaco.setChecked(true); + }else{ + rbMalejaco.setChecked(true); + } + } + */ + + final Button bZaznaczAll = new Button(this); + bZaznaczAll.setText("Wszystko"); + rg.addView(bZaznaczAll); + bZaznaczAll.setOnClickListener(new OnClickListener() { + boolean selected = true; + @Override + public void onClick(View view) { + for (int i = 0; i < listaCheckbox.size(); i++) { + CheckBox cb = listaCheckbox.get(i); + String search = cb.getText().toString(); + cb.setChecked(selected); + } + if( selected){ + bZaznaczAll.setText("Odznacz"); + }else{ + bZaznaczAll.setText("Wszystko"); + } + selected = !selected; + } + }); + + + + // filter input field + EditText tw = new EditText(this); + lDialog.addView(tw); + tw.addTextChangedListener(new TextWatcher() { + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void afterTextChanged(Editable s) { + //setModified(); + String match = s.toString(); + Log.d("my_debug", "after TEXT CHANGED: " + s.toString()); + // + ll.removeAllViews(); + for (int i = 0; i < listaCheckbox.size(); i++) { + CheckBox cb = listaCheckbox.get(i); + String searchTo = cb.getText().toString(); + if( match.length()==0 || searchTo.toLowerCase().contains(match.toLowerCase())) { + ll.addView(cb); + } + + } + +// if( match.length()>0) { +// for (int i = 0; i < listaCheckbox.size(); i++) { +// CheckBox cb = listaCheckbox.get(i); +// String search = cb.getText().toString(); +// if (!search.toLowerCase().contains(match.toLowerCase())) { +// cb.setChecked(false); +// ll.removeView(cb); +// } +// } +// } + //else{ + //} + //Log.d("my_debug", "after TEXT CHANGED"); + + } + }); + + ArrayList filterItems = null; + if( j >= 0 ) { + filterItems = filterColumns.getFilterItems(j); + } + + Iterator it = wartosci.iterator(); + while( it.hasNext()){ + String val = it.next(); + cb = new CheckBox(ListActivity.this); + cb.setText(val); // todo + ll.addView(cb); + listaCheckbox.add(cb); + + if( filterItems != null && filterItems.indexOf(val) >= 0 ) { + cb.setChecked(true); + } + } + + +// cb = new CheckBox(ListActivity.this); +// cb.setText("wartosc 2"); // todo +// ll.addView(cb); + + + // filtr tekstowy + // EditText et = new EditText(ListActivity.this); + // ll.addView(et); + ScrollView sv = new ScrollView(this); + sv.setVerticalScrollBarEnabled(true); + ll.setOrientation(LinearLayout.VERTICAL); + sv.addView(ll); + + lDialog.addView(sv); + + + alertDialog.setView(lDialog); + // alertDialog.setPositiveButton("OK", new New_folder_onlick(et)); + alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + + int bSortASC = 0; + String sortCol = ""; + ArrayList filterItems = new ArrayList(); + + if( rbRosnaco.isChecked()){ + bSortASC = 1; +// sortCol = code; + }else if( rbMalejaco.isChecked()){ + bSortASC = -1; + }else if( rbBezSortowania.isChecked()){ + bSortASC = 0; + } + sortCol = code; + + + for( int i=0; i< listaCheckbox.size(); i++){ + CheckBox cb = listaCheckbox.get(i); + if( cb.isChecked()){ + filterItems.add(cb.getText().toString()); + } + } + + int j = filterColumns.getIndexOfCode(sortCol); //sortColArr.indexOf(sortCol); + if( j >= 0 ) { + filterColumns.setColumn(j, sortCol, bSortASC, filterItems); + } + else { + filterColumns.addColumn(sortCol, bSortASC, filterItems); + Log.d("my_debug", "addRow, filterColumns: "+filterColumns); + } + + dialog.dismiss(); + wyswietlListe(); + + } + }); + + alertDialog.setNegativeButton("Anuluj", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { +// int j = sortColArr.indexOf(code); //DedalHelper.findInArrayList(sortColArr, code); +// if( j >= 0 ) { +// filterItemsArr.set(j, new ArrayList()); +// bSortASCArr.set(j, 0); +// sortColArr.set(j, ""); +// } + + //filterItems = new ArrayList(); + dialog.dismiss(); + wyswietlListe(); + } + }); + alertDialog.show(); + + } + + + String getFormatedValue( JSONObject jZlecenie, String kod) throws JSONException{ + String ret = null; + if( kod.equals("tworca")){ + ret = jZlecenie.getString("tworca_login");//id_tworca + }else if( kod.equals("inspektor")){ + ret = jZlecenie.getString("inspektor_login"); + }else if( kod.equals("info_alert")){ + ret = jZlecenie.getString("data_alert"); + }else if( kod.equals("nr_sprawy-link")){ + ret = jZlecenie.getString("nr_sprawy"); + }else if( kod.equals("status")){ + ret = DedalHelper.getStatusDesc(jZlecenie.getString("status")); + }else if( kod.startsWith("data_")){ + String s = jZlecenie.getString(kod); + if( s.length()>=10){ + String d = jZlecenie.getString(kod).substring(0, 10); + ret = d; + }else{ + ret = s; + } +// +// }else if( kod.equals("")){ +// + }else{ + if( !jZlecenie.isNull(kod)){ + ret = jZlecenie.getString(kod); + } + } + return ret; + } + + private Set wczytajWartosciKolumny(String code) { + JSONObject jZlecenia; + Set ret = new TreeSet(); + + int j = filterColumns.getIndexOfCode(code); + if( j < 0 ) { + j = filterColumns.getSize(); + } + + try { + jZlecenia = new JSONObject(jProfil.getString("zlecenia")); + Iterator keys = jZlecenia.keys(); + while (keys.hasNext()) { + String id = (String) keys.next(); + JSONObject jZlecenie = jZlecenia.getJSONObject(id); + + if( j > 0 && !checkIfSearchMatchInternal(jZlecenie, j) ) { + continue; + } + + String val;// = jZlecenie.getString(code); + val = getFormatedValue ( jZlecenie, code); + + if( val != null){ + ret.add(val); + } + } + + } catch (JSONException e) { + Log.e(LOG, "", e); + } + + return ret; + } + + private boolean checkIfSearchMatchInternal(JSONObject jZlecenie) { + return checkIfSearchMatchInternal(jZlecenie, 0); + } + + private boolean checkIfSearchMatchInternal(JSONObject jZlecenie, int columnLimit) { // jeśli column Limit == 0 to wyłączenie limitu + + if( filterColumns.getSize() > 0 ) { + for( int i = 0 ; i < filterColumns.getSize() ; i++ ) { + if( columnLimit > 0 && i >= columnLimit ) { + break; + } + + ArrayList filterItems = filterColumns.getFilterItems(i); + String sortCol = filterColumns.getSortCol(i); + + if (filterItems.size() > 0) { + try { + String w = getFormatedValue(jZlecenie, sortCol); + if (!filterItems.contains(w)) { + return false; + } + } catch (JSONException e) { + Log.e(LOG, "", e); + } + } + } + } + return true; + } + + private boolean checkIfSearchMatch(JSONObject jZlecenie) { + // TODO Auto-generated method stub + //String search = etSearch.getText().toString().trim(); + + + if ( !checkIfSearchMatchInternal(jZlecenie) ) { + return false; + } + +// if( filterItemsArr.size() > 0 ) { +// +// for( int i = 0 ; i < filterItemsArr.size() ; i++ ) { +// ArrayList filterItems = filterItemsArr.get(i); +// String sortCol = sortColArr.get(i); +// +// if (filterItems.size() > 0) { +// try { +// String w = getFormatedValue(jZlecenie, sortCol); //jZlecenie.getString(sortCol); +// if (!filterItems.contains(w)) { +// return false; +// } +// } catch (JSONException e) { +// Log.e(LOG, "", e); +// } +// } +// } +// } + + /* + if( filterItems.size()>0){ + try { + String w = getFormatedValue(jZlecenie, sortCol); //jZlecenie.getString(sortCol); + if( !filterItems.contains(w)){ + return false; + } + } catch (JSONException e) { + Log.e(LOG, "", e); + } + + } + */ + + + if( search.length()>0){ + String id; + try { + id = jZlecenie.getString("id_zlecenia"); + File file = new File(prefs.getString("dir", "") + "/baza/" + id + ".json"); + + //TODO: zmienic, optymalizacja, indeksy, nie wczytywac obiektu + String sJson = DedalHelper.getFileContent(file.getAbsolutePath()); + + if( sJson!= null && sJson.length()>0 && sJson.toLowerCase().contains(search.toLowerCase())){ + return true; + } + + } catch (JSONException e) { + Log.e(LOG, "", e); + } + return false; + + }else + return true; + } + + private boolean checkIfInSelectedFolder(JSONObject jZlecenie) { + + if( id_folder > 0){ + String id; + try { + if( jZlecenie.has("id_folder") ) { + if( jZlecenie.getInt("id_folder") == id_folder) { + return true; + } + } + + } catch (JSONException e) { + Log.e(LOG, "", e); + } + return false; + + } + else if( id_folder == 0 ) { + try { + if( !jZlecenie.has("id_folder") || jZlecenie.getString("id_folder").equals("null") ) { + return true; + } + + + } catch (JSONException e) { + Log.e(LOG, "", e); + } + return false; + } + else + return true; + + + + } + + public static final int SHOW_PREFERENCES = 1; + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.list, menu); + return true; + } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // TODO Auto-generated method stub + //return super.onOptionsItemSelected(item); + // swithc item.getItemId() + Intent i = new Intent(this, getPreferActivity()); + startActivityForResult(i, SHOW_PREFERENCES); + return true; + } + protected Class getPreferActivity() { + return PreferActivity.class; + } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + // TODO Auto-generated method stub + super.onActivityResult(requestCode, resultCode, data); + + if (requestCode == REQUEST_MANAGE_ALL_FILES) { + // powrót z ekranu ustawień uprawnienia "Zarządzanie wszystkimi plikami" + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (Environment.isExternalStorageManager()) { + Toast.makeText(this, "Uprawnienie do zarządzania plikami przyznane.", Toast.LENGTH_SHORT).show(); + // zainicjalizuj UI jeśli jeszcze nie było + setupUIAndLogic(); + // i odśwież listę + wyswietlListe(); + } else { + Toast.makeText(this, "Brak wymaganego uprawnienia do plików. Aplikacja nie będzie działać poprawnie.", Toast.LENGTH_LONG).show(); + } + } + return; + } + + if( requestCode == SHOW_PREFERENCES){ + if( resultCode == Activity.RESULT_OK){ + + Context context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + Log.setFileName(prefs.getString("dir", "")); + Log.setEH(); + Log.d(LOG,"Pomyslne zapisanie ustawien. hostnPath=" + prefs.getString("hostName", "")); + Intent service = new Intent(context, DedalService.class); + context.stopService(service); + context.startService(service); + } + } + } + + @Override + protected void onDestroy() { + // TODO Auto-generated method stub + super.onDestroy(); + names = null; + gps.stopUsingGPS(); + Log.d(LOG, "wylaczenie GPS'a"); + rlat.interrupt(); + Log.d("my_debug", "ondestroy"); + //onDestroyD(this); + } + public static void onDestroyD(Activity activity) { + View rootView = null; + Log.d(LOG, "niszczenie activity"); + try { + rootView = ((ViewGroup) activity.findViewById(android.R.id.content)) + .getChildAt(0); + } catch (Exception e) { + Log.d( LOG, "Cannot find root view to call unbindDrawables on"); + } + + if (rootView != null) { + Log.d(LOG,"unbindDrawables"); + unbindDrawables(rootView); + } + System.gc(); + Runtime.getRuntime().gc(); + } + + /** + * Utility method to unbind drawables when an activity is destroyed. This + * ensures the drawables can be garbage collected. + */ + public static void unbindDrawables(View view) { + if (view.getBackground() != null) { + view.getBackground().setCallback(null); + } + + if (view instanceof ViewGroup) { + for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { + unbindDrawables(((ViewGroup) view).getChildAt(i)); + } + + try { + // AdapterView objects do not support the removeAllViews method + if (!(view instanceof AdapterView)) { + ((ViewGroup) view).removeAllViews(); + } + } catch (Exception e) { + Log.d(LOG, "Ignore Exception in unbindDrawables"); + } + }else{ +// try +// { +// //view.setBackgroundDrawable(null); +// } +// catch(Exception e) +// { +// } + + try + { + if( view instanceof ImageView){ + ImageView imageView = (ImageView)view; + // imageView.setImageDrawable(null); + // imageView.setBackgroundDrawable(null); + //imageView.destroyDrawingCache(); + + BitmapDrawable bd = (BitmapDrawable)imageView.getDrawable(); + Bitmap bmp = bd.getBitmap(); + bmp.recycle(); + Log.d(LOG, "czyszczenie bitmapy"); + + } + } + catch(Exception e) + { + } + } + } + + private class FilterColumns { + private ArrayList sortColArr = new ArrayList(); + private ArrayList bSortASCArr = new ArrayList(); + private ArrayList> filterItemsArr = new ArrayList>(); + + public FilterColumns() { + this.sortColArr = new ArrayList(); + this.bSortASCArr = new ArrayList(); + this.filterItemsArr = new ArrayList>(); + } + public FilterColumns(ArrayList sortColArr, ArrayList bSortASCArr, ArrayList> filterItemsArr) { + this.sortColArr = sortColArr; + this.bSortASCArr = bSortASCArr; + this.filterItemsArr = filterItemsArr; + } + + /////////////// + public void reset() { + sortColArr = new ArrayList(); + bSortASCArr = new ArrayList(); + filterItemsArr = new ArrayList>(); + } + public int getIndexOfCode( String code ) { + return sortColArr.indexOf(code); + } + public int getSize() { + return sortColArr.size(); + } + + // set and add elements + public void addColumn( String sortCol, int bSortAsc, ArrayList filterItems) { + sortColArr.add(sortCol); + bSortASCArr.add(bSortAsc); + filterItemsArr.add(filterItems); + } + public boolean setColumn( int index, String sortCol, int bSortAsc, ArrayList filterItems) { + if( index >= 0 && index < sortColArr.size() ) { + sortColArr.set(index, sortCol); + bSortASCArr.set(index, bSortAsc); + filterItemsArr.set(index, filterItems); + + return true; + } + return false; + } + + // get element from index + public String getSortCol(int index) { + if( index < sortColArr.size() ) { + return sortColArr.get(index); + } + return null; + } + public Integer getBSortASC(int index) { + if( index < bSortASCArr.size()) { + return bSortASCArr.get(index); + } + return null; + } + public ArrayList getFilterItems(int index) { + if( index < filterItemsArr.size() ) { + return filterItemsArr.get(index); + } + return null; + } + + // return just properties + public ArrayList getSortColArr() { + return sortColArr; + } + public ArrayList getBSortASCArr() { + return bSortASCArr; + } + public ArrayList> getFilterItemsArr() { + return filterItemsArr; + } + + @Override + public String toString(){ + return "sortColArr: "+sortColArr+", bSortASCArr: "+bSortASCArr+", filterItemsArr"+filterItemsArr; + } + } + + ///////// +// private class ThreadCheckListaProfil implements Runnable { +// +// +// } + //////////////// +} diff --git a/app/src/main/java/com/likesoft/mdedal/Log.java b/app/src/main/java/com/likesoft/mdedal/Log.java new file mode 100644 index 0000000..0bab55a --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/Log.java @@ -0,0 +1,179 @@ +package com.likesoft.mdedal; + +import android.os.AsyncTask; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.PrintWriter; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +public class Log { + + + + private static void log(final String lOG, String string) { + + AsyncTask fileLog = new AsyncTask(){ + @Override + protected Object doInBackground(Object[] objects) { + logRow(objects[0].toString(), objects[1].toString()); + return null; + } + }; + fileLog.execute(lOG, string); + } + private static void logRow(String lOG, String string) { + + if( fileName != null){ + PrintWriter pw; + try { + Date d = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd"); + String fName = fileName+"/rt_"+sdf.format(d)+".log"; + File f = new File(fName); + if( !f.exists()){ + // new date, check if old should be sent to server + File dir = new File( fileName); + String[] fpliki = dir.list(new FilenameFilter(){ + + @Override + public boolean accept(File dir, String filename) { + // TODO Auto-generated method stub + return filename.startsWith("rt_"); + }}); + File up = new File(fileName +"/upload/log_file"); + if( !up.isDirectory()){ + up.mkdirs(); + } + if( fpliki != null ) { + for (int i = 0; i < fpliki.length; i++) { + File fi = new File(fileName + "/" + fpliki[i]); + String fi_name = fi.getName(); + + if ("rt_2014_05_25.log".compareTo(fi_name) > 0) { //create_date < "2014-05-20" ) { + fi.delete(); + } else { + Log.zip(fi.getAbsolutePath(), fi.getAbsolutePath() + ".zip"); + File fz = new File(fi.getAbsolutePath() + ".zip"); + File newF = new File(up.getAbsoluteFile() + "/" + fpliki[i] + ".zip"); + + if( fz != null && fz.exists() ) { + fz.renameTo(newF); + fi.delete(); + } + } + } + } + f.createNewFile(); + } + pw = new PrintWriter( + new FileWriter(fName, true)); + String prefix = ""; + //Date d = new Date(); + sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + prefix = sdf.format(d) + ":"; + pw.write(prefix + lOG + ":" + string+ "\n"); + pw.flush(); + pw.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + public static void d(String tag, String msg){ + if(BuildConfig.DEBUG) { + android.util.Log.d(tag, msg); + StackTraceElement st = new Exception().getStackTrace()[1]; + log(tag, "DEBUG:" + st.getClassName() + ":" + st.getMethodName() + "(" + st.getLineNumber() + "):" + msg); + } + } + + public static void d(String tag, String msg, Throwable tr){ + if(BuildConfig.DEBUG) { + android.util.Log.d(tag, msg, tr); + log(tag, "DEBUG:" + msg + android.util.Log.getStackTraceString(tr)); + } + } + public static void e(String tag, String msg ){ + { + android.util.Log.e(tag, msg); + } + log(tag, "ERROR:" + msg); + } + public static void e(String tag, String msg, Throwable tr){ + { + android.util.Log.e(tag, msg, tr); + } + log(tag, "ERROR:" + msg + android.util.Log.getStackTraceString(tr)); + } + public static String fileName = null; + public static void setFileName( String dir){ + fileName = dir;// + "/rt.log"; + } + public static void setEH(){ + if( fileName == null){ + return; + } + Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread thread, Throwable ex) { + + PrintWriter pw; + try { + Date d = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd"); + pw = new PrintWriter( + new FileWriter(fileName+"/rt_"+sdf.format(d)+".log", true)); + pw.write("uncaughtException\n"); + ex.printStackTrace(pw); + pw.flush(); + pw.close(); + ex.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + } + + + public static void zip(String _file, String _zipFile) { + try { + BufferedInputStream origin = null; + FileOutputStream dest = new FileOutputStream(_zipFile); + + ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest)); + + int BUFFER = 1024; + byte data[] = new byte[BUFFER]; + + //for(int i=0; i < _files.length; i++) { + //Log.d("Compress", "Adding: " + _file); + FileInputStream fi = new FileInputStream(_file); + origin = new BufferedInputStream(fi, BUFFER); + ZipEntry entry = new ZipEntry(_file.substring(_file.lastIndexOf("/") + 1)); + out.putNextEntry(entry); + int count; + while ((count = origin.read(data, 0, BUFFER)) != -1) { + out.write(data, 0, count); + } + origin.close(); + //} + + out.close(); + } catch(Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/app/src/main/java/com/likesoft/mdedal/MainActivity.java b/app/src/main/java/com/likesoft/mdedal/MainActivity.java new file mode 100644 index 0000000..6c7de82 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/MainActivity.java @@ -0,0 +1,1373 @@ +package com.likesoft.mdedal; + +import android.Manifest; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import androidx.exifinterface.media.ExifInterface; +import android.net.Uri; +import android.os.Bundle; +import android.os.StrictMode; +import android.os.Build; +import android.preference.PreferenceManager; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import android.telephony.TelephonyManager; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.Spinner; +import android.widget.TableLayout; +import android.widget.TextView; +import android.widget.Toast; + +//import com.likesoft.mdedaltest.R; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; + +//import android.util.Log; + +//@SuppressLint("UseSparseArrays") +public class MainActivity extends DedalActivity { + + + private final class MyCreateLayout implements Runnable { + + JSONArray jKolumny; + TableLayout tl; + ArrayList aM; + protected LinearLayout ll; + + public MyCreateLayout(LinearLayout _ll) { + + ll = _ll; + } + + @Override + public void run() { + wyswietl_zlecenie(ll); + } + } + + + GPSTracker gps = null; + String id_zlecenia = ""; + //Thread t; + Boolean stop_thread = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + +// if(BuildConfig.DEBUG) +// StrictMode.enableDefaults(); + //lastId = 1000000; + if(BuildConfig.DEBUG){ + StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() + // .detectDiskReads() + // .detectDiskWrites() + .detectNetwork() // or .detectAll() for all detectable problems + .penaltyLog() + .build()); + StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() + .detectLeakedSqlLiteObjects() + //.detectLeakedClosableObjects() + .penaltyLog() + // .penaltyDeath() + .build()); + } + + res = getResources(); + + Context context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + bTablet = prefs.getBoolean("tablet", false); + + Log.setFileName(prefs.getString("dir", "")); + Log.setEH(); + + Uri u = getIntent().getData(); + + gps = ListActivity.gps; + //if( gps != null ) { + try { + gps.getLocation(); + } catch (NullPointerException e) { + Log.e(LOG, "gps is null", e); + } + // setContentView(R.layout.activity_main); + +// RelativeLayout rl = new RelativeLayout(this); + LinearLayout rl = new LinearLayout(this); + // rl.setMinimumWidth(this.getWindow().getAttributes().width); + +// int x = this.getWindow().getAttributes().width; +// Log.d("my_debug", "szerokość ekranu MainActivity: "+ x); + + rl.setOrientation(LinearLayout.VERTICAL); + rl.setBackgroundColor(Color.WHITE); + // rl.setPadding(5, 1, 5, 1); + + //ArrayList values = new ArrayList(); + //Log.d("my_debug", "aaaa1"); + boolean bModified = false; + try { + + String pathName = u.getPath(); + String pathMod = pathName.replace(".json", ".mod"); + File fMod = new File(pathMod); + if (fMod.exists() && fMod.length() > 0) { + + pathName = pathMod; + bModified = true; + } + + File fJson = new File(pathName); + if (!fJson.exists()) { + Bundle extras = getIntent().getExtras(); + String filename = extras.getString("filename"); + id_zlecenia = filename.substring(0, filename.length() - 5); + Log.d("my_debug", "filename: " + filename); + Log.d("my_debug", "id_zlecenia: " + id_zlecenia); + File f_queue = new File(prefs.getString("dir", "") + "/queue/" + id_zlecenia); + + File d_queue_prio = new File(prefs.getString("dir", "") + "/queue_prio"); + if (!d_queue_prio.isDirectory()) { + d_queue_prio.mkdirs(); + } + File f_queue_prio = new File(prefs.getString("dir", "") + "/queue_prio/" + id_zlecenia); + if (f_queue.exists()) { + f_queue.renameTo(f_queue_prio); + } + else { + f_queue_prio.createNewFile(); + } + + // wystartuj/obudz serwis + Intent service = new Intent(context, DedalService.class); + context.startService(service); + + Thread t = new Thread(new Runnable() { + @Override + public void run() { + // TODO Auto-generated method stub + while (!stop_thread) { + + try { + Thread.sleep(500); + File f_queue_prio = new File(prefs.getString("dir", "") + "/queue_prio/" + id_zlecenia); + if (!f_queue_prio.exists()) { + Log.d("my_debug", "just downloaded: " + id_zlecenia); + reload(); + break; + } + + } catch (InterruptedException e) { + // TODO Auto-generated catch block + Log.e("my_debug", "", e); + } + } + } + }); + t.start(); + + AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); + alertDialog.setTitle("Pobieranie zlecenia"); + alertDialog.setMessage(res.getString(R.string.trwa_pobieranie_zlecenia)); + alertDialog.setPositiveButton("Wróć na listę zleceń", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + + stop_thread = true; + //t.stop(); + finish(); + } + }); + + alertDialog.show(); + return; + + } + + String sJson = DedalHelper.getFileContent(pathName); + js = new JSONObject(sJson);//fs.read(buffer)); + + params = js.getJSONObject("param"); + m_id = params.getString("id_zlecenia"); + //id_zlecenia = m_id; + String s = "Zlecenie nr: " + m_id; + if (!params.isNull("nazwa_klienta")) + s += " " + params.getString("nazwa_klienta"); + s += " " + params.getString("opis_szablonu"); + this.setTitle(s); + + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + create_user_folders_arrays(); + + wyswietlNaglowek(rl); + if (bModified) { + llNaglowek.setBackgroundColor(Color.parseColor("#EBA0DD")); + } + + sw = new ScrollView(this); + + + HorizontalScrollView hs = new HorizontalScrollView(this); + rl.addView(sw); + sw.addView(hs); + +// rl.addView(hs); +// hs.addView(sw); + + LinearLayout ll = new LinearLayout(this); + ll.setId(View.generateViewId()); + ll.setOrientation(LinearLayout.VERTICAL); + ll.setPadding(20, 5, 5, 5); + //hs.addView(ll); + hs.addView(ll); + + int xx = this.getWindowManager().getDefaultDisplay().getWidth(); //getRealSize(p); + Log.d("my_debug", "szerokość ekranureal x: = " + xx); + ll.setMinimumWidth(xx); + + // zamiana na wątek: + //wyswietl_zlecenie(ll); + MyCreateLayout mcl = new MyCreateLayout(ll); + ll.post(mcl); +// Thread wt = new Thread( mcl); +// wt.start(); + + + setContentView(rl); +// rl.setDescendantFocusability(false); +// rl.requestFocus(); + rl.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); + rl.setFocusableInTouchMode(true); + + if (supportOnLoadReferences != null) { + supporRadioRef(supportOnLoadReferences, View.GONE); + } + + //temp +// sw.post(new Runnable() { +// @Override +// public void run() { +// Log.d("my_debug", "set set scrollTo, run: " + scrollTo); +// //int scrollX = sw.getScrollX(); +// sw.scrollTo(0, 200); +// //sw.scrollBy(0, scrollTo); +// //sw.fullScroll(ScrollView.FOCUS_DOWN); +// } +// }); + + } + + private void wyswietl_zlecenie(LinearLayout ll) { + try { + + first_foto_displayed = false; + + JSONObject pola = js.getJSONObject("pola"); + // for( int i=0; i aM = new ArrayList(); + while (k.hasNext()) { + String key = (String) k.next(); + JSONObject jo = pola.getJSONObject(key); + aM.add(jo); + } + sortujKolejnosc(aM); + + boolean enabled = true; + + //Log.d("my_debug", "STATUS: "+params.getString(STRUCT_STATUS)); + if (params.getString(STRUCT_STATUS).equals("wykonane_zaak") || + params.getString(STRUCT_STATUS).equals("wykonane")) { + enabled = false; + //Log.d("my_debug", "enable: false"); + } + Log.d("STATUS: ", params.getString(STRUCT_STATUS)); + + for (int z = 0; z < aM.size(); z++) { + JSONObject jo = (JSONObject) aM.get(z); + find_powtarzalne(jo, 0); + wyswietlPole(ll, jo, true, enabled); + //wyswietlPole(ll, jo); + } + + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NullPointerException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + private void create_user_folders_arrays() { + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + if (dLista.isFile()) { + + folderNazwy = new ArrayList(); + folderIds = new ArrayList(); + folderNazwy.add("Brak folderu"); + folderIds.add(0); + try { + String sJson = DedalHelper.getFileContent(dLista.getAbsolutePath()); + JSONObject jFile = new JSONObject(sJson); + + //JSONObject jProfiles = jFile.getJSONObject("profile"); + if (jFile.get("foldery") != null) { + JSONObject jFolders = jFile.getJSONObject("foldery"); + Iterator pKeys2 = jFolders.keys(); + + while (pKeys2.hasNext()) { + String idFolder = (String) pKeys2.next(); + JSONObject jFolder = jFolders.getJSONObject(idFolder); + //Log.d("my_debug","nazwa1: "+jFolder.getString("nazwa")); + folderNazwy.add(jFolder.getString("nazwa")); + folderIds.add(jFolder.getInt("id_folder")); + } + } + } catch (JSONException e) { + Log.e(LOG, e.getMessage()); + } + + } + + } + +// @Override +// protected void onResume() { +// super.onResume(); +// //autoscroll +// Log.d("my_debug", "set set scrollTo: " + scrollTo); +// //if (scrollTo > 0) { +// +// sw.post(new Runnable() { +// @Override +// public void run() { +// Log.d("my_debug", "set set scrollTo, run: " + scrollTo); +// sw.scrollTo(0, 1000); +// } +// }); +// // } +// } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + // TODO Auto-generated method stub + super.onActivityResult(requestCode, resultCode, data); + + + if (requestCode == REQUEST_CODE) { + + Log.d("my_debug", "set set scrollTo: " + scrollTo); + if (scrollTo > 0) { + Log.d("my_debug", "set set scrollTo, run: " + scrollTo); + sw.scrollTo(0, scrollTo); +// sw.post(new Runnable() { +// @Override +// public void run() { +// Log.d("my_debug", "set set scrollTo, run: " + scrollTo); +// //int scrollX = sw.getScrollX(); +// //sw.scrollTo(0, scrollTo); +// //sw.scrollBy(0, scrollTo); +// //sw.fullScroll(ScrollView.FOCUS_DOWN); +// } +// }); + } + + if (data.hasExtra("id")) { + String result = "Object ID=" + data.getExtras().getString("id"); + if (result != null && result.length() > 0) { + Toast.makeText(this, result, Toast.LENGTH_SHORT).show(); + } + } + if (data.hasExtra("tmpName")) { + String tmpName = data.getExtras().getString("tmpName"); + File tmp = new File(tmpName); + if (tmp.exists()) tmp.delete(); + } + /* + if( !fcameraOrig.exists()){ + MainActivity.this.reload(); + return; + }*/ + if (data.hasExtra("json") && data.hasExtra("id")) { + // check if radio, find parent to set up value + try { + + String sJson = DedalHelper.getFileContent(prefs.getString("dir", "") + "/baza/" + m_id + ".mod"); + js = new JSONObject(sJson);//fs.read(buffer)); + + JSONObject jo = find_element_from_Array(js, data.getExtras().getString("id")); //todo check if not null + if (TYPE_RADIOBUTTON.equals(jo.getString(STRUCT_TYP_DANYCH))) { + // find parent + String parent = jo.getString("parent"); + Log.d("my_debug", "szukanie parenta" + parent);// + JSONObject jParent = find_element_from_Array(js, parent); + if (jParent != null && TYPE_RADIOLISTA.equals(jParent.getString(STRUCT_TYP_DANYCH))) { + jParent.put(STRUCT_WARTOSC, jo.getInt("id_wiersz_szablonu")); + } + } + // stopAutozapis(); + autoZapisStop = false; + mod_json_files(false); + + setModified(); + //MainActivity.this.reload(); + return; + + } catch (JSONException e) { + e.printStackTrace(); + } + + } + + } + if (requestCode == TAKE_PICTURE) { + //1. convert size to 800x600 + //2. save to upload folder + Log.d(LOG, m_id + "foto_kod zdjecia: " + foto_kod + ", foto_name:" + foto_name); + + ExifInterface exifOrig = null; + File fcameraOrig = new File(prefs.getString("dir", "") + "/mDedalCam/" + foto_name); + + if (!fcameraOrig.exists()) { + MainActivity.this.reload(); + return; + } + + File fcamera = new File(prefs.getString("dir", "") + "/mDedalCam/" + foto_name + ".small"); + try { + exifOrig = new ExifInterface(fcameraOrig.getCanonicalPath()); + } catch (IOException e2) { + // TODO Auto-generated catch block + Log.e(LOG, "exif", e2); + } + // resize bitmap: + Bitmap bitmap = BitmapFactory.decodeFile(fcameraOrig.getAbsolutePath()); + if (bitmap != null) { + int origWidth = bitmap.getWidth(); + int origHeight = bitmap.getHeight(); + + final int destWidth = 2048;// or the width you need + + if (origWidth > destWidth) { + // picture is wider than we want it, we calculate + // its target height + int destHeight = origHeight + / (origWidth / destWidth); + // we create an scaled bitmap so it reduces the + // image, not just trim it + + Bitmap bitmapScalled = Bitmap.createScaledBitmap(bitmap, + destWidth, destHeight, false); + + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + // compress to the format you want, JPEG, PNG... + // 70 is the 0-100 quality percentage + bitmapScalled.compress(Bitmap.CompressFormat.JPEG, 70, outStream); + // we save the file, at least until we have made use of it +// File f = new File(Environment.getExternalStorageDirectory() +// + File.separator + "test.jpg"); +// f.createNewFile(); + //write the bytes in file + FileOutputStream fo; + try { + fo = new FileOutputStream(fcamera); + fo.write(outStream.toByteArray()); + // remember close de FileOutput + fo.close(); + outStream.close(); + } catch (FileNotFoundException e) { + Log.e(LOG, "nie znaleziono pliku", e); + } catch (IOException e) { + Log.e(LOG, "inny blad przy zapisywaniu zdjecia", e); + } + bitmapScalled.recycle(); + bitmap.recycle(); + } else { + fcamera = fcameraOrig; + } + } + + //add GPS to EXIF + try { + + ExifInterface exif = new ExifInterface(fcamera.getCanonicalPath()); + String x = exifOrig.getAttribute(ExifInterface.TAG_GPS_LATITUDE); + Log.d("GPS", "pozycja ze zdjecia x = " + x); + + + // check if GPS enabled + gps.getLocation(); + if (gps.canGetLocation()) { + double latitude = gps.getLatitude(); + double longitude = gps.getLongitude(); + exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, "" + DedalHelper.decimalToDMS(latitude)); + exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, "" + DedalHelper.decimalToDMS(longitude)); + + if (!gps.isGPSEnabled) { + exif.setAttribute(ExifInterface.TAG_MAKE, "mDedal WiFI or GSM"); + } else { + exif.setAttribute(ExifInterface.TAG_MAKE, "mDedal GPS, SAT: " + gps.liczbaSatelitow); + + } + } else { + exif.setAttribute(ExifInterface.TAG_MAKE, "mDedal no GPS info"); + } + // przepisz atrybuty + if (exifOrig != null) { + exif.setAttribute(ExifInterface.TAG_MODEL, exifOrig.getAttribute(ExifInterface.TAG_MODEL)); + exif.setAttribute(ExifInterface.TAG_DATETIME, exifOrig.getAttribute(ExifInterface.TAG_DATETIME)); + exif.setAttribute(ExifInterface.TAG_ORIENTATION, exifOrig.getAttribute(ExifInterface.TAG_ORIENTATION)); + exif.setAttribute(ExifInterface.TAG_FLASH, exifOrig.getAttribute(ExifInterface.TAG_FLASH)); + exif.setAttribute("DateTimeOriginal", exifOrig.getAttribute(ExifInterface.TAG_DATETIME)); + exif.setAttribute("Software", "mDedal v. xxx"); + } + + exif.saveAttributes(); + + } catch (IOException e1) { + // TODO Auto-generated catch block + //e1.printStackTrace(); + Log.e(LOG, "", e1); + } catch (NullPointerException e1) { + // TODO Auto-generated catch block + //e1.printStackTrace(); + Log.e(LOG, "", e1); + } + + + File fDir = new File(prefs.getString("dir", "") + "/mDedal/" + m_id + "/" + foto_kod); + if (!fDir.isDirectory()) { + fDir.mkdirs(); + } + + File f = new File(prefs.getString("dir", "") + "/mDedal/" + m_id + "/" + foto_kod + "/" + foto_name); + //Environment.getDataDirectory(); + File fDstf = new File(prefs.getString("dir", "") + "/upload/" + m_id + "/" + foto_kod); + if (!fDstf.isDirectory()) { + fDstf.mkdirs(); + } + File fDst = new File(prefs.getString("dir", "") + "/upload/" + m_id + "/" + foto_kod + "/" + foto_name); + try { + DedalHelper.copyEncode(fcamera, f); + copy( f, fDst); + if( fcamera!=fcameraOrig) { + fcamera.delete(); + } + fcameraOrig.delete(); + + } catch (IOException e) { + Log.e(LOG, "nieudane kopiowanie zdjęcia", e); + } + wyswietlPytanieCzyNastepneZdjecie(foto_kod); + } + } + + @Override + public OnClickListener getZapisz_zmiany(JSONObject jo, String typ) { + return new Zapisz_zmiany(jo, typ); + } + @Override + protected void setModified(){ + llNaglowek.setBackgroundColor(Color.parseColor("#EBA0DD")); +// llNaglowek.setBackgroundResource(R.style.NaglowekNormal); + +// if( autoZapis == null ){ +// // dodaj button Wycofaj zmiany +// +// } + + + autoZapisStop = false; + startAutoZapis(); + } + + + public final class Zapisz_zmiany implements OnClickListener { + + //private LinearLayout ll; + private JSONObject jo; + private String typ; + + + public Zapisz_zmiany( JSONObject jo, String typ) { + //super(); + //this.ll = ll; + this.jo = jo; + this.typ = typ; + } + + @Override + public void onClick(final View v) { + //DedalActivity.this.findViewById(v.getId()); + //v.setEnabled(false); + String komunikat = ""; + // zapiszZmiany + try { + komunikat_obowiazkowe = ""; + komunikat_walidacja = ""; + + JSONObject pola = js.getJSONObject("pola"); + Iterator k = pola.keys(); + + while (k.hasNext()) { + String key = (String) k.next(); + JSONObject jo2 = pola.getJSONObject(key); + zapiszZmiany(jo2); + } + + if (!komunikat_obowiazkowe.equals("") || !komunikat_walidacja.equals("")) { + if (!komunikat_obowiazkowe.equals("")) { + komunikat = res.getString(R.string.walid_pola_obowiazkowe) + ": \n" + komunikat_obowiazkowe + "\n"; + Log.d("my_debug", "Nie wypełniłeś pól obowiązkowych: " + komunikat); + } + if (!komunikat_walidacja.equals("")) { + komunikat += "\n" + res.getString(R.string.walid_zle_wypelnione) + ": \n" + komunikat_walidacja + "\n"; + } + } + else { + + } + + /// GPS /// + + + //GPSTracker gps = new GPSTracker(MainActivity.this); + //if( gps != null ) { + try { + TelephonyManager telephonyManager; + telephonyManager = + (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); + + int permissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_PHONE_STATE); + + if (permissionCheck == PackageManager.PERMISSION_GRANTED) { + String imsistring = ""; + String mPhoneNumber = ""; + try { + if (Build.VERSION.SDK_INT < 29) { + imsistring = telephonyManager.getSubscriberId(); + mPhoneNumber = telephonyManager.getLine1Number(); + } + } catch (SecurityException ignored) { + } + + gps.getLocation(); + double latitude = gps.getLatitude(); + double longitude = gps.getLongitude(); + String isGPS = "" + gps.isGPSEnabled; + String imsi = imsistring + "T" + mPhoneNumber; + + JSONObject gps_json = new JSONObject(); + gps_json.put("latitude", latitude); + gps_json.put("longitude", longitude); + gps_json.put("isGPS", isGPS); + gps_json.put("imsi", imsi); + js.put("gps", gps_json); + } + + } catch (NullPointerException e) { + Log.e(LOG, "custom null exception", e); + } + /// END GPS /// + + if( typ.equals("zakoncz_wizyte") ) { + + if( komunikat.equals("") ) { // pola sÄ… dobrze wypeĹ‚nnione + AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); + alertDialog.setTitle( res.getString(R.string.zakanczanie_wizyty) ); + alertDialog.setMessage(res.getString(R.string.czy_zakonczyc_wizyte) ); + alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + try { + js.put("sub", "sub_end="+jo.getInt("id")); + jo.put(STRUCT_STATUS, "end"); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + mod_json_files(true); + //DedalActivity.this.reload(); + finish(); + } + }); + alertDialog.setNegativeButton("Anuluj", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + mod_json_files(false); + dialog.dismiss(); + } + }); + alertDialog.show(); + } + else { // pola sÄ… Ĺşle wypeĹ‚nione + AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); + alertDialog.setTitle( res.getString(R.string.zakanczanie_wizyty) ); + alertDialog.setMessage(komunikat); + alertDialog.setPositiveButton("Anuluj", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + mod_json_files(false); + dialog.dismiss(); + } + }); + alertDialog.show(); + } + + } + if( typ.equals("zapisz_zmiany") ) { + + //Log.d("my_debug", "put sub: Zapisz zmiany"); + //DedalActivity.this.recreate(); + if( komunikat.equals("") ) { // pola sÄ… dobrze wypeĹ‚nnione + js.put("sub", "Zapisz zmiany"); + mod_json_files(true); + //DedalActivity.this.reload(); + finish(); + } + else { // pola sÄ… Ĺşle wypeĹ‚nione + AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); + alertDialog.setTitle( res.getString(R.string.wysylanie_do_centrum) ); + alertDialog.setMessage(komunikat); + alertDialog.setPositiveButton( res.getString(R.string.wyslij), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + try { + js.put("sub", "Zapisz zmiany"); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + mod_json_files(true); + //dialog.dismiss(); + MainActivity.this.reload(); + //finish(); + } + }); + alertDialog.setNegativeButton("Anuluj", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + mod_json_files(false); + dialog.dismiss(); + } + }); + alertDialog.show(); + } + } + if( typ.equals("zapisz_i_zamknij_zlecenie") ) { + + if( komunikat.equals("") ) { // pola sÄ… dobrze wypeĹ‚nnione + + AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); + alertDialog.setTitle( res.getString(R.string.wysylanie_do_centrum) ); + + String message = res.getString(R.string.czy_wyslac_zlecenie); + + // jesli istnieja niezakonczone wizyty to wyswietl komunikat, z mozliwosia zamkniecia wizyt. + if( is_notend_intevention ) { + message = res.getString(R.string.wykryto_niezakonczone_wizyty); + + alertDialog.setNeutralButton(R.string.wyslij_i_zakoncz_wizyty, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + Log.d("my_debug", "wyslij i zakoncz wizyty"); + try { + js.put("sub_stat_acc", params.getString(STRUCT_STATUS)); + + //jo.put(STRUCT_STATUS, "end"); // przerobic + + js.put("sub", "Zapisz i zamknij zlecenie"); + if( params.getString(STRUCT_STATUS).equals("przydz_odeb") ) { + params.put(STRUCT_STATUS, "wykonane"); + } + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + mod_json_files(true); + //DedalActivity.this.reload(); + finish(); + } + }); + } + + alertDialog.setMessage( message ); + + + alertDialog.setPositiveButton( res.getString(R.string.wyslij) , new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + try { + js.put("sub", "Zapisz i zamknij zlecenie"); + if( params.getString(STRUCT_STATUS).equals("przydz_odeb") ) { + params.put(STRUCT_STATUS, "wykonane"); + } + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + mod_json_files(true); + //DedalActivity.this.reload(); + finish(); + } + }); + + + alertDialog.setNegativeButton("Anuluj", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + mod_json_files(false); + dialog.dismiss(); + } + }); + alertDialog.show(); + } + else { // pola sÄ… Ĺşle wypeĹ‚nione + AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); + alertDialog.setTitle( res.getString(R.string.wysylanie_do_centrum) ); + alertDialog.setMessage(komunikat); + alertDialog.setPositiveButton("Anuluj", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + mod_json_files(false); + dialog.dismiss(); + } + }); + alertDialog.show(); + } + + //ListActivity.class.(); + } + if( typ.equals("dodaj_wizyte") ) { + + //Log.d("my_debug", "put: sub_add="+jo.getInt("id")); + + AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); + alertDialog.setTitle("Dodawanie wizyty"); + alertDialog.setMessage( res.getString(R.string.czy_dodac_wizyte) ); + alertDialog.setPositiveButton("Tak", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + + //v.setEnabled(false); + try { + js.put("sub", "sub_add="+jo.getInt("id")); + jo.put("dodawanie_wizyty", "true"); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + mod_json_files(true); + //DedalActivity.this.reload(); + finish(); + } + }); + alertDialog.setNegativeButton("Anuluj", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int which) { + //mod_json_files(false); + dialog.dismiss(); + } + }); + alertDialog.show(); + + //ListActivity.class.(); + } + + + + komunikat_obowiazkowe = ""; + komunikat_walidacja = ""; +// //zablokowanie pďż˝l po zakoďż˝czeniu +// JSONArray ja = jo.getJSONArray(STRUCT_CHILDS); +// if( ja!= null && ja.length()>0){ +// for ( int i=0; i0){ +// for ( int i=0; i 0) { + Button dokKollektoBtn = new Button(MainActivity.this); + dokKollektoBtn.setText("Dokumenty Kollekto"); + + dokKollektoBtn.setOnClickListener(new DokKollektoBtnListener(m_id, dkJson)); + ll.addView(dokKollektoBtn); + } + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + @Override + synchronized protected void mod_json_files(boolean mod_upload) { + FileOutputStream fos; + try { + //id_zlecenia + if( !mod_upload && autoZapisStop){ + return; // nie zapisuj, jak jest wylaczony. + } + File dst = saveToModFile(js); + + if( mod_upload ) { // jeďż˝li jest jakiďż˝ komunikat to znaczy ďż˝e pola sďż˝ ďż˝le wypeďż˝nione, nie moďż˝e to pďż˝j�� na serwer + + autoZapisStop = true; + if( autoZapis != null){ + autoZapis.interrupt(); + try { + autoZapis.join(2000); + } catch (InterruptedException e) { + Log.e("DedalActivity", "nie udalo sie zatrzymac autozapisu", e); + } + autoZapis = null; + } + + // delete original json + File jF = new File(prefs.getString("dir", "") + "/baza/" + m_id + ".json"); + jF.delete(); + copy( dst, jF); + + Date d = new Date(); + String genName = "upl_"+d.getTime() + ".mod"; + File dstDir = new File(prefs.getString("dir", "") + "/upload/"+m_id); + if( !dstDir.isDirectory()){ dstDir.mkdirs(); } + + // + + File fMod = new File(prefs.getString("dir", "") + "/upload/" + m_id + "/" + genName); + dst.renameTo(fMod); + + // wystartuj/obudz serwis + Context context = getApplicationContext(); + Intent service = new Intent(context, DedalService.class); + context.startService(service); + } + + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + @Override + protected void forceDoZapis(String key, String kod) { + if( autoZapis != null ){ + try { + autoZapisStop = true; + autoZapis.interrupt(); + autoZapis.join(); + } catch (InterruptedException e) { + Log.e(LOG, "", e); + } + doAutoZapis(); + try { + js.put(key, kod); + mod_json_files(true); + } catch (JSONException e) { + Log.e(LOG, "nieudany zapis zmian na serwer przed wywolanie nowego intentu", e); + } + } + } + + @Override + protected void onPause() { + // TODO Auto-generated method stub + super.onPause(); + if( autoZapis != null ){ + try { + autoZapisStop = true; + autoZapis.interrupt(); + autoZapis.join(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + doAutoZapis(); + } + } + + + Thread autoZapis=null; + boolean autoZapisStop = false; + protected void startAutoZapis() { + if( autoZapis == null ){ + autoZapis = new Thread( new Runnable() { + @Override + public void run() { + // save to json.mod file + while( !autoZapisStop){ + runOnUiThread(new Runnable() { + @Override + public void run() { + doAutoZapis(); + } + }); + + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + //e.printStackTrace(); + Log.d(LOG, "AutoZapis przerwany."); + break; + } + } + + } + }); + autoZapis.start(); + } + } + + @Override + protected void stopAutozapis() { + if( autoZapis != null ){ + try { + autoZapisStop = true; + autoZapis.interrupt(); + autoZapis.join(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + doAutoZapis(); + } + } + + protected void doAutoZapis(){ + Log.d(LOG, "Auto zapis."); + JSONObject pola; + try { + pola = js.getJSONObject("pola"); + Iterator k = pola.keys(); + + while (k.hasNext()) { + String key = (String) k.next(); + JSONObject jo2 = pola.getJSONObject(key); + zapiszZmiany( jo2 ); + } + + } catch (JSONException e1) { + Log.e("DedalActivity", "nieudany zapiszZmiany", e1); + } + + mod_json_files(false); + + } + + public static void copy(File src, File dst) throws IOException { + InputStream in = new FileInputStream(src); + OutputStream out = new FileOutputStream(dst); + + // Transfer bytes from in to out + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + in.close(); + out.close(); + } + + + protected int get_id_folder(String id_zlecenia_Zlecenie) { + int id_folder = -1; + + try { + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + if( dLista.isFile()){ + String sFile = DedalHelper.getFileContent(prefs.getString("dir", "") + "/baza/lista.profil"); + JSONObject jFile = new JSONObject(sFile); + JSONObject jProfiles = jFile.getJSONObject("profile"); + Iterator pKeys = jProfiles.keys(); + Boolean break_ = false; + + while( pKeys.hasNext()){ + String idProfilu = (String)pKeys.next(); + JSONObject jProfil = jProfiles.getJSONObject(idProfilu); + String s = jProfil.getString("zlecenia"); + if( s.equals("[]")){ + continue; + } + JSONObject jZlecenia = jProfil.getJSONObject("zlecenia"); + Iterator pKeys2 = jZlecenia.keys(); + while( pKeys2.hasNext() ){ + String id_zlecenia = (String)pKeys2.next(); + if ( id_zlecenia.equals( id_zlecenia_Zlecenie ) ) { + JSONObject jZlecenie = jZlecenia.getJSONObject(id_zlecenia); + if( jZlecenie.has("id_folder") ) { + if( jZlecenie.getString("id_folder").equals("null") ) { + id_folder = 0; + } + else { + id_folder = jZlecenie.getInt("id_folder"); + } + break_ = true; + break; + } + } + else { + continue; + } + } + if( break_ ) { + break; + } + } + } + } catch (JSONException e) { + e.printStackTrace(); +// } catch (FileNotFoundException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } catch (IOException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); + } + return id_folder; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/likesoft/mdedal/MyXMLSerializer.java b/app/src/main/java/com/likesoft/mdedal/MyXMLSerializer.java new file mode 100644 index 0000000..459c73e --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/MyXMLSerializer.java @@ -0,0 +1,410 @@ +package com.likesoft.mdedal; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.xmlpull.v1.XmlSerializer; + +/* + * NOT USED CLASS + */ + +class MyXMLSerializer implements XmlSerializer{ + + private class MyXMLSerializerData { + public OutputStream m_os; + public boolean started; + + public MyXMLSerializerData(OutputStream m_os, boolean started) { + this.m_os = m_os; + this.started = started; + } + } + MyXMLSerializerData data = new MyXMLSerializerData(null, false); + + // dst = new File(getFilesDir().getAbsolutePath() + "/baza/" + genName); +// fos = new FileOutputStream(dst); +// XmlSerializer xmlSerializer = new MyXMLSerializer(); +// xmlSerializer.setOutput(fos, "UTF-8"); +// zapiszAsXML(js, xmlSerializer); +// fos.flush(); +// fos.close(); + + + //http://stackoverflow.com/questions/9869507/how-to-create-an-xml-using-xmlserializer-in-android-app + void zapiszAsXML(JSONObject jo, XmlSerializer xS, String m_id, JSONObject js){ + try { + xS.startDocument("UTF-8", true); + // xS.startDocument("UTF_8", true); + // xS.startDocument(Xml.Encoding.UTF_8, true); + //Xml.Encoding UTF_8 + // Xml.Encoding.UTF_8 + xS.startTag("", "zlecenia"); + xS.startTag("", "zlecenie"); + + xS.startTag("", "id_zlecenia"); + xS.text(m_id); + xS.endTag("", "id_zlecenia"); + + try { + xS.startTag("", "id_szablonu"); + JSONObject zlecenie_param = js.getJSONObject("param"); + xS.text(zlecenie_param.getString("id_szablonu")); + xS.endTag("", "id_szablonu"); + + JSONObject pola = js.getJSONObject("pola"); + ArrayList aM = new ArrayList(); + + //if() + // for( int i=0; i0){ + xS.startTag("", "childs"); + Iterator k = pola.keys(); + while (k.hasNext()) { + String key = (String) k.next(); + JSONObject joP = pola.getJSONObject(key); + aM.add(joP); + } + + sortujKolejnosc(aM); + + for( int z=0; z + } + private void zapiszPolaXML(JSONObject joP, XmlSerializer xS) { + // TODO Auto-generated method stub + + try { + xS.startTag("", "pole"); + xS.attribute("", "kod", joP.getString("kod")); + + xS.startTag("", "wartosc"); + + String typ = joP.getString("typ_danych"); + if( "radiolista".equals(typ)){ + JSONArray ja = joP.getJSONArray("childs"); + if( ja!= null && ja.length()>0){ + for ( int i=0; i0){ + xS.startTag("", "childs"); + for ( int i=0; i aM) { + Collections.sort(aM, new Comparator() { + @Override + public int compare(JSONObject lhs, JSONObject rhs) { + // TODO Auto-generated method stub + try { + if( lhs.getInt("kolejnosc") >(rhs.getInt("kolejnosc"))){ + return 1; + }else if( lhs.getInt("kolejnosc") < (rhs.getInt("kolejnosc"))){ + return -1; + }else{ + if( lhs.getInt("id") > (rhs.getInt("id"))) + return 1; + else if ( lhs.getInt("id") < (rhs.getInt("id"))) + return -1; + return 0; + } + } catch (JSONException e) { + // TODO Auto-generated catch block + //e.printStackTrace(); + } + return 0; + } + }); + } + + @Override + public void startDocument(String encoding, Boolean standalone) + throws IOException, IllegalArgumentException, + IllegalStateException { + // TODO Auto-generated method stub + data.m_os.write("".getBytes()); + } + + @Override + public XmlSerializer startTag(String namespace, String name) + throws IOException, IllegalArgumentException, + IllegalStateException { + // TODO Auto-generated method stub + if( data.started){ + data.m_os.write(">".getBytes()); + data.started = false; + } + StringBuffer b = new StringBuffer(); + b.append("<"); + b.append(name); + b.append(" "); + data.m_os.write(b.toString().getBytes()); + data.started = true; + return this; + } + + @Override + public XmlSerializer text(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + // TODO Auto-generated method stub + if( data.started){ + data.m_os.write(">".getBytes()); + data.started = false; + } + data.m_os.write(text.getBytes()); + return this; + } + + @Override + public XmlSerializer attribute(String namespace, String name, + String value) throws IOException, IllegalArgumentException, + IllegalStateException { + StringBuffer b = new StringBuffer(); + b.append(name); + b.append("=\""); + b.append(value); + b.append("\" "); + data.m_os.write(b.toString().getBytes()); + return this; + } + + @Override + public XmlSerializer endTag(String namespace, String name) + throws IOException, IllegalArgumentException, + IllegalStateException { + if( data.started){ + data.m_os.write(">".getBytes()); + data.started = false; + } + StringBuffer b = new StringBuffer(); + b.append(""); + data.m_os.write(b.toString().getBytes()); + return this; + } + + + @Override + public void setOutput(OutputStream os, String encoding) + throws IOException, IllegalArgumentException, + IllegalStateException { + // TODO Auto-generated method stub + data.m_os = os; + } + + + + + + + + + + + + + + + + + @Override + public void cdsect(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + // TODO Auto-generated method stub + + } + + @Override + public void comment(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + // TODO Auto-generated method stub + + } + + @Override + public void docdecl(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + // TODO Auto-generated method stub + + } + + @Override + public void endDocument() throws IOException, IllegalArgumentException, + IllegalStateException { + // TODO Auto-generated method stub + + } + + + @Override + public void entityRef(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + // TODO Auto-generated method stub + + } + + @Override + public void flush() throws IOException { + // TODO Auto-generated method stub + + } + + @Override + public int getDepth() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public boolean getFeature(String name) { + // TODO Auto-generated method stub + return false; + } + + @Override + public String getName() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getNamespace() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getPrefix(String namespace, boolean generatePrefix) + throws IllegalArgumentException { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getProperty(String name) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void ignorableWhitespace(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + // TODO Auto-generated method stub + + } + + @Override + public void processingInstruction(String text) throws IOException, + IllegalArgumentException, IllegalStateException { + // TODO Auto-generated method stub + + } + + @Override + public void setFeature(String name, boolean state) + throws IllegalArgumentException, IllegalStateException { + // TODO Auto-generated method stub + + } + + @Override + public void setOutput(Writer writer) throws IOException, + IllegalArgumentException, IllegalStateException { + // TODO Auto-generated method stub + + } + + @Override + public void setPrefix(String prefix, String namespace) + throws IOException, IllegalArgumentException, + IllegalStateException { + // TODO Auto-generated method stub + + } + + @Override + public void setProperty(String name, Object value) + throws IllegalArgumentException, IllegalStateException { + // TODO Auto-generated method stub + + } + + @Override + public XmlSerializer text(char[] buf, int start, int len) + throws IOException, IllegalArgumentException, + IllegalStateException { + // TODO Auto-generated method stub + return null; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/likesoft/mdedal/PreferActivity.java b/app/src/main/java/com/likesoft/mdedal/PreferActivity.java new file mode 100644 index 0000000..86163e6 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/PreferActivity.java @@ -0,0 +1,295 @@ +package com.likesoft.mdedal; + +import android.Manifest; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.preference.PreferenceManager; +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.provider.Settings; +import android.view.Menu; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +//import com.likesoft.mdedaltest.*; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import static com.likesoft.mdedal.ListActivity.LOG; + + +public class PreferActivity extends Activity { + + private static final int REQ_STORAGE_PERMISSION = 1001; + private static final int REQ_MANAGE_ALL_FILES = 2296; + + // EditText hostName; + EditText user; + EditText password; + EditText newpassword; +// CheckBox tablet; + // Spinner refresh; + //TextView version; + TextView textViewHostUrl; + + SharedPreferences prefs; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_prefer); + // hostName = (EditText) findViewById(R.id.editTextHost); + user = (EditText) findViewById(R.id.editTextUser); + password = (EditText) findViewById(R.id.editTextPassword); + newpassword = (EditText) findViewById(R.id.editTextNewPassword); + // tablet = (CheckBox) findViewById(R.id.checkBoxTablet); + // refresh = (Spinner) findViewById(R.id.spinner_refresh); + //version = (TextView) findViewById(R.id.textViewVersion); + + //textViewHostUrl + textViewHostUrl = (TextView) findViewById(R.id.textViewHostUrl); + + PackageInfo pinfo; + try { + pinfo = getPackageManager().getPackageInfo(getPackageName(), 0); + //versionNumber = pinfo.versionCode; + String versionName = pinfo.versionName; + //version.setText("Wersja aplikacji: "+versionName); + setTitle("Logowanie - Wersja aplikacji: "+versionName); + } catch (PackageManager.NameNotFoundException e2) { + Log.e(LOG, "", e2); + } + + Context context = getApplicationContext(); + + prefs = PreferenceManager.getDefaultSharedPreferences(context); + updateUI(); + //Log.d("my_debug", "oncreate prefs"); + + Button ok = (Button)findViewById(R.id.buttonSave); + ok.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View v) { + // Zanim zapiszemy preferencje, upewnijmy się, że mamy dostęp do pamięci + if (!hasStorageAccess()) { + requestStorageAccess(); + Toast.makeText(PreferActivity.this, "Brak uprawnień do zapisu w pamięci. Przyznaj uprawnienie i spróbuj ponownie.", Toast.LENGTH_LONG).show(); + return; + } + if( newpassword.getText().toString().length()>0){ + savePreferences(); + new Thread( new Runnable() { + @Override + public void run() { + DedalHttpConnection con = new DedalHttpConnection(getApplicationContext()); + Map params_post = new HashMap(); + params_post.put("oldpass", password.getText().toString()); + params_post.put("pass1", newpassword.getText().toString()); + params_post.put("pass2", newpassword.getText().toString()); + String response = ""; + try{ + response = con.sendPost("public/mobi.php?page=login_change", params_post); + }catch (Exception e){ + Log.e( "BLAD ", "Bląd połączenia"); + } + if( response.contains("zmienione") ) { + //jeśli się powiodło: + // password.setText(newpassword.getText()); + Editor e = prefs.edit(); + e.putString("password", DedalHelper.encodeB64(newpassword.getText().toString())); + e.commit(); + Log.d("PASSWORD", "hasło zostało zmienione na: "+ newpassword.getText().toString()); + //savePreferences(); + + Button ok = (Button)findViewById(R.id.buttonSave); + ok.post(new Runnable() { + @Override + public void run() { + Toast.makeText(PreferActivity.this, "Hasło zmienione.", Toast.LENGTH_LONG); + PreferActivity.this.setResult(RESULT_OK); + finish(); + } + }); + } + else { + Log.d("PASSWORD", "problem ze zmianą hasła, response: " + response); + Toast.makeText(PreferActivity.this, "Problem ze zmianą hasła", Toast.LENGTH_LONG); + } + + } + }).start(); + }else { + savePreferences(); + PreferActivity.this.setResult(RESULT_OK); + finish(); + } + } + + + }); + } + + private boolean hasStorageAccess() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + return Environment.isExternalStorageManager(); + } else { + int write = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); + int read = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); + return write == PackageManager.PERMISSION_GRANTED && read == PackageManager.PERMISSION_GRANTED; + } + } + + private void requestStorageAccess() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + try { + Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); + intent.setData(Uri.parse("package:" + getPackageName())); + startActivityForResult(intent, REQ_MANAGE_ALL_FILES); + } catch (Exception ex) { + Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); + startActivityForResult(intent, REQ_MANAGE_ALL_FILES); + } + } else { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, + REQ_STORAGE_PERMISSION); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == REQ_MANAGE_ALL_FILES) { + if (hasStorageAccess()) { + Toast.makeText(this, "Przyznano dostęp do plików.", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(this, "Dostęp do plików nadal zablokowany.", Toast.LENGTH_LONG).show(); + } + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == REQ_STORAGE_PERMISSION) { + boolean granted = true; + if (grantResults == null || grantResults.length == 0) granted = false; + for (int r : grantResults) { + if (r != PackageManager.PERMISSION_GRANTED) { granted = false; break; } + } + if (granted) { + Toast.makeText(this, "Uprawnienia do pamięci przyznane.", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(this, "Odmówiono uprawnień do pamięci.", Toast.LENGTH_LONG).show(); + } + } + } + + public static void deleteFiles(String path) { + + File file = new File(path); + + if (file.exists()) { + String deleteCmd = "rm -r " + path; + Runtime runtime = Runtime.getRuntime(); + try { + runtime.exec(deleteCmd); + } catch (IOException e) { } + } + } + + void savePreferences() { + // TODO Auto-generated method stub + + String currentHost = prefs.getString("hostName", "https://dedal.eos-ksi.pl"); + + Editor e = prefs.edit(); + e.putString("hostName", currentHost); +// e.putBoolean("tablet", tablet.isChecked()); + String login = user.getText().toString().trim(); + + if( login.contains("@")){ + String loginTable[] = login.split("@"); + e.putString("user", loginTable[0]); + if("reset".equals(loginTable[1]) ){ + e.putString("certSerialNumber", ""); + deleteFiles(Environment.getExternalStorageDirectory()+ "/dedal/"); + }else { + if( loginTable[1].startsWith("http")) { + e.putString("hostName", loginTable[1]); + } + } + login = loginTable[0]; + }else { + e.putString("user", login); + } + e.putString("password", DedalHelper.encodeB64(password.getText().toString())); +// e.putInt("refresh", refresh.getSelectedItemPosition()); + String dirPath = Environment.getExternalStorageDirectory()+ "/dedal/"+ login; + e.putString("dir", dirPath); + e.putBoolean("tablet", true); + e.putInt("refresh", 2); + + e.commit(); + + // Utwórz folder użytkownika jeśli nie istnieje + try { + File dir = new File(dirPath); + if (!dir.exists()) { + boolean ok = dir.mkdirs(); + if (!ok) { + Toast.makeText(this, "Nie można utworzyć katalogu:" + dirPath, Toast.LENGTH_LONG).show(); + } + } + } catch (Throwable t) { + Log.e(LOG, "Błąd tworzenia katalogu: " + t.getMessage(), t); + } + + //usunięcie starej aplikacji: + deleteFiles(Environment.getExternalStorageDirectory()+ "/likesoft"); + deleteFiles(Environment.getExternalStorageDirectory()+ "/likesofttest"); + + File fLockLogin = new File(prefs.getString("dir", "") + "/dedalsrv.wrongLogin"); + if( fLockLogin.exists()){ + fLockLogin.delete(); + } + + } + private void updateUI() { +// tablet.setChecked(prefs.getBoolean("tablet", false)); +// hostName.setText(prefs.getString("hostName", "http://likesoft/dedal/develop/psql")); +// hostName.setText(prefs.getString("hostName", "https://dedal.eos-ksi.pl")); + user.setText(prefs.getString("user", "")); + password.setText(""); + textViewHostUrl.setText(prefs.getString("hostName", "https://dedal.eos-ksi.pl")); + + //password.setText(prefs.getString("password", "")); +// refresh.setSelection(prefs.getInt("refresh", 0)); + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.prefer, menu); + return true; + } + +} diff --git a/app/src/main/java/com/likesoft/mdedal/RefreshLayoutAndThread.java b/app/src/main/java/com/likesoft/mdedal/RefreshLayoutAndThread.java new file mode 100644 index 0000000..aaa3477 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/RefreshLayoutAndThread.java @@ -0,0 +1,294 @@ +package com.likesoft.mdedal; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.os.AsyncTask; +import android.preference.PreferenceManager; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + + +import java.io.File; +import java.io.FileInputStream; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * Created by Kamil on 2016-02-04. + */ +abstract class RefreshLayoutAndThread extends Thread implements Runnable { + + private final static int THREAD_PERIOD = 1000; + public boolean pauseThread = false; + + Context context; + SharedPreferences prefs; + LinearLayout refreshLayout; + + //// + long lastProfileMod = 0; + TextView textDataMod; + TextView textUpload = null; + ProgressBar progress; + String sLastInfo = ""; + boolean stare = false; + + public RefreshLayoutAndThread(Context context) { + this.context = context; + prefs = PreferenceManager.getDefaultSharedPreferences(context); + + textUpload = new TextView(context); + textUpload.setPadding(20, 0, 20, 0); + } + + //protected abstract void reloadContent(); + protected abstract void whenThreadNeedToReaoad(); + protected abstract void setLastGPSInfo_abstr(); + protected void onServiceFinisz() { + + } + + public LinearLayout getRefreshLayout() { + refreshLayout = new LinearLayout(context); + + //LinearLayout refreshLayout = new LinearLayout(this); + //filterL.addView(refreshLayout); + + + + textDataMod = new TextView(context); + // = tw; + textDataMod.setTextAppearance(context, R.style.OpisTextLista); + refreshLayout.addView(textDataMod); + + progress = new ProgressBar(context); + progress.setProgress(50); + refreshLayout.addView(progress); + + + AsyncTask at = new AsyncTask() { + @Override + protected Object doInBackground(Object[] objects) { + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + if( dLista.isFile()){ + long lastMod = dLista.lastModified(); + lastProfileMod = lastMod; + setLastInfo(lastProfileMod); + } + return null; + } + }; + at.execute(); + + Button b = new Button(context); + b.setText("Odśwież"); + b.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + pauseThread = false; + //Context context = getApplicationContext(); + + Alarm alarm = new Alarm(); + alarm.CancelAlarm(context); + alarm.SetAlarm(context); + + Intent service = new Intent(context, DedalService.class); + context.startService(service); + + //todo: temp commented + //search = ""; + + //wyswietlListe(); + } + }); + + refreshLayout.addView(b); //refresh button + + return refreshLayout; + } + + public TextView getTextUpload () { + return textUpload; + } + + @Override + public void run() { + // TODO Auto-generated method stub + while( true){ + try { + Thread.sleep(THREAD_PERIOD); + if( pauseThread ) { + //Log.d("RefreshLayoutAndThread", "pause"); + } + else { + //Log.d("RefreshLayoutAndThread", "thread working"); + setLastGPSInfo_abstr(); + setLastUpdateInfo(); + setLastInfo(lastProfileMod); + + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + if (dLista.isFile()) { + long lastMod = dLista.lastModified(); + if (lastProfileMod != lastMod) { + lastProfileMod = lastMod; +// setLastInfo(lastProfileMod); +// + + textDataMod.post(new Runnable() { + @Override + public void run() { + + whenThreadNeedToReaoad(); +// ListActivity.this.recreate(); + //ListActivity.this.finish(); + } + }); + + } + } + } + } catch (InterruptedException e) { + Log.d("RefreshLayoutAndThread", "interrupted"); + break; + } + + } + + } + + private void setLastInfo(long lastProfileMod){ + //gps.isGPSEnabled + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date d = new Date(lastProfileMod); + Date dCurrent = new Date(); + long c = dCurrent.getTime() - 60*60*1000; //godzina + //Date dCurrent = new Date(); + // boolean stare = false; + + if( lastProfileMod < c){ + // dawno nie było aktualizacji + stare = true; + }else{ + stare = false; + } + + File dQ = new File(prefs.getString("dir", "") + "/queue"); + if( dQ.isDirectory() && dQ.list().length>0 ){ + //sAktualizacja = "Trwa pobieranie zleceń ("+dQ.list().length+")..."; + sLastInfo = "Trwa pobieranie zleceń ("+dQ.list().length+")... \nPoprzednia:" + + sdf.format(d); + } + else { + //sAktualizacja = ""; + sLastInfo = "Ostatnia aktualizacja:\n"; + sLastInfo += sdf.format(d); + // sLastInfo += "\n" + sdf.format(c) + " stare: " + stare; + } + + //sLastInfo = "Ostatnia akutalizacja:\n" + sdf.format(d); + + textDataMod.post(new Runnable() { + @Override + public void run() { + textDataMod.setText(sLastInfo); + + if(stare) { + textDataMod.setBackgroundColor(Color.RED); + }else{ + + textDataMod.setBackgroundColor(Color.TRANSPARENT); + //textDataMod.setTextAppearance(context, R.style.OpisTextLista); + //textDataMod.setTextAppearance(); + } + } + }); + + } + + + private int licznikUpdates=0; + private String sAktualizacja = ""; + + public void setLastUpdateInfo(){ + File fLockEnd = new File(prefs.getString("dir", "") + "/dedalsrv.lock"); + if( fLockEnd.exists()){ + + //sAktualizacja = "Aktualizacja\n zleceń ";// + kreciolek[licznikUpdates % 4]; + //licznikUpdates++; + licznikUpdates=1; + }else{ + licznikUpdates = 0; + +// File d = new File(prefs.getString("dir", "") + "/queue"); +// if( d.isDirectory() && d.list().length>0 ){ +// sAktualizacja = "Trwa pobieranie zleceń ("+d.list().length+")..."; +// } +// else { +// sAktualizacja = ""; +// } + } + sAktualizacja = ""; + + File fconn = new File(prefs.getString("dir", "") + "/dedalsrv.connection"); + if( fconn.exists()){ + sAktualizacja = "!";//Problem z połączeniem! VPN lub błędne hasło."; + } + File fLockCon = new File(prefs.getString("dir", "") + "/dedalsrv.connection_password"); + if( fLockCon.exists()){ + sAktualizacja = "Zmien hasło, zlecenie NIE zapisane!"; + } + + File fConnectionStatus = new File(prefs.getString("dir", "") + "/dedal.status"); + if( fConnectionStatus.exists()){ + String msg = ""; + try { + FileInputStream fin = new FileInputStream(fConnectionStatus); + msg = ListActivity.readFile(fin); + }catch (Exception e){ + Log.e("ListActivity", e.getMessage(), e); + + } + sAktualizacja += msg; + } + + + File fLockLogin = new File(prefs.getString("dir", "") + "/dedalsrv.wrongLogin"); + if( fLockLogin.exists()){ + sAktualizacja = "Ustaw login i hasło. "; + if(fLockLogin.exists()){ + if( context instanceof ListActivity) { + ListActivity lA = (ListActivity)context; + fLockLogin.delete(); + Intent i = new Intent(lA, lA.getPreferActivity()); + lA.startActivityForResult(i, lA.SHOW_PREFERENCES); + } + } + } + + textUpload.post(new Runnable() { + @Override + public void run() { + textUpload.setText(sAktualizacja); + if( "".equals(sAktualizacja)){ + textUpload.setBackgroundColor(Color.parseColor("white")); + }else{ + textUpload.setBackgroundColor(Color.parseColor("yellow")); + } + if( licznikUpdates==0){ + if( progress.getVisibility() == View.VISIBLE ) { + onServiceFinisz(); + } + progress.setVisibility(View.INVISIBLE); + }else{ + progress.setVisibility(View.VISIBLE); + } + } + }); + } +} diff --git a/app/src/main/java/com/likesoft/mdedal/TableHeadersActivity.java b/app/src/main/java/com/likesoft/mdedal/TableHeadersActivity.java new file mode 100644 index 0000000..a70ca04 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/TableHeadersActivity.java @@ -0,0 +1,817 @@ +package com.likesoft.mdedal; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.util.Date; +import java.util.Iterator; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.likesoft.mdedal.gui.BorderTextView; +import com.likesoft.mdedal.gui.MTextView; +//import com.likesoft.mdedaltest.*; +import com.likesoft.mdedaldemo.*; + +import android.app.Activity; +import android.content.ClipData; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.graphics.Point; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.view.Display; +//import android.util.Log; +import android.view.DragEvent; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.DragShadowBuilder; +import android.view.View.OnClickListener; +import android.view.View.OnDragListener; +import android.view.View.OnTouchListener; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.GridView; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.ScrollView; +import android.widget.TextView; + +public class TableHeadersActivity extends Activity { + + String id_profilu = null; + String nazwa_profilu = null; + LinearLayout lContent = null; + LinearLayout lContent_nieuzyte = null; + JSONArray jkolumny_all = null; + SharedPreferences prefs; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Context context = getApplicationContext(); + prefs = PreferenceManager.getDefaultSharedPreferences(context); + Log.setFileName(prefs.getString("dir", "")); + Log.setEH(); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + id_profilu = extras.getString("id_profilu"); + } + + File dtemp1 = new File(prefs.getString("dir", "") + "/temp/widok_profil_temp_"+id_profilu+".json"); + dtemp1.delete(); + + loadjKolumny_all(); + + HorizontalScrollView lMainScroll = new HorizontalScrollView(this); + LinearLayout lMain = new LinearLayout(this); + + ScrollView vertScroll = new ScrollView(this); + lMainScroll.addView(vertScroll); + + vertScroll.addView(lMain); + lMain.setOrientation(LinearLayout.VERTICAL); + lMain.setOnDragListener(new MyDragListenerBack()); + + LinearLayout lHeader = new LinearLayout(this); + lHeader.setOrientation(LinearLayout.VERTICAL); + lMain.addView(lHeader); + + lContent = new LinearLayout(this); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); + + layoutParams.setMargins(0, 0, 0, 30); + lContent.setLayoutParams(layoutParams); + + Display display = getWindowManager().getDefaultDisplay(); + Point size = new Point(); + display.getSize(size); + int width = size.x; + + lContent.setMinimumWidth(width); + lMain.addView(lContent); + // lContent.setMinimumHeight(30); + lContent.setBackgroundColor(Color.YELLOW); + lContent.setOnDragListener(new MyDragListener_move_end(Color.CYAN, Color.YELLOW)); + + //lContent.setLayoutParams(new LinearLayout.LayoutParams(300,600)); + + lContent_nieuzyte = new LinearLayout(this); + lMain.addView(lContent_nieuzyte); + lContent_nieuzyte.setMinimumHeight(55); + lContent_nieuzyte.setBackgroundColor(Color.DKGRAY); + lContent_nieuzyte.setOnDragListener(new MyDragListener_nieuzyte(Color.CYAN, Color.DKGRAY)); + lContent_nieuzyte.setLayoutParams(layoutParams); + + TextView tw = new TextView(this); + lHeader.addView(tw); + if( id_profilu == null ) { + + tw.setText("Nie wykryto id_profilu !"); + Log.d("my_debug", "nie wykryto profilu"); + setContentView(lMainScroll); + //setContentView(lMain); + return ; + } + + //EditText et = new EditText(this); + tw.setTextSize(20); + tw.setPadding(5,5,5,5); + tw.setText("Profil: "+nazwa_profilu); + + TextView tw_opis = new TextView(this); + lHeader.addView(tw_opis); + tw_opis.setPadding(5,5,5,15); + tw_opis.setText("Poniżej wyświetlona jest lista nagłówków z tabeli listy zleceń. Poniższy układ jest wczytywany dla profilu: "+nazwa_profilu+".\n" + + "Aby zmienić układ, naciśnij wybrany element, przytrzymaj a następnie przesuń w wybrane miejsce. \n" + + "Aby dany element nie był wyświetlany w tabeli zleceń, przesuń go na dolny szary pasek. \n" + + "Po zakończeniu ustawiania nagłówków, kliknij 'Zapisz układ'. Wtedy nastąpi wysłanie układu na serwer. \n" + + "Zostaniesz przekierowany na listę zleceń i należy poczekać aż lista przeładuje się z nowym układem.\n" + + "UWAGA: Zmiana nagłówków działa tylko w trybie online (wymaga aktywnego połączenia internetowego).\n" + + "Przycisk: 'Przywróć ustawienia domyślne' - skasuje ustawienia nagłówków i przywróci domyślny układ. \n" + + "\tPo naciśnięciu aplikacja przejdzie do listy zleceń. Należy poczekać aż system skomunikuje się z serwerem i przeładuję liste.\n" + + "Przycisk 'Cofnij zmiany' - skasuje aktualne ustawienie\n" + + "Przycisk 'Wyjdź' - skasuje aktualne ustawienie i wyjdzie do listy zleceń"); + + + ////////// + + drawContent(); + + LinearLayout footer = new LinearLayout(this); + footer.setOrientation(LinearLayout.HORIZONTAL); + lMain.addView(footer); + + Button zapisz = new Button(this); + zapisz.setText("Zapisz układ"); + zapisz.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + Date d = new Date(); + String genName = "widok_profil_"+d.getTime() + ".mod"; + File dstDir = new File(prefs.getString("dir", "") + "/upload_widok_profil_mod"); + if( !dstDir.isDirectory()){ dstDir.mkdirs(); } + File fMod = new File(prefs.getString("dir", "") + "/upload_widok_profil_mod/" + genName); + + File dtemp = new File(prefs.getString("dir", "") + "/temp/widok_profil_temp_"+id_profilu+".json"); + if ( dtemp.exists() ) { + JSONObject jFile; + try { + String s = DedalHelper.getFileContent(dtemp.getAbsolutePath()); + jFile = new JSONObject(s); + jFile.put("id_profilu", id_profilu); + DedalHelper.putFileContent(dtemp.getAbsolutePath(), jFile.toString()); + } catch (JSONException e) { + Log.e("TableHeadersActivity", "", e); + } + } + + // wystartuj/obudz serwis + Context context = getApplicationContext(); + Intent service = new Intent(context, DedalService.class); + context.startService(service); + + finish(); + + } + }); + footer.addView(zapisz); + + Button przywroc = new Button(this); + przywroc.setText("Przywróć domyślny układ nagłówków"); + przywroc.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + try { + File dtemp1 = new File(prefs.getString("dir", "") + "/temp/widok_profil_temp_"+id_profilu+".json"); + dtemp1.delete(); + + JSONObject jF = new JSONObject(); + jF.put("id_profilu", id_profilu); + jF.put("reset", "true"); + + Date d = new Date(); + String genName = "widok_profil_"+d.getTime() + ".mod"; + DedalHelper.putFileContent(prefs.getString("dir", "") + "/upload_widok_profil_mod/" + genName, jF.toString()); + } catch (JSONException e) { + //e.printStackTrace(); + Log.e("TableHeadersActivity", "", e); + } + + // wystartuj/obudz serwis + Context context = getApplicationContext(); + Intent service = new Intent(context, DedalService.class); + context.startService(service); + + finish(); + } + }); + footer.addView(przywroc); + + Button clear = new Button(this); + clear.setText("Cofnij zmiany"); + clear.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + File dtemp1 = new File(prefs.getString("dir", "") + "/temp/widok_profil_temp_"+id_profilu+".json"); + dtemp1.delete(); + + TableHeadersActivity.this.recreate(); + } + }); + footer.addView(clear); + + Button wyjdz = new Button(this); + wyjdz.setText("Wyjdź"); + wyjdz.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + File dtemp1 = new File(prefs.getString("dir", "") + "/temp/widok_profil_temp_"+id_profilu+".json"); + dtemp1.delete(); + //TableHeadersActivity.this.recreate(); + finish(); + //drawContent(); + } + }); + footer.addView(wyjdz); + + setContentView(lMainScroll); + + this.setTitle("Zarządzanie nagłówkami tabeli"); + } + + private void loadjKolumny_all() { + BufferedReader buf; + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + + + JSONObject jFile; + try { + + String sJson = DedalHelper.getFileContent(dLista.getAbsolutePath()); + jFile = new JSONObject(sJson); + + JSONObject jProfiles = jFile.getJSONObject("profile"); + JSONObject jProfil = jProfiles.getJSONObject(id_profilu); + nazwa_profilu = jProfil.getString("nazwa_profilu"); + JSONArray jKolumny_uzyte = jProfil.getJSONArray("profil_kolumny"); + //if( jProfil.has("kolumny_nieuzyte") && !jProfil.getString("kolumny_nieuzyte").equals("null") && jProfil.getJSONArray("kolumny_nieuzyte") != null ) { + JSONArray jKolumny_nieuzyte = jProfil.getJSONArray("kolumny_nieuzyte"); + jkolumny_all = new JSONArray(jKolumny_uzyte.toString()); + if( jKolumny_nieuzyte != null && jKolumny_nieuzyte.length() > 0 ) { + for( int i = 0 ; i < jKolumny_nieuzyte.length() ; i++ ) { + jkolumny_all.put( jKolumny_nieuzyte.getJSONObject(i) ); + } + } + //} + //Log.d("my_debug", "jkolumny_all: "+jkolumny_all.toString()); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + Log.e("DEDAL", "blad parsowania lista.profil", e); + } + + + + } + + private void drawContent() { + try { + //lContent = null; + lContent.removeAllViews(); + BufferedReader buf; + JSONArray jKolumny = null; + File dtemp = new File(prefs.getString("dir", "") + "/temp/widok_profil_temp_"+id_profilu+".json"); + if ( dtemp.exists() ) { + String sJson = DedalHelper.getFileContent(dtemp.getAbsolutePath()); + JSONObject jFile = new JSONObject(sJson); + jKolumny = jFile.getJSONArray("profil_kolumny"); + Log.d("my_debug", "1: "+jKolumny.toString()); + } + else { + File dLista = new File(prefs.getString("dir", "") + "/baza/lista.profil"); + String sJson = DedalHelper.getFileContent(dLista.getAbsolutePath()); + + JSONObject jFile = new JSONObject(sJson); + + JSONObject jProfiles = jFile.getJSONObject("profile"); + JSONObject jProfil = jProfiles.getJSONObject(id_profilu); + jKolumny = jProfil.getJSONArray("profil_kolumny"); + + } + int k = 0; + for( k = 0; k < jKolumny.length(); k++) + { + BorderTextView mtw = new BorderTextView(this); + +// RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); +// params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE); +// mtw.setLayoutParams(params); + + mtw.setTextAppearance(this, R.style.OpisText); + mtw.setPadding(15, 15, 15, 15); + String kod = jKolumny.getJSONObject(k).getString("kod"); + mtw.setCode(kod); + mtw.setId(k); + String nazwa = jKolumny.getJSONObject(k).getString("nazwa"); + mtw.setText(nazwa); + //tw.setBackgroundColor(Color.parseColor("#AFA5F0"));// #FAFAD2 + //mtw.setPadding(5, 3, 5, 2); +// tw.setTextSize(TypedValue.COMPLEX_UNIT_MM, 5); + mtw.setBackgroundColor(Color.GREEN); + + mtw.setOnTouchListener(new MyTouchListener()); + mtw.setOnDragListener(new MyDragListener(Color.CYAN, Color.GREEN)); + + lContent.addView(mtw); + } + TextView tw_end = new TextView(this); + tw_end.setPadding(0, 18, 0, 18); + tw_end.setText(" "); + tw_end.setWidth(150); + lContent.addView(tw_end); + + lContent_nieuzyte.removeAllViews(); + Log.d("my_debug", "Ajkolumny_all: "+jkolumny_all.toString()); + boolean cont = false; + for( int m=0; m < jkolumny_all.length(); m++) + { + cont = false; + // sprawdz czy jest używany + for( int l=0; l< jKolumny.length(); l++) + { + //Log.d("my_debug", "uzyty: "+jKolumny.getJSONObject(l).getString("kod")+", all: "+jkolumny_all.getJSONObject(k).getString("kod")); + if( jKolumny.getJSONObject(l).getString("kod").equals(jkolumny_all.getJSONObject(m).getString("kod")) ) { + cont = true; + break; + } + } + if( cont ) { + continue; + } + + BorderTextView mtw = new BorderTextView(this); + mtw.setTextAppearance(this, R.style.OpisText); + mtw.setPadding(15, 15, 15, 15); + String kod = jkolumny_all.getJSONObject(m).getString("kod"); + mtw.setCode(kod); + k++; + mtw.setId(k); + String nazwa = jkolumny_all.getJSONObject(m).getString("nazwa"); + mtw.setText(nazwa); + mtw.setBackgroundColor(Color.RED); + + mtw.setOnTouchListener(new MyTouchListener()); + //mtw.setOnDragListener(new MyDragListener()); + lContent_nieuzyte.addView(mtw); + } + + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + class MyDragListenerBack implements OnDragListener { + + @Override + public boolean onDrag(View onDropEl, DragEvent event) { + int action = event.getAction(); + View movingEl = (View) event.getLocalState(); + switch (event.getAction()) { + case DragEvent.ACTION_DRAG_STARTED: + // do nothing + break; + case DragEvent.ACTION_DRAG_ENTERED: + //v.setBackgroundDrawable(enterShape); + //onDropEl.setBackgroundColor(Color.GRAY); + break; + case DragEvent.ACTION_DRAG_EXITED: + //v.setBackgroundDrawable(normalShape); + //onDropEl.setBackgroundColor(Color.RED); + break; + case DragEvent.ACTION_DROP: + // Dropped, reassign View to ViewGroup + movingEl.setVisibility(View.VISIBLE); + movingEl.setAlpha(1); + break; + case DragEvent.ACTION_DRAG_ENDED: + //v.setBackgroundDrawable(normalShape); + default: + break; + } + return true; + } + + } + + class MyDragListener implements OnDragListener { + + int color_entered = 0; + int color_exited = 0; + + public MyDragListener(int color_entered, int color_exited) { + this.color_entered = color_entered; + this.color_exited = color_exited; + } + + @Override + public boolean onDrag(View onDropEl, DragEvent event) { + int action = event.getAction(); + View movingEl = (View) event.getLocalState(); + + int id_moving = movingEl.getId(); + int id_drop = onDropEl.getId(); + + + + int side = Math.round(event.getX() - onDropEl.getMeasuredWidth() / 2 ); // side < 0 uposzczone po lewej stronie elementu, side > 0 upuszczone po prawej stronie + switch (event.getAction()) { + case DragEvent.ACTION_DRAG_STARTED: + // do nothing + break; + case DragEvent.ACTION_DRAG_ENTERED: + //v.setBackgroundDrawable(enterShape); + + onDropEl.setBackgroundColor(color_entered); + break; + case DragEvent.ACTION_DRAG_EXITED: + //v.setBackgroundDrawable(normalShape); + onDropEl.setBackgroundColor(color_exited); + break; + case DragEvent.ACTION_DROP: + // Dropped, reassign View to ViewGroup + + if( id_moving == id_drop ) { + movingEl.setAlpha(1); + movingEl.setBackgroundColor(color_exited); + break; + } + + JSONObject jmain = new JSONObject(); + JSONArray jprofil = new JSONArray(); + // create Json + +// float x = event.getX(); +// float y = event.getY(); + + + Log.d("my_debug", "side: "+side); + + + try { + for (int i = 0 ; i < 200 ; i++ ) { + MTextView v = (MTextView)TableHeadersActivity.this.findViewById(i); + if ( v == null) { + break; + } + if( i == id_drop || i == id_moving) { + //if( id_drop < id_moving ) { + if( i == id_drop ) { + //i = id_moving; + MTextView v_temp = null; + JSONObject jcurr = null; + if(side >= 0 ) { + + v_temp = (MTextView)TableHeadersActivity.this.findViewById(id_drop); + jcurr = new JSONObject(); + jcurr.put("kod", v_temp.getCode()); + jcurr.put("nazwa", v_temp.getText()); + jprofil.put(jcurr); + + v_temp = (MTextView)TableHeadersActivity.this.findViewById(id_moving); + if( v_temp != null ) { + jcurr = new JSONObject(); + jcurr.put("kod", v_temp.getCode()); + jcurr.put("nazwa", v_temp.getText()); + jprofil.put(jcurr); + } + } + else { + v_temp = (MTextView)TableHeadersActivity.this.findViewById(id_moving); + if( v_temp != null ) { + jcurr = new JSONObject(); + jcurr.put("kod", v_temp.getCode()); + jcurr.put("nazwa", v_temp.getText()); + jprofil.put(jcurr); + } + + v_temp = (MTextView)TableHeadersActivity.this.findViewById(id_drop); + jcurr = new JSONObject(); + jcurr.put("kod", v_temp.getCode()); + jcurr.put("nazwa", v_temp.getText()); + jprofil.put(jcurr); + } + } + if( i == id_moving ) { + continue; + } + } + else { + JSONObject jcurr = new JSONObject(); + + jcurr.put("kod", v.getCode()); + jcurr.put("nazwa", v.getText()); + jprofil.put(jcurr); + } + } + + jmain.put("profil_kolumny", jprofil); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + onDropEl.setBackgroundColor(Color.DKGRAY); + movingEl.setVisibility(View.VISIBLE); + + String genName = "widok_profil_temp_"+id_profilu+".json"; + File dstDir = new File(prefs.getString("dir", "") + "/temp"); + if( !dstDir.isDirectory()){ dstDir.mkdirs(); } + File fMod = new File(prefs.getString("dir", "") + "/temp/" + genName); + FileOutputStream fos; + try { + fos = new FileOutputStream(fMod); + fos.write(jmain.toString().getBytes()); + fos.flush(); + fos.close(); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //TableHeadersActivity.this.recreate(); + drawContent(); + + break; + case DragEvent.ACTION_DRAG_ENDED: + //v.setBackgroundDrawable(normalShape); + default: + break; + } + return true; + } + + } + + class MyDragListener_move_end implements OnDragListener { + + //nieużywane + int color_entered = 0; + int color_exited = 0; + + public MyDragListener_move_end(int color_entered, int color_exited) { + this.color_entered = color_entered; + this.color_exited = color_exited; + } + + @Override + public boolean onDrag(View onDropEl, DragEvent event) { + int action = event.getAction(); + View movingEl = (View) event.getLocalState(); + + //int side = Math.round(event.getX() - onDropEl.getMeasuredWidth() / 2 ); // side < 0 uposzczone po lewej stronie elementu, side > 0 upuszczone po prawej stronie + switch (event.getAction()) { + case DragEvent.ACTION_DRAG_STARTED: + // do nothing + break; + case DragEvent.ACTION_DRAG_ENTERED: + //v.setBackgroundDrawable(enterShape); + //onDropEl.setBackgroundColor(color_entered); + break; + case DragEvent.ACTION_DRAG_EXITED: + //v.setBackgroundDrawable(normalShape); + //onDropEl.setBackgroundColor(color_exited); + break; + case DragEvent.ACTION_DROP: + // Dropped, reassign View to ViewGroup + + int id_moving = movingEl.getId(); + int id_drop = onDropEl.getId(); + + JSONObject jmain = new JSONObject(); + JSONArray jprofil = new JSONArray(); + // create Json + +// float x = event.getX(); +// float y = event.getY(); + + + //Log.d("my_debug", "side: "+side); + + + try { + for (int i = 0 ; i < 200 ; i++ ) { + MTextView v = (MTextView)TableHeadersActivity.this.findViewById(i); + if ( v == null) { + break; + } + + if( i == id_moving ) { + continue; + } + else { + JSONObject jcurr = new JSONObject(); + + jcurr.put("kod", v.getCode()); + jcurr.put("nazwa", v.getText()); + jprofil.put(jcurr); + } + } + MTextView v_temp = null; + JSONObject jcurr = null; + v_temp = (MTextView)TableHeadersActivity.this.findViewById(id_moving); + if( v_temp != null ) { + jcurr = new JSONObject(); + jcurr.put("kod", v_temp.getCode()); + jcurr.put("nazwa", v_temp.getText()); + jprofil.put(jcurr); + } + + jmain.put("profil_kolumny", jprofil); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + onDropEl.setBackgroundColor(Color.YELLOW); + movingEl.setVisibility(View.VISIBLE); + + String genName = "widok_profil_temp_"+id_profilu+".json"; + File dstDir = new File(prefs.getString("dir", "") + "/temp"); + if( !dstDir.isDirectory()){ dstDir.mkdirs(); } + File fMod = new File(prefs.getString("dir", "") + "/temp/" + genName); + FileOutputStream fos; + try { + fos = new FileOutputStream(fMod); + fos.write(jmain.toString().getBytes()); + fos.flush(); + fos.close(); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //TableHeadersActivity.this.recreate(); + drawContent(); + + break; + case DragEvent.ACTION_DRAG_ENDED: + //v.setBackgroundDrawable(normalShape); + default: + break; + } + return true; + } + + } + + class MyDragListener_nieuzyte implements OnDragListener { + + int color_entered = 0; + int color_exited = 0; + + public MyDragListener_nieuzyte(int color_entered, int color_exited) { + this.color_entered = color_entered; + this.color_exited = color_exited; + } + + @Override + public boolean onDrag(View onDropEl, DragEvent event) { + int action = event.getAction(); + View movingEl = (View) event.getLocalState(); + switch (event.getAction()) { + case DragEvent.ACTION_DRAG_STARTED: + // do nothing + break; + case DragEvent.ACTION_DRAG_ENTERED: + //v.setBackgroundDrawable(enterShape); + onDropEl.setBackgroundColor(color_entered); + break; + case DragEvent.ACTION_DRAG_EXITED: + //v.setBackgroundDrawable(normalShape); + onDropEl.setBackgroundColor(color_exited); + break; + case DragEvent.ACTION_DROP: + // Dropped, reassign View to ViewGroup + + int id_moving = movingEl.getId(); + int id_drop = onDropEl.getId(); + + JSONObject jmain = new JSONObject(); + JSONArray jprofil = new JSONArray(); + // create Json + try { + for (int i = 0 ; i < 200 ; i++ ) { + MTextView v = (MTextView)TableHeadersActivity.this.findViewById(i); + if ( v == null) { + break; + } + if( i == id_drop || i == id_moving) { + //if( id_drop < id_moving ) { + if( i == id_drop ) { + //i = id_moving; + MTextView v_temp = null; + JSONObject jcurr = null; + v_temp = (MTextView)TableHeadersActivity.this.findViewById(id_drop); + jcurr = new JSONObject(); + jcurr.put("kod", v_temp.getCode()); + jcurr.put("nazwa", v_temp.getText()); + jprofil.put(jcurr); + + v_temp = (MTextView)TableHeadersActivity.this.findViewById(id_moving); + if( v_temp != null ) { + jcurr = new JSONObject(); + jcurr.put("kod", v_temp.getCode()); + jcurr.put("nazwa", v_temp.getText()); + jprofil.put(jcurr); + } + } + if( i == id_moving ) { + continue; + } + } + else { + JSONObject jcurr = new JSONObject(); + + jcurr.put("kod", v.getCode()); + jcurr.put("nazwa", v.getText()); + jprofil.put(jcurr); + } + } + + jmain.put("profil_kolumny", jprofil); + } catch (JSONException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + onDropEl.setBackgroundColor(Color.DKGRAY); + movingEl.setVisibility(View.VISIBLE); + + String genName = "widok_profil_temp_"+id_profilu+".json"; + File dstDir = new File(prefs.getString("dir", "") + "/temp"); + if( !dstDir.isDirectory()){ dstDir.mkdirs(); } + File fMod = new File(prefs.getString("dir", "") + "/temp/" + genName); + FileOutputStream fos; + try { + fos = new FileOutputStream(fMod); + fos.write(jmain.toString().getBytes()); + fos.flush(); + fos.close(); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //TableHeadersActivity.this.recreate(); + drawContent(); + + break; + case DragEvent.ACTION_DRAG_ENDED: + //v.setBackgroundDrawable(normalShape); + default: + break; + } + return true; + } + + } + + private final class MyTouchListener implements OnTouchListener { + + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + ClipData data = ClipData.newPlainText("", ""); + DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); + view.startDrag(data, shadowBuilder, view, 0); + //int alpha = 0; + //((TextView) view).setTextColor(Color.argb(alpha, 255, 0, 0)); + view.setAlpha((float)0.3); + //view.setBackgroundColor(Color.YELLOW); + //view.setVisibility(View.INVISIBLE); + return true; + } else { + return false; + } + } + } +} diff --git a/app/src/main/java/com/likesoft/mdedal/TimePickerFragment.java b/app/src/main/java/com/likesoft/mdedal/TimePickerFragment.java new file mode 100644 index 0000000..e585b40 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/TimePickerFragment.java @@ -0,0 +1,99 @@ +package com.likesoft.mdedal; + +import android.app.Activity; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.TimePickerDialog; +import android.content.Intent; +import android.os.Bundle; +import android.widget.TextView; +import android.widget.TimePicker; +import android.widget.Toast; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.GregorianCalendar; + +/** + * Created by Kamil on 2016-05-12. + */ +public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { + + public Integer nr_zlecenia; + public Activity act; + public String data_walidacja_do = null; + public TextView tv = null; + public Calendar setDate = null; + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + // Use the current date as the default date in the picker + final Calendar c = Calendar.getInstance(); + int hour = c.get(Calendar.HOUR_OF_DAY); + int minute = c.get(Calendar.MINUTE); + //int day = c.get(Calendar.DAY_OF_MONTH); + + // Create a new instance of DatePickerDialog and return it + return new TimePickerDialog(getActivity(), this, hour, minute, true); + } + + private static final String DATA_KOD = "nast_wizyta_data"; + + @Override + public void onTimeSet(TimePicker timePicker, int i, int i2) { + setDate.add(Calendar.HOUR, i); + setDate.add(Calendar.MINUTE, i2); + +// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); +// String date_string = sdf.format(setDate.getTime()); + + + Calendar c = setDate; //new GregorianCalendar(year, month, day); + Calendar cToday = new GregorianCalendar(); + + Calendar data_walidacja_do_cal = null; + if( data_walidacja_do != null ) { + try { + data_walidacja_do_cal = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + data_walidacja_do_cal.setTime(sdf.parse(data_walidacja_do));// all done + } catch (ParseException e) { + e.printStackTrace(); + } + } + + + if( cToday.compareTo(c)>0){ + Toast.makeText(act.getApplicationContext(), + "Nie można wybrać daty wstecznej dla wizyty nr: " + nr_zlecenia, + Toast.LENGTH_LONG).show(); + } + else if( data_walidacja_do_cal != null && c.compareTo(data_walidacja_do_cal)>0 ) { + Toast.makeText(act.getApplicationContext(), + "Nie można wybrać daty przekraczającej datę obsługi: " + data_walidacja_do, + Toast.LENGTH_LONG).show(); + } + else { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + String cString = sdf.format(c.getTime()); + + AsyncCallChangeDate task = new AsyncCallChangeDate(act, nr_zlecenia + "", DATA_KOD, cString) { + @Override + protected void reloadContent() { + // drawContent(); + final Intent intent = new Intent(); + intent.setAction("blah"); + getActivity().sendBroadcast(intent); + dismiss(); + } + + @Override + public void loadInputs() { + // loadJsons(); + } + }; // week_day_dates[id_drop]); + task.execute(); + } + } +} diff --git a/app/src/main/java/com/likesoft/mdedal/gui/BorderLinearLayout.java b/app/src/main/java/com/likesoft/mdedal/gui/BorderLinearLayout.java new file mode 100644 index 0000000..469eef2 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/gui/BorderLinearLayout.java @@ -0,0 +1,45 @@ +package com.likesoft.mdedal.gui; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.widget.LinearLayout; + +/** + * Created by Kamil on 2016-01-23. + */ +public class BorderLinearLayout extends LinearLayout { + + int color; + + public BorderLinearLayout(Context context) { + super(context); + this.color = Color.BLACK; + //setPadding(5, 3, 5, 3); + setWillNotDraw(false) ; + + } + public BorderLinearLayout(Context context, int color) { + super(context); + // TODO Auto-generated constructor stub + this.color = color; + //setPadding(5, 3, 5, 3); + setWillNotDraw(false) ; + } + @Override + protected void onDraw(Canvas canvas) { + // TODO Auto-generated method stub + super.onDraw(canvas); + + int bottom = getMeasuredHeight()-1; + int right = getMeasuredWidth()-1; + Paint paint = new Paint(); + paint.setColor(color); + canvas.drawLine(1, 0, 1, bottom, paint); + canvas.drawLine(0, bottom, right, bottom, paint); + canvas.drawLine(right, bottom, right, 0, paint); + canvas.drawLine(right, 0, 0, 0, paint); + //canvas.drawRect(0, 0, right, bottom, paint); + } +} diff --git a/app/src/main/java/com/likesoft/mdedal/gui/BorderTextView.java b/app/src/main/java/com/likesoft/mdedal/gui/BorderTextView.java new file mode 100644 index 0000000..3002a66 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/gui/BorderTextView.java @@ -0,0 +1,38 @@ +package com.likesoft.mdedal.gui; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.widget.TableRow; +import android.widget.TextView; + +import com.likesoft.mdedal.R; + + +public class BorderTextView extends MTextView { + + public BorderTextView(Context context) { + super(context); + // TODO Auto-generated constructor stub + setPadding(5, 3, 5, 3); + setTextAppearance(context, R.style.OpisText); + // setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); + } + @Override + protected void onDraw(Canvas canvas) { + // TODO Auto-generated method stub + super.onDraw(canvas); + + int bottom = getMeasuredHeight()-1; + int right = getMeasuredWidth()-1; + Paint paint = new Paint(); + paint.setColor(Color.BLACK); + canvas.drawLine(1, 0, 1, bottom, paint); + canvas.drawLine(0, bottom, right, bottom, paint); + canvas.drawLine(right, bottom, right, 0, paint); + canvas.drawLine(right, 0, 0, 0, paint); + //canvas.drawRect(0, 0, right, bottom, paint); + } + +} diff --git a/app/src/main/java/com/likesoft/mdedal/gui/ButtonDate.java b/app/src/main/java/com/likesoft/mdedal/gui/ButtonDate.java new file mode 100644 index 0000000..38b8cd0 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/gui/ButtonDate.java @@ -0,0 +1,20 @@ +package com.likesoft.mdedal.gui; + +import android.content.Context; +import android.widget.Button; +import android.widget.EditText; + +public class ButtonDate extends Button { + private int edId; + public int getEdId() { + return edId; + } + public void setEdId(int edId) { + this.edId = edId; + } + public ButtonDate(Context context) { + super(context); + // TODO Auto-generated constructor stub + } + +} diff --git a/app/src/main/java/com/likesoft/mdedal/gui/MLinearLayout.java b/app/src/main/java/com/likesoft/mdedal/gui/MLinearLayout.java new file mode 100644 index 0000000..79894b9 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/gui/MLinearLayout.java @@ -0,0 +1,28 @@ +package com.likesoft.mdedal.gui; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; + +public class MLinearLayout extends LinearLayout { + + @Override + protected void onDraw(Canvas canvas) { + // TODO Auto-generated method stub + super.onDraw(canvas); + + int height = getMeasuredHeight(); + Paint paint = new Paint(); + paint.setColor(Color.BLUE); + canvas.drawLine(0, 0, 0, height, paint); + } + + public MLinearLayout(Context context) { + super(context); + // TODO Auto-generated constructor stub + } + +} diff --git a/app/src/main/java/com/likesoft/mdedal/gui/MTextView.java b/app/src/main/java/com/likesoft/mdedal/gui/MTextView.java new file mode 100644 index 0000000..8988abf --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedal/gui/MTextView.java @@ -0,0 +1,25 @@ +package com.likesoft.mdedal.gui; + +import android.content.Context; +import android.view.ViewGroup; +import android.widget.TextView; + + +public class MTextView extends TextView { + private String code; + public MTextView(Context context) { + super(context); + // TODO Auto-generated constructor stub +// this.setMinWidth(60); +// this.setMinimumWidth(120); +// setLayoutParams(new ViewGroup.LayoutParams( +// ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + } + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } + +} diff --git a/app/src/main/java/com/likesoft/mdedaldemo/test.java b/app/src/main/java/com/likesoft/mdedaldemo/test.java new file mode 100644 index 0000000..fbbfae8 --- /dev/null +++ b/app/src/main/java/com/likesoft/mdedaldemo/test.java @@ -0,0 +1,7 @@ +package com.likesoft.mdedaldemo; + +/** + * Created by darek on 2015-12-08. + */ +public class test { +} diff --git a/app/src/main/res/drawable-hdpi/ic_button_zen.png b/app/src/main/res/drawable-hdpi/ic_button_zen.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd5d1645eb13737051aeb71c6ef1e61b54b520d GIT binary patch literal 479 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 KMNUMnLSTY5nbNla literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_launcher.png b/app/src/main/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..36de7300f823b5fd4a2da84b0113b44d1f5ebd86 GIT binary patch literal 3135 zcmV-F48Ze=P) z0TmH2E}-lv2(n1r00X!|M8NM=Rl~@@07LSO4N~WP=S+83*L3}+>ejtg)$^bKjHR(O zmc|l~5_+YQ;v($by$ka{n~UjFr$9?nW5jEk=10)~bT+nsw-uQg=ke;*D|vlY2GrHn zg(HXEpsB8geLsAUGij+P$j?V%!RS!dg$%g6{e&4GPl2`77PPiLA08ljGo@U1^9Dw9 zYN)TrN{c1fwBajsc6O=;sHmU-njfm+R(TmKYjFtI<>s$V)bijX~A6GS%``V zR}IiEJ6kwAI*xj~D}RE-!bT*PG$E0+6ychmA+qs9=)O}BZ5Kd5K>76n z)fDT8fpDBM}Vsoex&Q?IU{Lr9~Xp0JQ2tyKqJz@bRT)l_* zOMf8lQr(~xiAyPiXonC23m2v!YhQ?ejD_Fg{ewcH3fTAyq`4199-xHZ>k#&9cdMx$ z*b|S5FNDB!01zflLjvNu+!07~?vETm()9FmZ&eps_#1sB5a*BjPHk;vfC1fFk@d6ozNXiL~K++$4ku z^GH$}bHyeW_lwsCQ)K8R{s5xGbkf zKLACFF82QgiLs51&O>iE4UapDjE=kj zBq1@EvIi8dazi4WCCsXYY>4Kbbn`Ld9Yr{EI07Ng;r+TtTzVyfth`Cw=A<&9@IL<3 zTLTpKbHX4)t}7ygFAf<3#Kc@jZB98tT_OiG?zGD#lAx4UTtvf}J`QGINjy_{0?0jK z$hn)i3xfx)Mc1m3o0gBHvL`CrEIK&Q*#I$d4TA0b;lJ((G0rX!EOTWulrh9L;9VDs z*y@QaFDbHpWXSfGlFy0A^h-u*!wVEY;#Ab5#uq4TY)1+C+|k*E;=0GkZ)j)A>!s`U zoU-q|7$W#3l_sr^N_yoU!ijC<1)vB~HaBY63((o#@kZCuE1F-b6cYwmdJrR>!jZqgPeR~BoJe0E`1|=HKqx?40se%^IfcE_t%tYS)^h1fYsB#G-tS5qY({1+X? zCgv!Xr{|+*XUL=v{);)YwP9|u5Qh45*l}O!%$UZm8_&~c%f5?@4Y6>(A=@}Hd-^AA zPm-?oG?sVvbSVyoF!VZ)Qs7&)5%HjJnq5Spcz_nKz`Q@C{$T@JWNakwVzxHhaIt%TQbB&69H6`fnK=#WxzpCnPe9K(KrYTs!v(npuYNSjxLs% zE`-6SI-JWeOPj06OA5$A`LfRr;jngqyfr}1j{E*Gpv#wjXJzH)TxG|4vuDZy`IzHo`{$oHnS1z-%a;{!s$8_H$t4MoiKS09Ohmm;sF8`OFdjL7@ z+w+eBeX+uVxd3ZcE@#Jd&o-;bi%$6V0_1ObjQB(MM#koa9zb+gKCRdn%Pp{K*;1^u zFvs#GW>{vvnE6Ia7cXKVhS{P8Z0oJ*g848ZqZkb{78reo&kYSon4u3NgSjkBnWy(D ze%Q5>+icnPQVuA1cQ9ndO(SRfOX;8OZ+vI`{gN8^ec^^E@s(k(n!I&DG$y-2Al0{a zpnP_3=E>7kq@eA({n72ni1t%b?@B!wVE*&tB>GIXsWbcTO-*5G++|lq< zdA`rhED&~8amG?s^&BSTetO+4B=OAyGO<|6jHUX-@zDH8L#`|9GlqKRKNYMR>1#AE~P;l&djWO>VGfXlo;};`LN)+|4G;*3o6x z)W&n)y>i1=ML;B=WzR;g?foU--vhMz+il#Au^th}%>P^gG}O5Y*&H~c0O%-bRnl86 z{ggx=t~a2gk`#qqW@#9Ju)=EiEm$_(ibm^v5|KlgnUm}GKYJ-u ze4UjoY=8WfcNPfPF>M!-u^{Aft7xqRliNNnX z=@@mQGY36M6c~VI=BBCvDlaR;6!l3c$jigKkm~CnvUNAQf}-+YQ}}wFWE%+RobYH) zbl-r<=SFOLm;T9#%7AEQx?P1DF00MouAm?~-pMf5hnwhZG7y3^yz0=sABaNl8G?w_5 Z{s+e%0bpAosT%+Q002ovPDHLkV1o4Y{D}Yn literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-ldpi/logo.png b/app/src/main/res/drawable-ldpi/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..269dd15c2e47ae6d40288235fd2bd63e465e130e GIT binary patch literal 10175 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_button_zen.png b/app/src/main/res/drawable-mdpi/ic_button_zen.png new file mode 100644 index 0000000000000000000000000000000000000000..ac95d252eb0c54b68c8f4a99b7dad3f050834fa1 GIT binary patch literal 322 zcmV-I0lof-P)Mz=j#Az}67henY@F1bnqX1MCce9Wye4CI}3HfEiCQ zd;nS?Gz3CsJmqV6ZwTy}kqR6Pfy2)Ww87C3I5Hy>=zz!&h?tQHxGxB}>Kiy20w-o1 zl|U8DLGomH!n3M+7aV~Fulr0Q_D1sE5Ce*!3woeWdh8YdZau$!9|qZvN>-oL6|*EW U1UX|JwEzGB07*qoM6N<$f@u?bCjbBd literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_dedal.png b/app/src/main/res/drawable-mdpi/ic_dedal.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce6b560155453a30621a09f7f3ac29d990cd83d GIT binary patch literal 2069 zcmV+w2>}Ki0I26lG!pnt{`;Wo~I@YNDA|Wac#f5iTNVXa$NQ zC8T%I5_yh(Q!SdPxr%& z8UA?pU5&sW&dwTznKQei^Bdc-J^Qgg{m>u%(m&%c9^*1Td5{lzz5cqp42V~VIsSu| zEz803<+)h7G7n#VnGaXj0<2n9fYqxDv1UyX)~zdsn_CIo-Amx*bqGE_rSSDFg`Zy; z{Qb+J(Uc<~pd1@E9PS3b=XbVad-h|0`k_DirGLg@JjP{w@*p4bB0m?G9FVIi0k=H- z@D7>Aoie4nWO^epa%7Y!-h&rkjK=8EdogBAtc*mQjLLr4*u=|7CCG>+V(Qc+8O3Bw zo2JD(@91Q7bu!9-fzN!;?`+5R?8pA}Lx1#3|BS}wE7?7EH8d+IHHL|m-k(*nike643{QO!J6x5=ykT`>)qVC{( zerG$jXTMG#^hdw+&p3?7xQtI8L8~?l38U2gN__;>C+{h#ZkR zBm&mf9&(CmFmK+^Qkz6djj|hy7l%u^5F{t8Q3Q#eIB}+{e?`UbN|=*VkosO%*YxiR zIC`{3iZ3m;Zq1O>@+9i(n@tG3gbNqi5Eoa1S+h1v%@c?vOLm~Gt-WjXNu2LFQ=G-V zSaNcY0`%QF96nqv$9EDuJQCpTohTJ#k~}9%MVTz(bO;PgmE-@oYJ2QhjnqBCis(;2 z{i5DQM;EGRN5=q3y-4-$(xppMPW*6R(VcN1wum7g}C+~LbPg@C`7NXlQmML)`f#Zfb==3h%8*VU8S1A(11gSsxW_k zsMPyDQp9;lLAPE?=NJ)Mgt9UN&Ye5o`x)p-07rvq#F66YZrqsKMV`=Tbl9>bLlKxe zcdJ_99Qnk=GS!#4&o;KUzEVPa%Vot|e59eV@xnEwP*Re40eAK!pflgK+Hyoj<|85^ z4`E^12ntG5v%y(ezdjiyC8rP`o}-9%g0s;{oTJWL7S~K~tV6(^CI#@6yONzb(}<|3 z0wsXhu_IT_N^o$R62bMr^I*aRuP%@@VQtOpp@$OMTT4v*&Ab5S*VR}?#xZQ)o~?+7 zg=HZ$^cP91Oj(ebiahh4L@&p-ow6?ZiUjcgkS(VRBpIy81pwk_ZON$L_ul(K3Gb^V zB=jJF3#6}BT57;6udKyOFRfAd;DfCav{aqwmazEv3bO(R_f)nWHHGf1tp(g6ruCdE-8@a;?>!WW3$1o(U+-|T^s z1Hczk0GEkUMHT={ZB53rr~npSOcfd{QWk71H@aC_7VzC{AmkfhZ!qxrWFT~%i0}cn zy9?P#a>RxKo*x2>tc|m?W|qmA`}UnQFM#=VwN_qk!13d?>i5>xHgyu4-6l!M_fx=Y z9uN~`Bz#hY2dyv)_-s57?g6;Z1s0Bz8ax2-ThzY-I!oQg#uil?x3~AOO~!5pRyoPY z+sR0W0!wUwZEnE#b0nRd0oNIT_s75wUjqxq0vnebXX$WGH&=0S<^>F4e)Wr;s{?9e zi*EQ`a!qbzHIk}zH9)OgpsMBf^YX4%>aeCioi_fw&}>e?5K{u~?l%DzvsT!?mdc@mX;eD(b2z}7vSoeD%ZtBSBn00000NkvXXu0mjfW;Xu1 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_launcher.png b/app/src/main/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4fb795d316836ff00068ab25932977e2c2807a GIT binary patch literal 1864 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 b|4jPA)qwWI&UOW0;$rZ0^>bP0l+XkK&>jb5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_dedal.png b/app/src/main/res/drawable-xhdpi/ic_dedal.png new file mode 100644 index 0000000000000000000000000000000000000000..c72a5d3464c0bdeaa7a0c91e08a9bae315d23e5f GIT binary patch literal 4811 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 Q?~@9krLL=1r)nGZFL-`NGXMYp literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_launcher.png b/app/src/main/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..316051ea6a13f32602f41b9f202c5fe4038260f0 GIT binary patch literal 4339 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_button_zen.png b/app/src/main/res/drawable-xxhdpi/ic_button_zen.png new file mode 100644 index 0000000000000000000000000000000000000000..d786c58db063e89cbb478f6474870d34d7847f03 GIT binary patch literal 1087 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U}5ugaSW-r^>*%U?~p)|W2X8u z^qaaAp8U1DSG$5;QMkpSilbGosfmqiiN_TmPp`{HI#*@{1Q}#ZiR)5eZ50SS&YkuD z@|Lj8Y^isC8?c{q>V4mQzk8E?;om1`cAQTY5)xo>M4%^3Dl&ZbO4kfKHwy=Nmm~?@ z<2ReQ!)1xUN*AfZo2;3e^jxci3`5JADjH_C^zZQ6BJfr(V`8b@OV7h0kLB(7*UZ@A z_C+YagF&#w(c#)xFaGbTNxRN9_sbP|b%q_%Km5lvN1#4tgW~I^OP96w{^#?Yu`QB8 ze)Hx|vq!8O-xR$to3?bl@2_CP+|3Oad zuNglA!yV9GLc{s9tYbuGj?kJJZE4DEG61&kj9A{oAmJ2XT(EPRuf#r5Ey z6UPSb7eN*5C7a6%p*8%34q_$TEZVL)*>ZRK`2;Jd99;fNZct2RbQXA^^FUQFNJwB(9mfWa6$){h+z+!Rfy~9HnA{Wx<@FOmU#HY-*4Md1$pxf*8<4uR1M3 z?&AlV^Z69hGeribb88v)b=NvZ9%xFGmSIW}=shA1RB@k!QJ_GN)kHA9vsRVy_oe$R zKpl>$jE+FFHUImjjbFH7t!_Jn{0Z#lFRV4?KP-@9}=+S&JtT4DmBe z-Ts7CsBclqVJsRHDYANC*2GF&Z&HyY15O+`IC?E^Plf|>vez0mvm6V zcv-aim9S;`@8ES$ABvxMp6+ZvrPTV8vF_eG^ZPPqv#NBqlv##+czM{g@=An9o0Ps{ z)bDk{PaYAw32?6bx0G-!GOVlNUT|s&8$^OdaS3K_=ZT~T6ZbRwK mvIEB>6gip{;7DAlo-zGY#QA^rDRIDpfx*+&&t;ucLK6Tnmd%O) literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dedal.png b/app/src/main/res/drawable-xxhdpi/ic_dedal.png new file mode 100644 index 0000000000000000000000000000000000000000..21189a9c0578d45f35b7371663304343ff82cb8c GIT binary patch literal 7476 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 P1t`2yeOV=A{^5TBij_bO literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/app/src/main/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e80eb0d3403b1aee659b6dadc4ac0fa72ad8f965 GIT binary patch literal 7159 zcmVU9^En@McW>D{-#umK%$fiEhd17M({Sa>sE9MK$#ioSij~s4A$v~0e%0=r5nk_AI2ll-xu}uuR0%~ zy1F_XGChDH13#AE(AQs#!ry;vfQ_{ke0{tT;OEPwi-^Ck1g0$+vzeiL=IBIHYz+2aEZ{NN_PIeaiu@CImhxOr?qekHB zl~nBmR9jn%<%<`xi|Y383$p|JnKt6B8#dy*o;#a>(Zq7l{`_qC5M zZ`oNlFl_KZ*0)A`48;fN-P^ZVv1Adu0CmFZ>+1#Z6qdijxw|zuUBaa+%NZic_iIpE z^F|3GM>|{Aze9C(aOch~aRJKD%aeQVXHK6IT)4F6HKey{5Ou4TOE-~IcdAj}Ocl`} zsL7OBn3;+T&^G@kz5>0;aFY4baX`y3>&E>w3r~s{O4BL0_ z+NpF=4p7el=vvy<#^ISh;sP{o%xHFEIzY$)>bU@wl|9FZPjp#diwe+)A%oaSI0UE5+pPe+}%xMl#4+iM<>w1j&@^cOlmkt6{&jI4X0s62ar4P7R zS)?2w4v<`KH$V}S{}R$`r3j7AL4ZdRB*&xSwLb{%JH6n##SN~TPr`Mp8{Bt!!OJ8V z5~~;lcwItRY%ZeHpCP888q#78P_F?frmzN4DGvxN$?!1nfy1)Hu$#6U_EQYtK*Vu! z+d@A_KW{sI4;+6z2G6~I2$ZBidi616MK#?*Q*nUQG(}B+BQl>OFfI=gzZCd7C%|Rp zF(DL_)q|%ssO)C$h0EVgOq0nno_A@GI6&$=Bw|`ZuRcQPSE9jJ!zIVOeu zR72MBc2f*tHGMaZ&)CiW+E398q$Zeb_4dQ-Kro_`?y~#f0CgjPXorO*6hji625DBA z;B`Oy)3BMbhiD2%_`6>~#Q8gj&#J(g{A$GCC`b6Y+X(PXhTB$m*v>N27$$1w+zovQ zNF`m$SKP*l(nd~etr2zc9tY?{Xdvp428LxIFenu?-{m^NBqig4naNjX5B8)eb477xp4xi3Ng zhLCW*Lne?!UJfgdwy9a@`}VW98guQCdjQwN8VmR|3S$miHytP2UYahclW##G)FwZg>CS@W>&W zwHKignH(T(jrD{@WU=W28v;;t>LU@f&qFq-*i`^x5b2p9BB6)_B)TNuV~#9)(8OPf zDbjoyQBY`l!`Mt00*H$JvcrhJR>}bqOJp}I;kedH{(wEUx`}e$z@W4)1&*S)Y<6L( zA{-zMrzfb>>~$zi9`!iQF^1P3UvUN?&)$N~wDynR*iAKrEirxe};kPLVBSD5!qz~pc+x8MW_~X{?nm# z%|pyd2=SNNI$v0178}JD)uARonjrrxqHCcZ50EVV+54!gQBDwmWJC*y4r}T|*e_|> z1ldm84Ov!s+v&2z>2+RfExtdr{0L%lUvPlhqkVjiM=L!@rh$^RH2Iix7Y@Wssnh}s z%?KPX+Z^Pixz;Dw+i1a|Hb8*e1yQw7j|M1){Mv2jnJ7DzM4gAn=WB1UGW8LhH`*!9 zb2)FYWvQ^O9#2eaXxd|V7|a1&C@E2{9in%}qJaF^0`-BgoQ9I|U#bK1&Ed?HQP~TYN}s z(;M`;&~YmcP%B}u<7&$mAE480V>mB5#3GW;$UAcT*A*^Ap#-2Vs{V5Wna?tmm7EklNbL`LU@62$khTEUI#=nK>Q5qZ?p*z z9S@OQW{U?sOhZ{(s@MR9CltYUnju_>xrjL^!FhWrY^OIs;=av8?t@T>=tO6L`vuq$ z2fwob^4R6A@lZz31BgU0G+jciXymtJh$jxKhj|$MJ(J195V!bK$k}3eZE-`uUp4@F z#`V>&;4*I?gEvUUKqkF*WI{0Iq(glV-J{J)!(p(WO!ayUw>me6#)&CqEXo?0gQSJubt%6E5 zk+0n;tvlA%#GJ-nf64(8bec4~-KnAWznCB_D!ZYQMpiijPUj>1Mw!OWyr*#>BpWPI z`|Ks$mzlzTt}&!>`3Q`;+4ebZJcpli0#5#6&(dDC63P>}skW1HfD}f3gVNLn$f21g zqPfHJbPElqIansZqJy}fUW{y6Dsi57BRJq{yG> zWAYH3T*3iTl;DWW76D?vx+%L`^^Sh2n+O2Z7{bK2Z=ZH+c-T1n~ z$_oY2<`QnI329yt9cib-22|+3V+(88dv0c-h~OHic^*(9tC-px9PiafkP()QdpC;l zFt-E`ZY9uJ8; zP>{Me4O{qClF#3(dX2kH^5Qj06y#22yu_S?^%_UHmmh{q!*%mL4j?)M z?zHCp40ybmpXy)sySGH%bt_Gj{6K@}LVj2hD;ex&?3I@dcHivECsS3aXj+iF37|{v zae`}9SHHxnmCG=4*e6Uz4I6^bh7ZN(pAN$pBS+xNQJ>v#h^##5i z{UyeJ{Xcv+W;DM4_G^qEI|dWJ`-W{O`_uUE@biRmnE1o@nDpZWO!@f-Or7{6rcL?@ z(TJD2)T8IuEB9_Kj=H zQ@n-O2@egyK!uK)_``VYG1v*io!eosV;i<_+03+&x*h$~_;HQL?_kI8*!nNNB$|xA zN43wEP5RiZ{}(p>^(TH`w+4d;G<<)(*)!PxH>_QSb*q14nutQ9c<$s2i5deW_YH|@ z_dO9OU#UU|OQWwo;Q+N{@9i5a!l(EMuM-v=Ea)VOx2Mv5Y~B2i+5maDom4u0*Y>UK zy^Bc~l-{G}>yv>WFlAU z_?{75BRDWn&`AM)zDoD8Ws~|E$j3`rgYDebpnveUtN&ux? zy4boConHmtu(2`?1&jl z@e=|R6yPuDq(Fb=Fn_cD-)aNo>*J+#JoTgKdudm%D7`nAL}J4R4ZzcFkY1jJasHc^YvhJjM=O`2T0AK z`|LbnwBs+4bQ%DEkTBiO#u~QPR;}1{1aW2l|2`{URCu1 zqlSGVIR4tztAfwO9SP7(`w%}VI_-(LKhoX?5cM@W3!tnUH6J7Q7OBztvs`kdK!~rva3cou%|0>0H^T1fa@_3c>4@ zm6aGdbgo`D5%n>a@F@;_a5RJAv51?$N?>Onl@%WU0QdubksG_2r zy{>qCMtZt%9?#sjgC%~2D`9z&&GrCPAq2?F!>!W*qO<-MW~MkooaLhy<~X?Dm`!8Q zFn;&W?aaBRPBsncjdmMgAbDN!_~w(TF^4(^keh+G+O>%|K+WV9u@#9AhGtH#< zx$G>V4;5|dqxM3{rp1zUA635HlZXJhopkx&0F4?xgeA5qw&%~EVfbL(R(&YxL2tF9 zEt+jeXWr?So?5R&+tUHM(+nV27pD&n&}SotqNb)sa9_`!JtY7Q6nySxPL3d_ReC_3 z;^T&_P?a|c*`tfJUxl{k15_yl=%lmb2M37Ghtd2W#YQJrhYb<}l$(1~2#|@lTFbLN zO@cH|mgfMq0FaBLLzmP*G(U(=b0~f;KQC7RQ1pK9w&6Jttd(t@dM!XD%>Z(8u#$=8;%Ie!dVOV=t8^t7$tY@1s(dy4qRr^h$ubf(BA2gr`ze zSRe#wpJ$6Z5(au*WXqL16P{iIP`%(9g$4O+*-lqa~+lPzu}W?mKkn zA?dBoho@HnR8Xe8q?t||6c!YqATJMjxw*)_nL{F;Y&Pyf2k&lVWFRv=oy|pEzm|q; zX;)cl#g)`lmgh_}1ye31<5F@GOPo)-kcbQC&mr;LS)4zcfU^l_kZ}4m&YX(J>G(L7 zFcudhL#!+sG0{>)M@2#!8G)#Xa72cOAv`P;VIjftaUuG*dD1-vD0GXXLRzXJJdFHB zDHhHFYDJRn*WfL>f2%2b3722?v0a!Qem%;P()*<*z!3Q^2-3p-ayb6S7KW(>!-+Yd!qAGb&Cuy@U8+*G3F@+V7<~%|4 zP1Pd1S^8db8ziQg#1~iMbV&^>yAoemj@Z0Xxx^_*e50Idl+*NYeuE?wl_9aDikaC9 z_iLFXDaiSIwTQXh(tuzMLUW#}d!xI@yieGw*xqXMuttdN=pOl|(`CmI4uHEi?9Y*eT6u$p?3Rddx zfSvTB(!Dm{Uc4!v$1>zBh7KF9^18ciJ=HSpvzM(A96Msv7YMugyk`LP+ooOOgv9;& zk`CU6sKS@>PS|w7QseV(wXm1p>*96)h;y&~`(pK$J&+c+J`E90G{?6SeroYNBS(FP zfNOW#1ZevFC4%Dy57OlTsS=%jeX!ppNPg~?0qWCkfTUsq#P0PYm`kEt?X-VPj<RA3|C-rg-mmL1c;G;#2l~s(^>TlxIY9K>zwa`E zk%KQ0KQ+V`C(mWItbvFo*<^AIhAQvX1G~uI&88=yw|otB2k0o>>(bvhw>U89m6VH5 z1`Ct#zaBdd-+nh<@S3iU4(y_mIY5e?d@>pQq1}mxxmZkYz~6 zS8Fy0Nay4J@J`NG>t6RcNZ9oikDoq&sY+jnnzmVsRw|k3BLQ(Z7H|p!Kkg@ZZ^D!r zh%Bt+0JR4o7G2~##fTA~3XcC_@(lSd&8ke;JfaQO{JTdj*>TK8pdmU65S7TA&!D3- zKydujxeHYSWa_T`!_Zr~t|8(i-)-UQKb4-@E=yMqPQ8I~3H*69V zJLdqkwdGTGDTWUp(GGz6;BO-fm=fRVpc-Nop4h4n)EgzEWGxmFdj2<&qIbB5OW1MJq&%G3&45cjtl&i4UV863J3*7~^3`KULTl0Yi^lt#D zt?dk`-(qOxrWBIXj+FycRK@OH)8T>f6Q?2~zd{Xwp7mUS7W}pWzv}O3QRv7s^-l)$ z@24V+U)N$7&)z3a^y+_it1bJS16u}&IJ%41ZY1}#v*ml;xCKAYm`gzKtCU=}WW)O~ z-q6~kUE@$|VovIoxO$J~1c68nAxBS$|q1`^em z#cTEDovi6VqA(-zBba$cHk2z)E5V47qlBL&q5Asm#?Uu8-m0wKx)%eR{g9|x_q}qf zMS$7^qq%of?*NF7>@HfTkBEXw(E$=~Dx**1y*5s}6uo2}ym-Cxd6#Y6s^k!>HjmX< zv|e8c&_!$ik~`d*0CcFU1GLS;0TXA;>5xpGsfXE%ma};!I_VfyB%E8?=M>Q4b2o|p z{^N2VN8iMfy*8;M_d4qra<40}ZreVbh`1o12Xjx#W6_@CXQwY%hTzP{YWgR22)uqD zQ-4`3ye2X6o{bJZjqE!1{pXT8V(Q_Zo;^5 zfH*)LAPx`*s51Z>zyazN0KL`{Kuxuf=~7<~P|pRZuC^9meKt~jfPNVFZR195t{k8q z4A9f3Pcd}R0Pz8$+dHyV4V(0pF8ZYUbsOuVxO6p%zg^8%@iuSCNlA^hkUkO@Ai5hd zTS@TcXG&GN=zZjsy+Q(A?Rlpbr|#5n>B5qDuLh6Ek6u+X-n+XYw`uZ3aRIt_@2-4b ztl*#kl^1{Wj!Sotma3l6jbxg3U$nP5Aud34FZ91R{?1PR-I%Y0MU;5!5pBQG-iC6< z!-n8#X{opXHB<>JU|Sy1i_kiOZ{ED&PrZk^0E=VzmmL99Xf* zfqnbn!2W#%qSyTCck@QKDW_V8r3lZOA@^~$0ua?YO`FqFh&HTUt+bOdZ{4HOzN9+< z3~LPAX?@50_wLEx*9t&Q7dG6rgK46s0^C-|kAgbdZ{NP?urhB*lZ`Au0m2|pe#*~T7KQb{kg4sb6E?q=S5A28G&h1#X zXg({LF5f_g_&r-U{iC!Kqt*dZtkiC9b`YaKAJuJkRp#j&1FimbIaVxP%%zLSugjKT + + + + diff --git a/app/src/main/res/layout/activity_list.xml b/app/src/main/res/layout/activity_list.xml new file mode 100644 index 0000000..ca7d34e --- /dev/null +++ b/app/src/main/res/layout/activity_list.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..0e0a051 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_prefer.xml b/app/src/main/res/layout/activity_prefer.xml new file mode 100644 index 0000000..dc93dcc --- /dev/null +++ b/app/src/main/res/layout/activity_prefer.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

-`Afd7+CNLaFapASKmy&M=rSm_BGdS7@w#i&%E(^ z3$PDjM|{nSV@WkWD^dM1N1W50#pgC{e+sZy7s7bYIZCJ7_wN91EP(hr1-*3x)XY}_ z_sPe21Y^v~^6Jlk+jb$&We`r@seJYu;1TZ-=cZ@jFK%5A?-lOYdEs8uRCqn(u@kUA z5{B&8=T9fzjMRkB7ctg|^PKA`tLI9B^Kp~F_$TId3g;Q)z&MA`V*EFmZ&*d>b-*J% z5$C0rvyoIA9{~J-JK}umJe3#qcEUUZ~ofHtTat6yS&LG2YzobD&de6!0^XhzrxGjdL|NCjcH7g>iuz z_wW1I;JwQl%M;;KDSlOFH^Fn^jP0-R?WrD9Zw7WS&R%T(B1X?TFTEdy_j8+TXnavw z<^7a53YvhulNQE5zbH}X34{5g8-cjkmkbX!w(3e?uMvdt(Y6<(jr@B7PpL*+oaOqp zlq*{f0Pc#dzqotJO~F`(Y`|kDF#D!K$36Y4Tmg?#!1!341{)(y5#T4PF+RZ`y-MIc z6X5Y{5Z@fMC00%NxdY&*u{yc=_76LeEsm3b+uI@gE#w0UXQU>c1D;Wc@f$X7&Uq_g zylGgxTSgk~&JByeetlFP*-N~;sV8R;59gn=0ddJ{jUST6yNkj2I%9}SiHmPMuw^J6 zaP_ZvbOM0sQnJ;xZ@dcBnTf?Eu`m8u4w6-0swc%`kgHGeFq_M_cs{uUzhRY#D|~!?#ru}f zWx&l=AineYmUQ~@Iyirwjfg9z>~zb1I3*42!?Ao;64tqzX-Sg=ITx~5igZ;TG%nZ* zcqq0nyU4UguR6kVNMclr>~}E=MCyLu2lFJo3**giMb4EtiGp#CIw8LMc<;B{%XYy! zlll?kk-{0f;z;3nKlKc8<)U8dz$t!RFpjw^#-G#Qcy{|^86eAL8k9vxRV-vxML3*zdW)4Mlv>B9Sl zt3Ad&{7sLtD)#~VOgfC`oK;o}$bj#)e6aOVe}CAMF;@xhOYlo%ud&(i=7|dz;q(4k zX^hA1^I_`LmjL4*%|%>Obn_)HdijHZ$9=)LV}A4{JE<)dAx- zKCU=lWwZ`(eXO5qHNNdT7|AaLxUDZ{Kiq62pUepBz~Kgr|11fTPnH=2_Ax&Z*WOCi z^H|yd-rK|UFkYfdqIGuguE*r4-PsDh?Rh)3| zU>@M=)rjkGu}hJj4T9(04$Eg<=c4vq7FuxM{mqg6p>;ExI`2r_1LK4bAg;Ilx{#N_ zA^1F^CWi43x;g!P?eKnrwWArmZ^09`D=xu%SF9+q*WVDS&=5xf@1;hjh#RsdYKaNP zcmluC)EIZ_3R^KgtqORs6UJQ~Wm7MU!S`wUtQhyN*wWLV5AQj4Se_VdX0G0SVd^Lt z$Ez3F8~L&Oe7x164Y)40FGddptt`yN;W)>Vk-hN>meJ`trnA7_29yZnOVx^hkX>VzNyM$ zJc~2JmAw}B$3t9*TWr7!3dZrr#yRY;<&7zO;;W@K-9+pI8R^rHaa?%4go z$|L7ZN_≠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 literal 0 HcmV?d00001 diff --git a/.gradle/7.5.1/gc.properties b/.gradle/7.5.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/8.7/checksums/checksums.lock b/.gradle/8.7/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..69dee5a0479a5faa5efb54a576538a133003b308 GIT binary patch literal 17 VcmZQB_R917bN7!c0~oMO1OPYj1uOsn literal 0 HcmV?d00001 diff --git a/.gradle/8.7/checksums/md5-checksums.bin b/.gradle/8.7/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..2fc21b0f268318062ca34b405ec72caae36717b0 GIT binary patch literal 30397 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 Q6EH=Ci~{3z^nX(S2Qs<89smFU literal 0 HcmV?d00001 diff --git a/.gradle/8.7/dependencies-accessors/gc.properties b/.gradle/8.7/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/8.7/executionHistory/executionHistory.bin b/.gradle/8.7/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..0b909a0d080ad6aa2a81e4a254e988868dac093d GIT binary patch literal 671763 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Μ4p%7iLo42w<)gr#5c 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 JPvgNM|_?7 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