From f35e7c534b051cfc68f7300ef9bad5901539f6d5 Mon Sep 17 00:00:00 2001 From: "saad.siddiq" Date: Sat, 23 Nov 2024 09:54:03 +0500 Subject: [PATCH] Initial commit --- .gitignore | 15 + .idea/.gitignore | 3 + .idea/.name | 1 + .idea/compiler.xml | 6 + .idea/deploymentTargetSelector.xml | 10 + .idea/gradle.xml | 19 + .idea/migrations.xml | 10 + .idea/misc.xml | 10 + app/.gitignore | 1 + app/build.gradle | 46 ++ app/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.java | 26 + app/src/main/AndroidManifest.xml | 58 +++ .../activities/HomeActivity.java | 152 ++++++ .../activities/SplashActivity.java | 62 +++ .../activities/SummaryActivity.java | 26 + .../qualitycontrol/adapters/ImageAdapter.java | 70 +++ .../qualitycontrol/adapters/ItemAdapter.java | 85 ++++ .../qualitycontrol/apiservice/ApiService.java | 31 ++ .../apiservice/ApiServiceFactory.java | 17 + .../apiservice/RetrofitClient.java | 45 ++ .../fragments/CheckingFragment.java | 72 +++ .../fragments/CuttingFragment.java | 427 ++++++++++++++++ .../fragments/HomeFragment.java | 91 ++++ .../fragments/PackingFragment.java | 72 +++ .../fragments/StitchingFragment.java | 72 +++ .../fragments/SubStoreFragment.java | 74 +++ .../qualitycontrol/helper/Helper.java | 25 + .../qualitycontrol/helper/Preference.java | 77 +++ .../qualitycontrol/models/Item.java | 24 + .../models/QualityControlResponse.java | 4 + .../qualitycontrol/utils/SharedViewModel.java | 467 ++++++++++++++++++ .../viewmodels/LoginViewModel.java | 70 +++ .../main/res/anim/bs_list_layout_fade_in.xml | 6 + app/src/main/res/anim/fade_in.xml | 11 + app/src/main/res/anim/fade_out.xml | 11 + app/src/main/res/anim/grow_from_bottom.xml | 14 + app/src/main/res/anim/grow_from_top.xml | 15 + app/src/main/res/anim/popup_hide.xml | 8 + app/src/main/res/anim/popup_show.xml | 8 + app/src/main/res/anim/slide_down.xml | 3 + app/src/main/res/anim/slide_in_bottom.xml | 9 + app/src/main/res/anim/slide_in_left.xml | 11 + app/src/main/res/anim/slide_in_left_menu.xml | 8 + app/src/main/res/anim/slide_in_right.xml | 11 + app/src/main/res/anim/slide_in_right_menu.xml | 8 + app/src/main/res/anim/slide_in_top.xml | 9 + app/src/main/res/anim/slide_out_bottom.xml | 9 + app/src/main/res/anim/slide_out_left.xml | 11 + app/src/main/res/anim/slide_out_right.xml | 11 + app/src/main/res/anim/slide_out_top.xml | 9 + app/src/main/res/anim/slide_up.xml | 5 + app/src/main/res/drawable/arrow_back.xml | 5 + app/src/main/res/drawable/curved_layout.xml | 18 + app/src/main/res/drawable/et_border.xml | 8 + app/src/main/res/drawable/ic_delete.xml | 5 + .../res/drawable/ic_launcher_background.xml | 170 +++++++ .../res/drawable/ic_launcher_foreground.xml | 30 ++ app/src/main/res/drawable/image_picker.xml | 5 + app/src/main/res/drawable/img_load.xml | 12 + app/src/main/res/drawable/rounded_border.xml | 8 + .../main/res/drawable/rounded_btn_login.xml | 7 + app/src/main/res/drawable/search.png | Bin 0 -> 21551 bytes app/src/main/res/drawable/wave_4_.xml | 9 + app/src/main/res/layout/activity_home.xml | 63 +++ app/src/main/res/layout/activity_splash.xml | 61 +++ app/src/main/res/layout/activity_summary.xml | 44 ++ app/src/main/res/layout/custom_layout.xml | 85 ++++ app/src/main/res/layout/fragment_checking.xml | 135 +++++ app/src/main/res/layout/fragment_cutting.xml | 135 +++++ app/src/main/res/layout/fragment_home.xml | 118 +++++ app/src/main/res/layout/fragment_packing.xml | 135 +++++ .../main/res/layout/fragment_stitching.xml | 135 +++++ .../main/res/layout/fragment_sub_store.xml | 135 +++++ app/src/main/res/layout/item_image.xml | 13 + .../main/res/layout/item_recycler_view.xml | 26 + app/src/main/res/layout/spinner_style.xml | 11 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes app/src/main/res/values-hdpi/meta.xml | 5 + app/src/main/res/values-hdpi/sdp.xml | 303 ++++++++++++ app/src/main/res/values-land/dimens.xml | 3 + app/src/main/res/values-mdpi/meta.xml | 5 + app/src/main/res/values-mdpi/sdp.xml | 303 ++++++++++++ app/src/main/res/values-night/themes.xml | 7 + app/src/main/res/values-sw300dp/meta.xml | 5 + app/src/main/res/values-sw300dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw330dp/meta.xml | 5 + app/src/main/res/values-sw330dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw360dp/meta.xml | 5 + app/src/main/res/values-sw360dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw390dp/meta.xml | 5 + app/src/main/res/values-sw390dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw420dp/meta.xml | 5 + app/src/main/res/values-sw420dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw450dp/meta.xml | 5 + app/src/main/res/values-sw450dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw480dp/meta.xml | 5 + app/src/main/res/values-sw480dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw510dp/meta.xml | 5 + app/src/main/res/values-sw510dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw540dp/meta.xml | 5 + app/src/main/res/values-sw540dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw570dp/meta.xml | 5 + app/src/main/res/values-sw570dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw600dp/meta.xml | 5 + app/src/main/res/values-sw600dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw630dp/meta.xml | 5 + app/src/main/res/values-sw630dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw660dp/meta.xml | 5 + app/src/main/res/values-sw660dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw690dp/meta.xml | 5 + app/src/main/res/values-sw690dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw720dp/meta.xml | 5 + app/src/main/res/values-sw720dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw750dp/meta.xml | 5 + app/src/main/res/values-sw750dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-sw780dp/meta.xml | 5 + app/src/main/res/values-sw780dp/sdp.xml | 303 ++++++++++++ app/src/main/res/values-w1240dp/dimens.xml | 3 + app/src/main/res/values-w600dp/dimens.xml | 3 + app/src/main/res/values-xhdpi/meta.xml | 2 + app/src/main/res/values-xhdpi/sdp.xml | 303 ++++++++++++ app/src/main/res/values-xlarge/meta.xml | 5 + app/src/main/res/values-xlarge/sdp.xml | 303 ++++++++++++ app/src/main/res/values-xxhdpi/meta.xml | 2 + app/src/main/res/values-xxhdpi/sdp.xml | 304 ++++++++++++ app/src/main/res/values-xxxhdpi/meta.xml | 2 + app/src/main/res/values-xxxhdpi/sdp.xml | 304 ++++++++++++ app/src/main/res/values/colors.xml | 357 +++++++++++++ app/src/main/res/values/strings.xml | 13 + app/src/main/res/values/themes.xml | 9 + app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + app/src/main/res/xml/file_paths.xml | 4 + .../qualitycontrol/ExampleUnitTest.java | 17 + build.gradle | 4 + gradle.properties | 21 + gradle/libs.versions.toml | 36 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 +++++++ gradlew.bat | 89 ++++ settings.gradle | 23 + 154 files changed, 11640 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/deploymentTargetSelector.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/migrations.xml create mode 100644 .idea/misc.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/utopiaindustries/qualitycontrol/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/activities/HomeActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/activities/SplashActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/activities/SummaryActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/adapters/ImageAdapter.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/adapters/ItemAdapter.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/apiservice/ApiService.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/apiservice/ApiServiceFactory.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/apiservice/RetrofitClient.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/CheckingFragment.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/CuttingFragment.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/HomeFragment.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/PackingFragment.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/StitchingFragment.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/SubStoreFragment.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/helper/Helper.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/helper/Preference.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/models/Item.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/models/QualityControlResponse.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/utils/SharedViewModel.java create mode 100644 app/src/main/java/com/utopiaindustries/qualitycontrol/viewmodels/LoginViewModel.java create mode 100644 app/src/main/res/anim/bs_list_layout_fade_in.xml create mode 100644 app/src/main/res/anim/fade_in.xml create mode 100644 app/src/main/res/anim/fade_out.xml create mode 100644 app/src/main/res/anim/grow_from_bottom.xml create mode 100644 app/src/main/res/anim/grow_from_top.xml create mode 100644 app/src/main/res/anim/popup_hide.xml create mode 100644 app/src/main/res/anim/popup_show.xml create mode 100644 app/src/main/res/anim/slide_down.xml create mode 100644 app/src/main/res/anim/slide_in_bottom.xml create mode 100644 app/src/main/res/anim/slide_in_left.xml create mode 100644 app/src/main/res/anim/slide_in_left_menu.xml create mode 100644 app/src/main/res/anim/slide_in_right.xml create mode 100644 app/src/main/res/anim/slide_in_right_menu.xml create mode 100644 app/src/main/res/anim/slide_in_top.xml create mode 100644 app/src/main/res/anim/slide_out_bottom.xml create mode 100644 app/src/main/res/anim/slide_out_left.xml create mode 100644 app/src/main/res/anim/slide_out_right.xml create mode 100644 app/src/main/res/anim/slide_out_top.xml create mode 100644 app/src/main/res/anim/slide_up.xml create mode 100644 app/src/main/res/drawable/arrow_back.xml create mode 100644 app/src/main/res/drawable/curved_layout.xml create mode 100644 app/src/main/res/drawable/et_border.xml create mode 100644 app/src/main/res/drawable/ic_delete.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/image_picker.xml create mode 100644 app/src/main/res/drawable/img_load.xml create mode 100644 app/src/main/res/drawable/rounded_border.xml create mode 100644 app/src/main/res/drawable/rounded_btn_login.xml create mode 100644 app/src/main/res/drawable/search.png create mode 100644 app/src/main/res/drawable/wave_4_.xml create mode 100644 app/src/main/res/layout/activity_home.xml create mode 100644 app/src/main/res/layout/activity_splash.xml create mode 100644 app/src/main/res/layout/activity_summary.xml create mode 100644 app/src/main/res/layout/custom_layout.xml create mode 100644 app/src/main/res/layout/fragment_checking.xml create mode 100644 app/src/main/res/layout/fragment_cutting.xml create mode 100644 app/src/main/res/layout/fragment_home.xml create mode 100644 app/src/main/res/layout/fragment_packing.xml create mode 100644 app/src/main/res/layout/fragment_stitching.xml create mode 100644 app/src/main/res/layout/fragment_sub_store.xml create mode 100644 app/src/main/res/layout/item_image.xml create mode 100644 app/src/main/res/layout/item_recycler_view.xml create mode 100644 app/src/main/res/layout/spinner_style.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values-hdpi/meta.xml create mode 100644 app/src/main/res/values-hdpi/sdp.xml create mode 100644 app/src/main/res/values-land/dimens.xml create mode 100644 app/src/main/res/values-mdpi/meta.xml create mode 100644 app/src/main/res/values-mdpi/sdp.xml create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values-sw300dp/meta.xml create mode 100644 app/src/main/res/values-sw300dp/sdp.xml create mode 100644 app/src/main/res/values-sw330dp/meta.xml create mode 100644 app/src/main/res/values-sw330dp/sdp.xml create mode 100644 app/src/main/res/values-sw360dp/meta.xml create mode 100644 app/src/main/res/values-sw360dp/sdp.xml create mode 100644 app/src/main/res/values-sw390dp/meta.xml create mode 100644 app/src/main/res/values-sw390dp/sdp.xml create mode 100644 app/src/main/res/values-sw420dp/meta.xml create mode 100644 app/src/main/res/values-sw420dp/sdp.xml create mode 100644 app/src/main/res/values-sw450dp/meta.xml create mode 100644 app/src/main/res/values-sw450dp/sdp.xml create mode 100644 app/src/main/res/values-sw480dp/meta.xml create mode 100644 app/src/main/res/values-sw480dp/sdp.xml create mode 100644 app/src/main/res/values-sw510dp/meta.xml create mode 100644 app/src/main/res/values-sw510dp/sdp.xml create mode 100644 app/src/main/res/values-sw540dp/meta.xml create mode 100644 app/src/main/res/values-sw540dp/sdp.xml create mode 100644 app/src/main/res/values-sw570dp/meta.xml create mode 100644 app/src/main/res/values-sw570dp/sdp.xml create mode 100644 app/src/main/res/values-sw600dp/meta.xml create mode 100644 app/src/main/res/values-sw600dp/sdp.xml create mode 100644 app/src/main/res/values-sw630dp/meta.xml create mode 100644 app/src/main/res/values-sw630dp/sdp.xml create mode 100644 app/src/main/res/values-sw660dp/meta.xml create mode 100644 app/src/main/res/values-sw660dp/sdp.xml create mode 100644 app/src/main/res/values-sw690dp/meta.xml create mode 100644 app/src/main/res/values-sw690dp/sdp.xml create mode 100644 app/src/main/res/values-sw720dp/meta.xml create mode 100644 app/src/main/res/values-sw720dp/sdp.xml create mode 100644 app/src/main/res/values-sw750dp/meta.xml create mode 100644 app/src/main/res/values-sw750dp/sdp.xml create mode 100644 app/src/main/res/values-sw780dp/meta.xml create mode 100644 app/src/main/res/values-sw780dp/sdp.xml create mode 100644 app/src/main/res/values-w1240dp/dimens.xml create mode 100644 app/src/main/res/values-w600dp/dimens.xml create mode 100644 app/src/main/res/values-xhdpi/meta.xml create mode 100644 app/src/main/res/values-xhdpi/sdp.xml create mode 100644 app/src/main/res/values-xlarge/meta.xml create mode 100644 app/src/main/res/values-xlarge/sdp.xml create mode 100644 app/src/main/res/values-xxhdpi/meta.xml create mode 100644 app/src/main/res/values-xxhdpi/sdp.xml create mode 100644 app/src/main/res/values-xxxhdpi/meta.xml create mode 100644 app/src/main/res/values-xxxhdpi/sdp.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/main/res/xml/file_paths.xml create mode 100644 app/src/test/java/com/utopiaindustries/qualitycontrol/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..01cbf80 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +QualityControl-App \ 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/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b268ef3 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..0897082 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ 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..0ad17cb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..7a16048 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,46 @@ +plugins { + alias(libs.plugins.android.application) +} + +android { + namespace 'com.utopiaindustries.qualitycontrol' + compileSdk 34 + + defaultConfig { + applicationId "com.utopiaindustries.qualitycontrol" + minSdk 24 + targetSdk 34 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation libs.appcompat + implementation libs.material + implementation libs.activity + implementation libs.constraintlayout + testImplementation libs.junit + androidTestImplementation libs.ext.junit + androidTestImplementation libs.espresso.core + + implementation libs.retrofit.v290 + implementation libs.converter.gson + implementation libs.glide + implementation libs.easypermissions + +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/utopiaindustries/qualitycontrol/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/utopiaindustries/qualitycontrol/ExampleInstrumentedTest.java new file mode 100644 index 0000000..492cf2b --- /dev/null +++ b/app/src/androidTest/java/com/utopiaindustries/qualitycontrol/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.qualitycontrol; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.utopiaindustries.qualitycontrol", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d272599 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/activities/HomeActivity.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/activities/HomeActivity.java new file mode 100644 index 0000000..94836dd --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/activities/HomeActivity.java @@ -0,0 +1,152 @@ +package com.utopiaindustries.qualitycontrol.activities; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; +import android.widget.Button; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + +import com.utopiaindustries.qualitycontrol.R; +import com.utopiaindustries.qualitycontrol.fragments.CheckingFragment; +import com.utopiaindustries.qualitycontrol.fragments.CuttingFragment; +import com.utopiaindustries.qualitycontrol.fragments.HomeFragment; +import com.utopiaindustries.qualitycontrol.fragments.PackingFragment; +import com.utopiaindustries.qualitycontrol.fragments.StitchingFragment; +import com.utopiaindustries.qualitycontrol.fragments.SubStoreFragment; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +public class HomeActivity extends AppCompatActivity { + + private int currentFragmentIndex = 0; + private final List fragmentList = new ArrayList<>(); + //Button btnNext; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_home); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + //btnNext = findViewById(R.id.btn_next); + + // Initialize fragments + /*fragmentList.add(new HomeFragment()); + fragmentList.add(new CuttingFragment()); + fragmentList.add(new StitchingFragment()); + fragmentList.add(new CheckingFragment()); + fragmentList.add(new PackingFragment()); + fragmentList.add(new SubStoreFragment());*/ + + // Load the first fragment + //loadFragment(fragmentList.get(currentFragmentIndex)); + + /*btnNext.setOnClickListener(v -> navigateNext());*/ + + // Load the first fragment only if there's no saved instance + if (savedInstanceState == null) { + navigateToFragment(new HomeFragment(), false); + } + + } + + public void navigateToFragment(Fragment fragment, boolean addToBackStack) { + FragmentManager fragmentManager = getSupportFragmentManager(); + FragmentTransaction transaction = fragmentManager.beginTransaction() + .replace(R.id.fragment_container, fragment); + + if (addToBackStack) { + transaction.addToBackStack(null); // Add to the back stack + } + + transaction.commit(); + } + + // Method to navigate to a specific fragment + /*public void navigateToFragment(Fragment fragment, boolean addToBackStack) { + androidx.fragment.app.FragmentTransaction transaction = getSupportFragmentManager() + .beginTransaction() + .replace(R.id.fragment_container, fragment); + + if (addToBackStack) { + transaction.addToBackStack(null); + } + + transaction.commit(); + }*/ + + /*private void navigateNext() { + if (currentFragmentIndex < fragmentList.size() - 1) { + currentFragmentIndex++; + loadFragment(fragmentList.get(currentFragmentIndex)); + + // Change button text to "Finish" on the last fragment + if (currentFragmentIndex == fragmentList.size() - 1) { + Button btnNext = findViewById(R.id.btn_next); + btnNext.setText("Finish"); + } + } else { + // Navigate to Summary Activity + Intent intent = new Intent(this, SummaryActivity.class); + startActivity(intent); + finish(); + } + }*/ + + private void loadFragment(Fragment fragment) { + getSupportFragmentManager().beginTransaction() + .replace(R.id.fragment_container, fragment) + .addToBackStack(null) + .commit(); + } + + /*@Override + public void onBackPressed() { + *//*Fragment myFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); + if (myFragment instanceof CuttingFragment) { + finish(); + } else { + if (getSupportFragmentManager().getBackStackEntryCount() > 0) { + getSupportFragmentManager().popBackStack(); + } else { + super.onBackPressed(); + } + }*//* + if (getSupportFragmentManager().getBackStackEntryCount() > 0) { + Log.i("TAG", "=============onBackPressed - Popping backstack===="); + getSupportFragmentManager().popBackStack(); + } else { + Log.i("TAG", "=============onBackPressed called because nothing on backstack===="); + super.onBackPressed(); + } + }*/ + + @Override + public void onBackPressed() { + if (getSupportFragmentManager().getBackStackEntryCount() > 0) { + getSupportFragmentManager().popBackStack(); // Go back to the previous fragment + } else { + super.onBackPressed(); // Exit the activity + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/activities/SplashActivity.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/activities/SplashActivity.java new file mode 100644 index 0000000..20080b6 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/activities/SplashActivity.java @@ -0,0 +1,62 @@ +package com.utopiaindustries.qualitycontrol.activities; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.widget.TextView; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.qualitycontrol.R; +import com.utopiaindustries.qualitycontrol.helper.Helper; +import com.utopiaindustries.qualitycontrol.helper.Preference; + +public class SplashActivity extends AppCompatActivity { + + private final int TIMER = 1200; + boolean isLoggedIn = false; + TextView txtVersion; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_splash); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + txtVersion = findViewById(R.id.txt_version); + txtVersion.setText(getResources().getString(R.string.app_version)); + + isLoggedIn = Preference.getMyBooleanPref(Helper.project_file, "isLoggedIn", getApplicationContext()); + + new Handler().postDelayed(new Runnable() { + public void run() { + + Intent myIntent = new Intent(SplashActivity.this, HomeActivity.class); + startActivity(myIntent); + overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); + finish(); + + /* if (isLoggedIn) { + Intent myIntent = new Intent(SplashActivity.this, MainActivity.class); + startActivity(myIntent); + overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); + finish(); + } else { + Intent myIntent = new Intent(SplashActivity.this, LoginActivity.class); + startActivity(myIntent); + overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); + finish(); + }*/ + } + }, TIMER); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/activities/SummaryActivity.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/activities/SummaryActivity.java new file mode 100644 index 0000000..49e11b6 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/activities/SummaryActivity.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.qualitycontrol.activities; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.qualitycontrol.R; + +public class SummaryActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_summary); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/adapters/ImageAdapter.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/adapters/ImageAdapter.java new file mode 100644 index 0000000..8a0a7c3 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/adapters/ImageAdapter.java @@ -0,0 +1,70 @@ +package com.utopiaindustries.qualitycontrol.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.utopiaindustries.qualitycontrol.R; + +import java.util.List; + +public class ImageAdapter extends RecyclerView.Adapter { + + //private byte[] file; + //private List imageList; + List imageList; + private Context context; + + public ImageAdapter(List imageList, Context context) { + this.imageList = imageList; + this.context = context; + } + + @NonNull + @Override + public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image, parent, false); + return new ImageViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) { + //holder.imageView.setImageBitmap(null); + holder.imageView.setImageResource(R.drawable.img_load); + //Bitmap bitmap = BitmapFactory.decodeByteArray( imageList.get(position), 0 , imageList.get(position).length ); + //holder.imageView.setImageBitmap( bitmap ); + + /*Glide.with(context) + .load(bitmap) // Load the Bitmap directly + .placeholder(R.drawable.img_load) + .apply(new RequestOptions().centerCrop()) // Optional: apply transformations like center crop + .into(holder.imageView);*/ + + Glide.with(context) + .load(imageList.get(position)) // Glide will handle the decoding and placeholder + .placeholder(R.drawable.img_load) + .apply(new RequestOptions().centerCrop()) + .into(holder.imageView); + } + + @Override + public int getItemCount() { + return imageList.size(); + } + + public class ImageViewHolder extends RecyclerView.ViewHolder { + ImageView imageView; + + public ImageViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + } + } +} diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/adapters/ItemAdapter.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/adapters/ItemAdapter.java new file mode 100644 index 0000000..327246d --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/adapters/ItemAdapter.java @@ -0,0 +1,85 @@ +package com.utopiaindustries.qualitycontrol.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.utopiaindustries.qualitycontrol.R; +import com.utopiaindustries.qualitycontrol.models.Item; + +import java.util.List; + +public class ItemAdapter extends RecyclerView.Adapter { + + private final Context context; + private final List items; + private final String[] dropdownOptions = {"1", "2", "3", "4", "5"}; + + public ItemAdapter(Context context, List items) { + this.context = context; + this.items = items; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_recycler_view, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + Item currentItem = items.get(position); + holder.tvItemName.setText(currentItem.getName()); + + ArrayAdapter adapter = new ArrayAdapter<>(context,R.layout.spinner_style,dropdownOptions); + adapter.setDropDownViewResource(R.layout.spinner_style); + // Set up the Spinner (Dropdown) + /*ArrayAdapter adapter = new ArrayAdapter<>(context, android.R.layout.simple_spinner_item, dropdownOptions); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);*/ + holder.spinnerOptions.setAdapter(adapter); + + // Preselect an option if needed + holder.spinnerOptions.setSelection(currentItem.getSelectedOption()); + + // Save selected option when user selects one + holder.spinnerOptions.setOnItemSelectedListener(new android.widget.AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(android.widget.AdapterView parent, View view, int position, long id) { + currentItem.setSelectedOption(position); // Save the selected option + + if (currentItem.getSelectedOption() != position) { // Avoid unnecessary updates + currentItem.setSelectedOption(position); // Save the selected option + } + } + + @Override + public void onNothingSelected(android.widget.AdapterView parent) { + // Do nothing + } + }); + } + + @Override + public int getItemCount() { + return items.size(); + } + + public static class ItemViewHolder extends RecyclerView.ViewHolder { + TextView tvItemName; + Spinner spinnerOptions; + + public ItemViewHolder(@NonNull View itemView) { + super(itemView); + tvItemName = itemView.findViewById(R.id.tv_item_name); + spinnerOptions = itemView.findViewById(R.id.spinner_item_options); + } + } +} diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/apiservice/ApiService.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/apiservice/ApiService.java new file mode 100644 index 0000000..e887842 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/apiservice/ApiService.java @@ -0,0 +1,31 @@ +package com.utopiaindustries.qualitycontrol.apiservice; + +import com.utopiaindustries.qualitycontrol.models.QualityControlResponse; + +import java.util.List; + +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public interface ApiService { + + /*@GET("rest/uic/inspection-report") + Call> fetchAllReports( + @Query("username") String username + );*/ + + @GET("rest/application/authenticate-user") + Call isUserAuthenticated( + @Query("username") String username, + @Query("password") String password + ); + + + /*@POST("rest/application/save-truck-load") + Call pickTruckLoad( + @Body PickupRequest request + );*/ +} diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/apiservice/ApiServiceFactory.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/apiservice/ApiServiceFactory.java new file mode 100644 index 0000000..445aaf5 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/apiservice/ApiServiceFactory.java @@ -0,0 +1,17 @@ +package com.utopiaindustries.qualitycontrol.apiservice; + +import retrofit2.Retrofit; + +public class ApiServiceFactory { + + private static ApiService apiService; + + public synchronized static ApiService getApiService() { + if ( apiService == null ) { + Retrofit retrofit = RetrofitClient.getClient(); + apiService = retrofit.create( ApiService.class ); + } + return apiService; + } + +} diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/apiservice/RetrofitClient.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/apiservice/RetrofitClient.java new file mode 100644 index 0000000..82a3ecf --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/apiservice/RetrofitClient.java @@ -0,0 +1,45 @@ +package com.utopiaindustries.qualitycontrol.apiservice; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class RetrofitClient { + + private final static String BASE_URL = "http://192.168.90.228:8080/cosmos/"; + + private static Retrofit retrofit; + + public synchronized static Retrofit getClient() { + + Gson gson = new GsonBuilder() + //.registerTypeAdapter(Boolean.class, new BooleanTypeAdapter()) + .create(); + + + if (retrofit == null) { + try { + + OkHttpClient okHttpClient = new OkHttpClient.Builder() + .connectTimeout(40, TimeUnit.SECONDS) + .readTimeout(40, TimeUnit.SECONDS) + .writeTimeout(40, TimeUnit.SECONDS) + .build(); + + retrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + .client(okHttpClient) + .addConverterFactory(GsonConverterFactory.create(gson)) + .build(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return retrofit; + } +} diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/CheckingFragment.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/CheckingFragment.java new file mode 100644 index 0000000..bfba586 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/CheckingFragment.java @@ -0,0 +1,72 @@ +package com.utopiaindustries.qualitycontrol.fragments; + +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import com.utopiaindustries.qualitycontrol.R; +import com.utopiaindustries.qualitycontrol.activities.HomeActivity; +import com.utopiaindustries.qualitycontrol.adapters.ImageAdapter; +import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter; +import com.utopiaindustries.qualitycontrol.models.Item; + +import java.util.ArrayList; +import java.util.List; + +public class CheckingFragment extends Fragment { + + RecyclerView recyclerView, imageRecyclerView; + ImageAdapter imageAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.fragment_checking, container, false); + + initializeLayout(view); + + List itemList = new ArrayList<>(); + itemList.add(new Item("Sort", 0)); + itemList.add(new Item("Set in Order", 0)); + itemList.add(new Item("Shine", 0)); + itemList.add(new Item("Standardize", 0)); + itemList.add(new Item("Sustain", 0)); + itemList.add(new Item("Safety", 0)); + + // Set up RecyclerView + ItemAdapter adapter = new ItemAdapter(getActivity(), itemList); + recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + recyclerView.setAdapter(adapter); + + Button nextButton = view.findViewById(R.id.btn_next); + nextButton.setOnClickListener(v -> { + if (getActivity() instanceof HomeActivity) { + ((HomeActivity) getActivity()).navigateToFragment(new PackingFragment(), true); + } + }); + + return view; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } + + private void initializeLayout(View view) { + + recyclerView = view.findViewById(R.id.recycler_view_checking); + imageRecyclerView = view.findViewById(R.id.imageRecyclerView); + imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false)); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/CuttingFragment.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/CuttingFragment.java new file mode 100644 index 0000000..af5a59b --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/CuttingFragment.java @@ -0,0 +1,427 @@ +package com.utopiaindustries.qualitycontrol.fragments; + +import static android.app.Activity.RESULT_OK; + +import android.Manifest; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.core.content.FileProvider; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.os.Environment; +import android.provider.MediaStore; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.TextView; +import android.widget.Toast; + +import com.utopiaindustries.qualitycontrol.R; +import com.utopiaindustries.qualitycontrol.activities.HomeActivity; +import com.utopiaindustries.qualitycontrol.adapters.ImageAdapter; +import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter; +import com.utopiaindustries.qualitycontrol.models.Item; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Array; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Objects; +import java.util.function.Consumer; + +import pub.devrel.easypermissions.AfterPermissionGranted; +import pub.devrel.easypermissions.EasyPermissions; + +public class CuttingFragment extends Fragment { + + RecyclerView recyclerView, imageRecyclerView; + ImageAdapter imageAdapter; + Button nextButton; + ImageButton imagePicker, deleteImage; + private static final int CAMERA_REQUEST = 100; + private static final int GALLERY_REQUEST = 200; + String filePath = "no_pic"; + ArrayList imageList = new ArrayList<>(); + + // Activity Result Launcher for Gallery + private final ActivityResultLauncher imagePickerLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == requireActivity().RESULT_OK && result.getData() != null) { + Uri selectedImage = result.getData().getData(); + if (selectedImage != null) { + //imageView.setImageURI(selectedImage); + Log.e("Selected-Image: ", "" + selectedImage); + + uriToByteArrayAsync( + getContext(), + selectedImage, + 100, // Target size in KB + compressedImage -> { + // Handle the compressed image here, e.g., display it + requireActivity().runOnUiThread(() -> { + //store.getReport().getItems().get(0).getCheckPoints().get(requestCode).addImageList(compressedImage); + imageList.add(compressedImage); + imageAdapter.notifyDataSetChanged(); + }); + }, + error -> { + // Handle any errors + requireActivity().runOnUiThread(() -> { + Toast.makeText(getContext(), "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show(); + }); + } + ); + } + } + }); + + // Activity Result Launcher for Camera + private final ActivityResultLauncher cameraLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + Uri contentUri = Uri.fromFile(new File((filePath))); + + uriToByteArrayAsync( + getContext(), + contentUri, + 100, // Target size in KB + compressedImage -> { + // Handle the compressed image here, e.g., display it + requireActivity().runOnUiThread(() -> { + //store.getReport().getItems().get(0).getCheckPoints().get(requestCode).addImageList(compressedImage); + imageList.add(compressedImage); + imageAdapter.notifyDataSetChanged(); + }); + }, + error -> { + // Handle any errors + requireActivity().runOnUiThread(() -> { + Toast.makeText(getContext(), "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show(); + }); + } + ); + + Log.e("contentUri: ", "" + contentUri); + if (result.getResultCode() == requireActivity().RESULT_OK && result.getData() != null) { + + Uri selectedImage = result.getData().getData(); + if (selectedImage != null) { + //imageView.setImageURI(selectedImage); + Log.e("Selected-Image: ", "" + selectedImage); + } + } + }); + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + // Inflate the layout for this fragment + View view = inflater.inflate(R.layout.fragment_cutting, container, false); + + initializeLayout(view); + + List itemList = new ArrayList<>(); + itemList.add(new Item("Sort", 0)); + itemList.add(new Item("Set in Order", 0)); + itemList.add(new Item("Shine", 0)); + itemList.add(new Item("Standardize", 0)); + itemList.add(new Item("Sustain", 0)); + itemList.add(new Item("Safety", 0)); + + // Set up RecyclerView + ItemAdapter adapter = new ItemAdapter(getActivity(), itemList); + recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + recyclerView.setAdapter(adapter); + + imageAdapter = new ImageAdapter(imageList, getActivity()); + imageRecyclerView.setAdapter(imageAdapter); + + nextButton.setOnClickListener(v -> { + if (getActivity() instanceof HomeActivity) { + ((HomeActivity) getActivity()).navigateToFragment(new StitchingFragment(), true); + } + }); + + imagePicker.setOnClickListener(v -> { + showAlertDialog(view); + }); + + deleteImage.setOnClickListener(v -> { + + }); + + return view; + } + + private void initializeLayout(View view) { + + imagePicker = view.findViewById(R.id.image_picker); + deleteImage = view.findViewById(R.id.delete_image); + nextButton = view.findViewById(R.id.btn_next); + recyclerView = view.findViewById(R.id.recycler_view_cutting); + imageRecyclerView = view.findViewById(R.id.imageRecyclerView); + imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false)); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } + + public void showAlertDialog(View view) { + ViewGroup viewGroup = view.findViewById(android.R.id.content); + + TextView txt_camera, txt_gallery, txt_cancel; + + AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity()); + View view1 = LayoutInflater.from(getActivity()).inflate(R.layout.custom_layout, viewGroup, false); + builder.setCancelable(false); + builder.setView(view1); + + txt_camera = view1.findViewById(R.id.txt_camera); + txt_gallery = view1.findViewById(R.id.txt_gallery); + txt_cancel = view1.findViewById(R.id.txt_cancel); + + AlertDialog alertDialog = builder.create(); + Objects.requireNonNull(alertDialog.getWindow()).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + txt_camera.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openCamera(); + } + }); + + txt_gallery.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openGallery(); + } + }); + + txt_cancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + } + }); + + alertDialog.show(); + } + + @AfterPermissionGranted(GALLERY_REQUEST) + public void openCamera() { + if (hasCameraPermission()) { + Log.e("hasCameraPermission: ", "true"); + // Have permission, do the thing! + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + // Ensure that there's a camera activity to handle the intent + if (takePictureIntent.resolveActivity(requireActivity().getPackageManager()) != null) { + // Create the File where the photo should go + File photoFile = null; + try { + photoFile = createImageFile(); + } catch (IOException ex) { + // Error occurred while creating the File + + } + // Continue only if the File was successfully created + if (photoFile != null) { + Uri photoURI = FileProvider.getUriForFile(requireActivity(), + "com.utopiaindustries.qualitycontrol", + photoFile); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); + //startActivityForResult(takePictureIntent, CAMERA_REQUEST); + cameraLauncher.launch(takePictureIntent); + } + } + } else { + // Ask for one permission + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + Log.e("TIRAMISU: ", "***"); + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA}; + } else { + Log.e("Not-TIRAMISU: ", "***"); + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; + + } + + //Log.e("perms: ",""+perms.length); + + EasyPermissions.requestPermissions(this, getString(R.string.rationale_camera), CAMERA_REQUEST, perms); + } + } + + public void openGallery() { + if (hasGalleryPermission()) { + // Have permission, do the thing! + Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + // Start the Intent + //startActivityForResult(galleryIntent, GALLERY_REQUEST); + imagePickerLauncher.launch(galleryIntent); + } else { + // Ask for one permission + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + + } + EasyPermissions.requestPermissions(this, getString(R.string.rationale_camera), GALLERY_REQUEST, perms); + } + } + + private boolean hasGalleryPermission() { + String[] perms = {}; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + } + + return EasyPermissions.hasPermissions(requireActivity(), perms); + } + + private boolean hasCameraPermission() { + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + //Log.e("TIRAMISU: ","***"); + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA}; + } else { + //Log.e("Not-TIRAMISU: ","***"); + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; + + } + + //Log.e("perms: ",""+perms); + return EasyPermissions.hasPermissions(requireActivity(), perms); + } + + private File createImageFile() throws IOException { + // Create an image file name + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String imageFileName = "JPEG_" + timeStamp + "_"; + File storageDir = requireActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES); + File image = File.createTempFile( + imageFileName, /* prefix */ + ".jpg", /* suffix */ + storageDir /* directory */ + ); + + filePath = image.getAbsolutePath(); + return image; + } + + /*public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + + if (requestCode == GALLERY_REQUEST) { + Log.e("=====From Gallery", "========="); + Uri contentUri = data.getData(); + //filePath = Helper.getPath(contentUri, this); + *//*try { + //For Cropping purposes + String currentTimeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); + File destinationFile = new File(getCacheDir(), "croppedImage.png" + currentTimeStamp); + Uri destinationUri = Uri.fromFile(destinationFile); + + } catch (Exception e) { + Log.e("=====From Gallery error", "=========" + e.getMessage()); + e.printStackTrace(); + }*//* + + + } else if (requestCode == CAMERA_REQUEST) { + //Log.e("=====From Camera", "=========" + filePath); + + // rotatedBitmap = Helper.getBitmap(filePath); + + //For Cropping purposes + *//*String currentTimeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); + File destinationFile = new File(getCacheDir(), "croppedImage.png" + currentTimeStamp); + Uri destinationUri = Uri.fromFile(destinationFile); + Uri contentUri = Uri.fromFile(new File((filePath)));*//* + + } + } + + }*/ + + public void uriToByteArrayAsync( + Context context, + Uri uri, + int targetSizeInKB, + Consumer onSuccess, + Consumer onError + ) { + new Thread(() -> { + try { + int targetSizeInBytes = targetSizeInKB * 1024; + + // Load the image as a Bitmap without scaling + Bitmap bitmap; + try (InputStream inputStream = context.getContentResolver().openInputStream(uri)) { + bitmap = BitmapFactory.decodeStream(inputStream); + } + + if (bitmap == null) { + throw new IOException("Failed to decode image from URI."); + } + + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + int minQuality = 10; + int maxQuality = 100; + int quality = maxQuality; + + // Binary search for the best quality that meets the target size + while (minQuality <= maxQuality) { + byteArrayOutputStream.reset(); + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, byteArrayOutputStream); + + int byteSize = byteArrayOutputStream.size(); + if (byteSize > targetSizeInBytes) { + maxQuality = quality - 1; + } else { + minQuality = quality + 1; + } + quality = (minQuality + maxQuality) / 2; + } + + onSuccess.accept(byteArrayOutputStream.toByteArray()); + } catch (IOException e) { + onError.accept(e); + } + }).start(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/HomeFragment.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/HomeFragment.java new file mode 100644 index 0000000..53c836a --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/HomeFragment.java @@ -0,0 +1,91 @@ +package com.utopiaindustries.qualitycontrol.fragments; + +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AutoCompleteTextView; +import android.widget.Button; +import android.widget.TextView; + +import com.utopiaindustries.qualitycontrol.R; +import com.utopiaindustries.qualitycontrol.activities.HomeActivity; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +public class HomeFragment extends Fragment { + + AutoCompleteTextView locationTextview, departmentTextView, floorTextview; + TextView txtCurrentDate; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.fragment_home, container, false); + + initializeLayout(view); + + String date = new SimpleDateFormat("EEEE, MMM d, yyyy", Locale.getDefault()).format(new Date()); + txtCurrentDate.setText(date); + + locationTextview.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int position, long l) { + String item = adapterView.getItemAtPosition(position).toString(); + Log.e("Item-----------: ", "" + item); + + + } + }); + + departmentTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int position, long l) { + String item = adapterView.getItemAtPosition(position).toString(); + Log.e("Item-----------: ", "" + item); + + + } + }); + + floorTextview.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int position, long l) { + String item = adapterView.getItemAtPosition(position).toString(); + Log.e("Item-----------: ", "" + item); + + + } + }); + + Button nextButton = view.findViewById(R.id.btn_next); + nextButton.setOnClickListener(v -> { + if (getActivity() instanceof HomeActivity) { + ((HomeActivity) getActivity()).navigateToFragment(new CuttingFragment(), true); + } + }); + + return view; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } + + public void initializeLayout(View view) { + txtCurrentDate = view.findViewById(R.id.txt_current_date); + locationTextview = view.findViewById(R.id.location_textview); + departmentTextView = view.findViewById(R.id.department_textview); + floorTextview = view.findViewById(R.id.floor_textview); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/PackingFragment.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/PackingFragment.java new file mode 100644 index 0000000..5e3f798 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/PackingFragment.java @@ -0,0 +1,72 @@ +package com.utopiaindustries.qualitycontrol.fragments; + +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import com.utopiaindustries.qualitycontrol.R; +import com.utopiaindustries.qualitycontrol.activities.HomeActivity; +import com.utopiaindustries.qualitycontrol.adapters.ImageAdapter; +import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter; +import com.utopiaindustries.qualitycontrol.models.Item; + +import java.util.ArrayList; +import java.util.List; + +public class PackingFragment extends Fragment { + + RecyclerView recyclerView, imageRecyclerView; + ImageAdapter imageAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.fragment_packing, container, false); + + initializeLayout(view); + + List itemList = new ArrayList<>(); + itemList.add(new Item("Sort", 0)); + itemList.add(new Item("Set in Order", 0)); + itemList.add(new Item("Shine", 0)); + itemList.add(new Item("Standardize", 0)); + itemList.add(new Item("Sustain", 0)); + itemList.add(new Item("Safety", 0)); + + // Set up RecyclerView + ItemAdapter adapter = new ItemAdapter(getActivity(), itemList); + recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + recyclerView.setAdapter(adapter); + + Button nextButton = view.findViewById(R.id.btn_next); + nextButton.setOnClickListener(v -> { + if (getActivity() instanceof HomeActivity) { + ((HomeActivity) getActivity()).navigateToFragment(new SubStoreFragment(), true); + } + }); + + return view; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } + + private void initializeLayout(View view) { + + recyclerView = view.findViewById(R.id.recycler_view_packing); + imageRecyclerView = view.findViewById(R.id.imageRecyclerView); + imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false)); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/StitchingFragment.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/StitchingFragment.java new file mode 100644 index 0000000..cc18749 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/StitchingFragment.java @@ -0,0 +1,72 @@ +package com.utopiaindustries.qualitycontrol.fragments; + +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import com.utopiaindustries.qualitycontrol.R; +import com.utopiaindustries.qualitycontrol.activities.HomeActivity; +import com.utopiaindustries.qualitycontrol.adapters.ImageAdapter; +import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter; +import com.utopiaindustries.qualitycontrol.models.Item; + +import java.util.ArrayList; +import java.util.List; + +public class StitchingFragment extends Fragment { + + RecyclerView recyclerView, imageRecyclerView; + ImageAdapter imageAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.fragment_stitching, container, false); + + initializeLayout(view); + + List itemList = new ArrayList<>(); + itemList.add(new Item("Sort", 0)); + itemList.add(new Item("Set in Order", 0)); + itemList.add(new Item("Shine", 0)); + itemList.add(new Item("Standardize", 0)); + itemList.add(new Item("Sustain", 0)); + itemList.add(new Item("Safety", 0)); + + // Set up RecyclerView + ItemAdapter adapter = new ItemAdapter(getActivity(), itemList); + recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + recyclerView.setAdapter(adapter); + + Button nextButton = view.findViewById(R.id.btn_next); + nextButton.setOnClickListener(v -> { + if (getActivity() instanceof HomeActivity) { + ((HomeActivity) getActivity()).navigateToFragment(new CheckingFragment(), true); + } + }); + + return view; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } + + private void initializeLayout(View view) { + + recyclerView = view.findViewById(R.id.recycler_view_stitching); + imageRecyclerView = view.findViewById(R.id.imageRecyclerView); + imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false)); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/SubStoreFragment.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/SubStoreFragment.java new file mode 100644 index 0000000..bb1916f --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/fragments/SubStoreFragment.java @@ -0,0 +1,74 @@ +package com.utopiaindustries.qualitycontrol.fragments; + +import android.content.Intent; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import com.utopiaindustries.qualitycontrol.R; +import com.utopiaindustries.qualitycontrol.activities.HomeActivity; +import com.utopiaindustries.qualitycontrol.activities.SummaryActivity; +import com.utopiaindustries.qualitycontrol.adapters.ImageAdapter; +import com.utopiaindustries.qualitycontrol.adapters.ItemAdapter; +import com.utopiaindustries.qualitycontrol.models.Item; + +import java.util.ArrayList; +import java.util.List; + +public class SubStoreFragment extends Fragment { + + RecyclerView recyclerView, imageRecyclerView; + ImageAdapter imageAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.fragment_sub_store, container, false); + + initializeLayout(view); + + List itemList = new ArrayList<>(); + itemList.add(new Item("Sort", 0)); + itemList.add(new Item("Set in Order", 0)); + itemList.add(new Item("Shine", 0)); + itemList.add(new Item("Standardize", 0)); + itemList.add(new Item("Sustain", 0)); + itemList.add(new Item("Safety", 0)); + + // Set up RecyclerView + ItemAdapter adapter = new ItemAdapter(getActivity(), itemList); + recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + recyclerView.setAdapter(adapter); + + Button nextButton = view.findViewById(R.id.btn_next); + nextButton.setOnClickListener(v -> { + Intent intent = new Intent(getActivity(), SummaryActivity.class); + startActivity(intent); + getActivity().finish(); + }); + + return view; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } + + private void initializeLayout(View view) { + + recyclerView = view.findViewById(R.id.recycler_view_substore); + imageRecyclerView = view.findViewById(R.id.imageRecyclerView); + imageRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false)); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/helper/Helper.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/helper/Helper.java new file mode 100644 index 0000000..29094b6 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/helper/Helper.java @@ -0,0 +1,25 @@ +package com.utopiaindustries.qualitycontrol.helper; + +import android.content.Context; +import android.content.SharedPreferences; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.preference.PreferenceManager; +import android.text.TextUtils; + +import com.google.gson.Gson; + +public class Helper { + + public static final String project_file = "Quality-Control"; + + public static boolean isValidEmail(CharSequence target) { + return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches(); + } + + public static boolean isNetworkConnected(Context context) { + ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); + return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); + } +} diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/helper/Preference.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/helper/Preference.java new file mode 100644 index 0000000..757f8fd --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/helper/Preference.java @@ -0,0 +1,77 @@ +package com.utopiaindustries.qualitycontrol.helper; + +import android.content.Context; +import android.content.SharedPreferences; + +public class Preference { + + private static final int PREFERENCE_MODE_PRIVATE = 0; + private static String MY_STRING_PREF = "mystringpref"; + public static String LOGIN_FILE = "login_prefs"; + public static String TEMP_FILE = "temp_prefs"; + + + public static String KEY_PIN_CODE = "pin_code"; + + public static String KEY_CUSTOMER_ID = "cus_id"; + public static String KEY_CUSTOMER_NAME = "cus_name"; + + public static String KEY_USER_IS_MASTER = "user_is_master"; + + public static SharedPreferences getPrefs(String nameOfFile, Context context) { + + return context.getSharedPreferences(nameOfFile, Context.MODE_PRIVATE); + } + + public static boolean containsKey(String fileName, String key, Context context) { + return getPrefs(fileName, context).contains(key); + } + + public static String getMyStringPref(String fileName, String key, Context context) { + + return getPrefs(fileName,context).getString(key, "default"); + } + public static boolean getMyBooleanPref(String fileName, String key, Context context) { + + return getPrefs(fileName,context).getBoolean(key,false); + } + public static int getMyIntPref(String fileName, String key, Context context) { + + return getPrefs(fileName,context).getInt(key, 0); + } + + public static long getMyLongPref(String fileName, String key, Context context) { + + return getPrefs(fileName,context).getLong(key, 0); + } + + public static void setMyLongPref(String fileName, String key, Context context, long value) { + // perform validation etc.. + getPrefs(fileName,context).edit().putLong(key, value).apply(); + } + + public static void setMyStringPref(String fileName, String key, Context context, String value) { + // perform validation etc.. + getPrefs(fileName,context).edit().putString(key, value).apply(); + } + + public static void setMyBooleanPref(String fileName, String key, Context context, boolean value) { + // perform validation etc.. + getPrefs(fileName,context).edit().putBoolean(key, value).apply(); + } + + public static void setMyIntPref(String fileName, String key, Context context, int value) { + // perform validation etc.. + getPrefs(fileName,context).edit().putInt(key, value).apply(); + } + + + public static void remove(String fileName, String key, Context context) { + // perform validation etc.. + getPrefs(fileName,context).edit().remove(key).apply(); + } + public static void removeAll(String fileName, Context context) { + // perform validation etc.. + getPrefs(fileName,context).edit().clear().apply(); + } +} diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/models/Item.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/models/Item.java new file mode 100644 index 0000000..d5f1256 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/models/Item.java @@ -0,0 +1,24 @@ +package com.utopiaindustries.qualitycontrol.models; + +public class Item { + + private final String name; + private int selectedOption; // Index of the selected dropdown option + + public Item(String name, int selectedOption) { + this.name = name; + this.selectedOption = selectedOption; + } + + public String getName() { + return name; + } + + public int getSelectedOption() { + return selectedOption; + } + + public void setSelectedOption(int selectedOption) { + this.selectedOption = selectedOption; + } +} diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/models/QualityControlResponse.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/models/QualityControlResponse.java new file mode 100644 index 0000000..09ef247 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/models/QualityControlResponse.java @@ -0,0 +1,4 @@ +package com.utopiaindustries.qualitycontrol.models; + +public class QualityControlResponse { +} diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/utils/SharedViewModel.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/utils/SharedViewModel.java new file mode 100644 index 0000000..7b1efbe --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/utils/SharedViewModel.java @@ -0,0 +1,467 @@ +package com.utopiaindustries.qualitycontrol.utils; + +import androidx.lifecycle.ViewModel; + +import java.util.ArrayList; + +public class SharedViewModel extends ViewModel { + private String currentDate; + private String location; + private String department; + private String floor; + + //Cutting + private String cuttingSort; + private String cuttingSetInOrder; + private String cuttingShine; + private String cuttingStandardize; + private String cuttingSustain; + private String cuttingSafety; + private String cuttingPercentage; + private String cuttingRemarks; + private ArrayList cuttingImageList; + + //Stitching + private String stitchingSort; + private String stitchingSetInOrder; + private String stitchingShine; + private String stitchingStandardize; + private String stitchingSustain; + private String stitchingSafety; + private String stitchingPercentage; + private String stitchingRemarks; + private ArrayList stitchingImageList; + + //Checking + private String checkingSort; + private String checkingSetInOrder; + private String checkingShine; + private String checkingStandardize; + private String checkingSustain; + private String checkingSafety; + private String checkingPercentage; + private String checkingRemarks; + private ArrayList checkingImageList; + + //Packing + private String packingSort; + private String packingSetInOrder; + private String packingShine; + private String packingStandardize; + private String packingSustain; + private String packingSafety; + private String packingPercentage; + private String packingRemarks; + private ArrayList packingImageList; + + //Sub Store + private String subStoreSort; + private String subStoreSetInOrder; + private String subStoreShine; + private String subStoreStandardize; + private String subStoreSustain; + private String subStoreSafety; + private String subStorePercentage; + private String subStoreRemarks; + private ArrayList subStoreImageList; + + public SharedViewModel() { + cuttingImageList = new ArrayList<>(); + stitchingImageList = new ArrayList<>(); + checkingImageList = new ArrayList<>(); + packingImageList = new ArrayList<>(); + subStoreImageList = new ArrayList<>(); + } + + public String getCurrentDate() { + return currentDate; + } + + public void setCurrentDate(String currentDate) { + this.currentDate = currentDate; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getDepartment() { + return department; + } + + public void setDepartment(String department) { + this.department = department; + } + + public String getFloor() { + return floor; + } + + public void setFloor(String floor) { + this.floor = floor; + } + + public String getCuttingSort() { + return cuttingSort; + } + + public void setCuttingSort(String cuttingSort) { + this.cuttingSort = cuttingSort; + } + + public String getCuttingSetInOrder() { + return cuttingSetInOrder; + } + + public void setCuttingSetInOrder(String cuttingSetInOrder) { + this.cuttingSetInOrder = cuttingSetInOrder; + } + + public String getCuttingShine() { + return cuttingShine; + } + + public void setCuttingShine(String cuttingShine) { + this.cuttingShine = cuttingShine; + } + + public String getCuttingStandardize() { + return cuttingStandardize; + } + + public void setCuttingStandardize(String cuttingStandardize) { + this.cuttingStandardize = cuttingStandardize; + } + + public String getCuttingSustain() { + return cuttingSustain; + } + + public void setCuttingSustain(String cuttingSustain) { + this.cuttingSustain = cuttingSustain; + } + + public String getCuttingSafety() { + return cuttingSafety; + } + + public void setCuttingSafety(String cuttingSafety) { + this.cuttingSafety = cuttingSafety; + } + + public String getCuttingPercentage() { + return cuttingPercentage; + } + + public void setCuttingPercentage(String cuttingPercentage) { + this.cuttingPercentage = cuttingPercentage; + } + + public String getCuttingRemarks() { + return cuttingRemarks; + } + + public void setCuttingRemarks(String cuttingRemarks) { + this.cuttingRemarks = cuttingRemarks; + } + + public ArrayList getCuttingImageList() { + return cuttingImageList; + } + + public void setCuttingImageList(ArrayList cuttingImageList) { + this.cuttingImageList = cuttingImageList; + } + + public String getStitchingSort() { + return stitchingSort; + } + + public void setStitchingSort(String stitchingSort) { + this.stitchingSort = stitchingSort; + } + + public String getStitchingSetInOrder() { + return stitchingSetInOrder; + } + + public void setStitchingSetInOrder(String stitchingSetInOrder) { + this.stitchingSetInOrder = stitchingSetInOrder; + } + + public String getStitchingShine() { + return stitchingShine; + } + + public void setStitchingShine(String stitchingShine) { + this.stitchingShine = stitchingShine; + } + + public String getStitchingStandardize() { + return stitchingStandardize; + } + + public void setStitchingStandardize(String stitchingStandardize) { + this.stitchingStandardize = stitchingStandardize; + } + + public String getStitchingSustain() { + return stitchingSustain; + } + + public void setStitchingSustain(String stitchingSustain) { + this.stitchingSustain = stitchingSustain; + } + + public String getStitchingSafety() { + return stitchingSafety; + } + + public void setStitchingSafety(String stitchingSafety) { + this.stitchingSafety = stitchingSafety; + } + + public String getStitchingPercentage() { + return stitchingPercentage; + } + + public void setStitchingPercentage(String stitchingPercentage) { + this.stitchingPercentage = stitchingPercentage; + } + + public String getStitchingRemarks() { + return stitchingRemarks; + } + + public void setStitchingRemarks(String stitchingRemarks) { + this.stitchingRemarks = stitchingRemarks; + } + + public ArrayList getStitchingImageList() { + return stitchingImageList; + } + + public void setStitchingImageList(ArrayList stitchingImageList) { + this.stitchingImageList = stitchingImageList; + } + + public String getCheckingSort() { + return checkingSort; + } + + public void setCheckingSort(String checkingSort) { + this.checkingSort = checkingSort; + } + + public String getCheckingSetInOrder() { + return checkingSetInOrder; + } + + public void setCheckingSetInOrder(String checkingSetInOrder) { + this.checkingSetInOrder = checkingSetInOrder; + } + + public String getCheckingShine() { + return checkingShine; + } + + public void setCheckingShine(String checkingShine) { + this.checkingShine = checkingShine; + } + + public String getCheckingStandardize() { + return checkingStandardize; + } + + public void setCheckingStandardize(String checkingStandardize) { + this.checkingStandardize = checkingStandardize; + } + + public String getCheckingSustain() { + return checkingSustain; + } + + public void setCheckingSustain(String checkingSustain) { + this.checkingSustain = checkingSustain; + } + + public String getCheckingSafety() { + return checkingSafety; + } + + public void setCheckingSafety(String checkingSafety) { + this.checkingSafety = checkingSafety; + } + + public String getCheckingPercentage() { + return checkingPercentage; + } + + public void setCheckingPercentage(String checkingPercentage) { + this.checkingPercentage = checkingPercentage; + } + + public String getCheckingRemarks() { + return checkingRemarks; + } + + public void setCheckingRemarks(String checkingRemarks) { + this.checkingRemarks = checkingRemarks; + } + + public ArrayList getCheckingImageList() { + return checkingImageList; + } + + public void setCheckingImageList(ArrayList checkingImageList) { + this.checkingImageList = checkingImageList; + } + + public String getPackingSort() { + return packingSort; + } + + public void setPackingSort(String packingSort) { + this.packingSort = packingSort; + } + + public String getPackingSetInOrder() { + return packingSetInOrder; + } + + public void setPackingSetInOrder(String packingSetInOrder) { + this.packingSetInOrder = packingSetInOrder; + } + + public String getPackingShine() { + return packingShine; + } + + public void setPackingShine(String packingShine) { + this.packingShine = packingShine; + } + + public String getPackingStandardize() { + return packingStandardize; + } + + public void setPackingStandardize(String packingStandardize) { + this.packingStandardize = packingStandardize; + } + + public String getPackingSustain() { + return packingSustain; + } + + public void setPackingSustain(String packingSustain) { + this.packingSustain = packingSustain; + } + + public String getPackingSafety() { + return packingSafety; + } + + public void setPackingSafety(String packingSafety) { + this.packingSafety = packingSafety; + } + + public String getPackingPercentage() { + return packingPercentage; + } + + public void setPackingPercentage(String packingPercentage) { + this.packingPercentage = packingPercentage; + } + + public String getPackingRemarks() { + return packingRemarks; + } + + public void setPackingRemarks(String packingRemarks) { + this.packingRemarks = packingRemarks; + } + + public ArrayList getPackingImageList() { + return packingImageList; + } + + public void setPackingImageList(ArrayList packingImageList) { + this.packingImageList = packingImageList; + } + + public String getSubStoreSort() { + return subStoreSort; + } + + public void setSubStoreSort(String subStoreSort) { + this.subStoreSort = subStoreSort; + } + + public String getSubStoreSetInOrder() { + return subStoreSetInOrder; + } + + public void setSubStoreSetInOrder(String subStoreSetInOrder) { + this.subStoreSetInOrder = subStoreSetInOrder; + } + + public String getSubStoreShine() { + return subStoreShine; + } + + public void setSubStoreShine(String subStoreShine) { + this.subStoreShine = subStoreShine; + } + + public String getSubStoreStandardize() { + return subStoreStandardize; + } + + public void setSubStoreStandardize(String subStoreStandardize) { + this.subStoreStandardize = subStoreStandardize; + } + + public String getSubStoreSustain() { + return subStoreSustain; + } + + public void setSubStoreSustain(String subStoreSustain) { + this.subStoreSustain = subStoreSustain; + } + + public String getSubStoreSafety() { + return subStoreSafety; + } + + public void setSubStoreSafety(String subStoreSafety) { + this.subStoreSafety = subStoreSafety; + } + + public String getSubStorePercentage() { + return subStorePercentage; + } + + public void setSubStorePercentage(String subStorePercentage) { + this.subStorePercentage = subStorePercentage; + } + + public String getSubStoreRemarks() { + return subStoreRemarks; + } + + public void setSubStoreRemarks(String subStoreRemarks) { + this.subStoreRemarks = subStoreRemarks; + } + + public ArrayList getSubStoreImageList() { + return subStoreImageList; + } + + public void setSubStoreImageList(ArrayList subStoreImageList) { + this.subStoreImageList = subStoreImageList; + } +} diff --git a/app/src/main/java/com/utopiaindustries/qualitycontrol/viewmodels/LoginViewModel.java b/app/src/main/java/com/utopiaindustries/qualitycontrol/viewmodels/LoginViewModel.java new file mode 100644 index 0000000..5d26343 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/qualitycontrol/viewmodels/LoginViewModel.java @@ -0,0 +1,70 @@ +package com.utopiaindustries.qualitycontrol.viewmodels; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import com.utopiaindustries.qualitycontrol.apiservice.ApiService; +import com.utopiaindustries.qualitycontrol.apiservice.ApiServiceFactory; +import com.utopiaindustries.qualitycontrol.models.QualityControlResponse; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class LoginViewModel extends ViewModel { + + private MutableLiveData userLiveData; + private MutableLiveData errorLiveData; + private MutableLiveData isLoading; + private ApiService apiService; + + public LoginViewModel() { + apiService = ApiServiceFactory.getApiService(); + userLiveData = new MutableLiveData<>(); + errorLiveData = new MutableLiveData<>(); + isLoading = new MutableLiveData<>(); + } + + public LiveData getUserLiveData() { + return userLiveData; + } + + public LiveData getLoadingState() { + + return isLoading; + } + + public LiveData getErrorMessage() { + return errorLiveData; + } + + public void authenticateUser(String user, String password) { + isLoading.setValue(true); + apiService.isUserAuthenticated(user, password).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + isLoading.setValue(false); + if (response.isSuccessful() && response.body() != null) { + userLiveData.setValue(response.body()); + } else { + errorLiveData.setValue(response.message()); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + isLoading.setValue(false); + errorLiveData.setValue(t.getMessage()); + } + }); + } + + public LiveData getUser() { + return userLiveData; + } + + public LiveData getError() { + return errorLiveData; + } +} diff --git a/app/src/main/res/anim/bs_list_layout_fade_in.xml b/app/src/main/res/anim/bs_list_layout_fade_in.xml new file mode 100644 index 0000000..f967280 --- /dev/null +++ b/app/src/main/res/anim/bs_list_layout_fade_in.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/anim/fade_in.xml b/app/src/main/res/anim/fade_in.xml new file mode 100644 index 0000000..e27221b --- /dev/null +++ b/app/src/main/res/anim/fade_in.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/fade_out.xml b/app/src/main/res/anim/fade_out.xml new file mode 100644 index 0000000..4ebd4e2 --- /dev/null +++ b/app/src/main/res/anim/fade_out.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/grow_from_bottom.xml b/app/src/main/res/anim/grow_from_bottom.xml new file mode 100644 index 0000000..be9e03a --- /dev/null +++ b/app/src/main/res/anim/grow_from_bottom.xml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/grow_from_top.xml b/app/src/main/res/anim/grow_from_top.xml new file mode 100644 index 0000000..16c36e8 --- /dev/null +++ b/app/src/main/res/anim/grow_from_top.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/popup_hide.xml b/app/src/main/res/anim/popup_hide.xml new file mode 100644 index 0000000..e311d4b --- /dev/null +++ b/app/src/main/res/anim/popup_hide.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/anim/popup_show.xml b/app/src/main/res/anim/popup_show.xml new file mode 100644 index 0000000..d90ef50 --- /dev/null +++ b/app/src/main/res/anim/popup_show.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/anim/slide_down.xml b/app/src/main/res/anim/slide_down.xml new file mode 100644 index 0000000..be798a9 --- /dev/null +++ b/app/src/main/res/anim/slide_down.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_bottom.xml b/app/src/main/res/anim/slide_in_bottom.xml new file mode 100644 index 0000000..ae4e011 --- /dev/null +++ b/app/src/main/res/anim/slide_in_bottom.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_left.xml b/app/src/main/res/anim/slide_in_left.xml new file mode 100644 index 0000000..44e6eb9 --- /dev/null +++ b/app/src/main/res/anim/slide_in_left.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_left_menu.xml b/app/src/main/res/anim/slide_in_left_menu.xml new file mode 100644 index 0000000..bc4f72c --- /dev/null +++ b/app/src/main/res/anim/slide_in_left_menu.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_right.xml b/app/src/main/res/anim/slide_in_right.xml new file mode 100644 index 0000000..740308b --- /dev/null +++ b/app/src/main/res/anim/slide_in_right.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_right_menu.xml b/app/src/main/res/anim/slide_in_right_menu.xml new file mode 100644 index 0000000..bb153b3 --- /dev/null +++ b/app/src/main/res/anim/slide_in_right_menu.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_in_top.xml b/app/src/main/res/anim/slide_in_top.xml new file mode 100644 index 0000000..a608380 --- /dev/null +++ b/app/src/main/res/anim/slide_in_top.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_bottom.xml b/app/src/main/res/anim/slide_out_bottom.xml new file mode 100644 index 0000000..46b3bf1 --- /dev/null +++ b/app/src/main/res/anim/slide_out_bottom.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/anim/slide_out_left.xml b/app/src/main/res/anim/slide_out_left.xml new file mode 100644 index 0000000..4db9289 --- /dev/null +++ b/app/src/main/res/anim/slide_out_left.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_right.xml b/app/src/main/res/anim/slide_out_right.xml new file mode 100644 index 0000000..73e7bfc --- /dev/null +++ b/app/src/main/res/anim/slide_out_right.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_top.xml b/app/src/main/res/anim/slide_out_top.xml new file mode 100644 index 0000000..6d813cd --- /dev/null +++ b/app/src/main/res/anim/slide_out_top.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_up.xml b/app/src/main/res/anim/slide_up.xml new file mode 100644 index 0000000..57f2be5 --- /dev/null +++ b/app/src/main/res/anim/slide_up.xml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/arrow_back.xml b/app/src/main/res/drawable/arrow_back.xml new file mode 100644 index 0000000..7b7c7d0 --- /dev/null +++ b/app/src/main/res/drawable/arrow_back.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/curved_layout.xml b/app/src/main/res/drawable/curved_layout.xml new file mode 100644 index 0000000..0306638 --- /dev/null +++ b/app/src/main/res/drawable/curved_layout.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/et_border.xml b/app/src/main/res/drawable/et_border.xml new file mode 100644 index 0000000..28504f7 --- /dev/null +++ b/app/src/main/res/drawable/et_border.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..883bcaa --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/image_picker.xml b/app/src/main/res/drawable/image_picker.xml new file mode 100644 index 0000000..fd890ce --- /dev/null +++ b/app/src/main/res/drawable/image_picker.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/img_load.xml b/app/src/main/res/drawable/img_load.xml new file mode 100644 index 0000000..2102567 --- /dev/null +++ b/app/src/main/res/drawable/img_load.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/rounded_border.xml b/app/src/main/res/drawable/rounded_border.xml new file mode 100644 index 0000000..db35694 --- /dev/null +++ b/app/src/main/res/drawable/rounded_border.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rounded_btn_login.xml b/app/src/main/res/drawable/rounded_btn_login.xml new file mode 100644 index 0000000..0e174d6 --- /dev/null +++ b/app/src/main/res/drawable/rounded_btn_login.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/search.png b/app/src/main/res/drawable/search.png new file mode 100644 index 0000000000000000000000000000000000000000..012167fcf7dc0aa312057cbc6a35a1d0b1f9a586 GIT binary patch literal 21551 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 L>2%K_?9cxLWzA87 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/wave_4_.xml b/app/src/main/res/drawable/wave_4_.xml new file mode 100644 index 0000000..01a16b0 --- /dev/null +++ b/app/src/main/res/drawable/wave_4_.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml new file mode 100644 index 0000000..b039eae --- /dev/null +++ b/app/src/main/res/layout/activity_home.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml new file mode 100644 index 0000000..5494a0c --- /dev/null +++ b/app/src/main/res/layout/activity_splash.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_summary.xml b/app/src/main/res/layout/activity_summary.xml new file mode 100644 index 0000000..46ac04b --- /dev/null +++ b/app/src/main/res/layout/activity_summary.xml @@ -0,0 +1,44 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/custom_layout.xml b/app/src/main/res/layout/custom_layout.xml new file mode 100644 index 0000000..e74782c --- /dev/null +++ b/app/src/main/res/layout/custom_layout.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_checking.xml b/app/src/main/res/layout/fragment_checking.xml new file mode 100644 index 0000000..7f55c88 --- /dev/null +++ b/app/src/main/res/layout/fragment_checking.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +