From 196aa969d64d1a54780f40f694e2726646e37c88 Mon Sep 17 00:00:00 2001 From: "saad.siddiq" Date: Wed, 6 Nov 2024 11:27:01 +0500 Subject: [PATCH] Add missing files --- .gitignore | 15 + .idea/.gitignore | 3 + .idea/compiler.xml | 6 + .idea/deploymentTargetSelector.xml | 18 + .idea/gradle.xml | 19 + .idea/migrations.xml | 10 + .idea/misc.xml | 10 + .idea/vcs.xml | 6 + app/.gitignore | 1 + app/build.gradle | 44 +++ app/proguard-rules.pro | 21 ++ .../selftrucking/ExampleInstrumentedTest.java | 26 ++ app/src/main/AndroidManifest.xml | 54 +++ .../ContainerDetailActivity.java | 54 +++ .../dashboardScreens/HomeActivity.java | 153 ++++++++ .../dashboardScreens/HomeViewModel.java | 8 + .../dashboardScreens/TrackingActivity.java | 59 +++ .../adapters/ContainerAdapter.java | 61 +++ .../apiservice/ApiService.java | 35 ++ .../apiservice/ApiServiceFactory.java | 25 ++ .../apiservice/MotiveApiService.java | 14 + .../apiservice/MotiveClient.java | 34 ++ .../apiservice/RetrofitClient.java | 34 ++ .../interfaces/SelectListener.java | 9 + .../loginScreens/LoginActivity.java | 107 ++++++ .../loginScreens/LoginViewModel.java | 68 ++++ .../loginScreens/SplashActivity.java | 66 ++++ .../selftrucking/helper/Helper.java | 12 + .../selftrucking/helper/Preference.java | 73 ++++ .../selftrucking/models/Container.java | 58 +++ .../models/ContainerWorkflow.java | 4 +- .../selftrucking/models/DriverResponse.java | 10 +- .../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/ic_email.xml | 5 + .../res/drawable/ic_launcher_background.xml | 170 +++++++++ .../res/drawable/ic_launcher_foreground.xml | 30 ++ app/src/main/res/drawable/ic_password.xml | 5 + app/src/main/res/drawable/rounded_border.xml | 8 + .../main/res/drawable/rounded_btn_login.xml | 7 + app/src/main/res/drawable/truck.png | Bin 0 -> 30994 bytes app/src/main/res/drawable/truck_map.png | Bin 0 -> 22959 bytes app/src/main/res/drawable/wave.xml | 9 + .../res/layout/activity_container_detail.xml | 80 ++++ app/src/main/res/layout/activity_home.xml | 73 ++++ app/src/main/res/layout/activity_login.xml | 97 +++++ app/src/main/res/layout/activity_splash.xml | 59 +++ app/src/main/res/layout/activity_tracking.xml | 38 ++ app/src/main/res/layout/item_container.xml | 27 ++ app/src/main/res/layout/list_items.xml | 10 + .../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 | 9 + app/src/main/res/values/themes.xml | 11 + app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../selftrucking/ExampleUnitTest.java | 17 + build.gradle | 4 + gradle.properties | 21 ++ gradle/libs.versions.toml | 29 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 +++++++++ gradlew.bat | 89 +++++ settings.gradle | 23 ++ 143 files changed, 9791 insertions(+), 9 deletions(-) create mode 100644 .gitignore create mode 100644 .idea/.gitignore 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 .idea/vcs.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/selftrucking/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/ContainerDetailActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeViewModel.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/TrackingActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/adapters/ContainerAdapter.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiService.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiServiceFactory.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveApiService.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveClient.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/RetrofitClient.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/interfaces/SelectListener.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginViewModel.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/SplashActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/helper/Helper.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/helper/Preference.java create mode 100644 app/src/main/java/com/utopiaindustries/selftrucking/models/Container.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/ic_email.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/ic_password.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/truck.png create mode 100644 app/src/main/res/drawable/truck_map.png create mode 100644 app/src/main/res/drawable/wave.xml create mode 100644 app/src/main/res/layout/activity_container_detail.xml create mode 100644 app/src/main/res/layout/activity_home.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_splash.xml create mode 100644 app/src/main/res/layout/activity_tracking.xml create mode 100644 app/src/main/res/layout/item_container.xml create mode 100644 app/src/main/res/layout/list_items.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/test/java/com/utopiaindustries/selftrucking/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/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..8d94c58 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ 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/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ 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..1d484fd --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,44 @@ +plugins { + alias(libs.plugins.android.application) +} + +android { + namespace 'com.utopiaindustries.selftrucking' + compileSdk 34 + + defaultConfig { + applicationId "com.utopiaindustries.selftrucking" + 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 + implementation libs.recyclerview + implementation libs.play.services.maps + implementation libs.retrofit + implementation libs.converter.gson + testImplementation libs.junit + androidTestImplementation libs.ext.junit + androidTestImplementation libs.espresso.core +} \ 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/selftrucking/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/utopiaindustries/selftrucking/ExampleInstrumentedTest.java new file mode 100644 index 0000000..f950df8 --- /dev/null +++ b/app/src/androidTest/java/com/utopiaindustries/selftrucking/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.selftrucking; + +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.selftrucking", 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..0ffea9a --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/ContainerDetailActivity.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/ContainerDetailActivity.java new file mode 100644 index 0000000..5c5f1e9 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/ContainerDetailActivity.java @@ -0,0 +1,54 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +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.selftrucking.R; + +public class ContainerDetailActivity extends AppCompatActivity { + + TextView containerDetailId, containerDestination, driverId, driverName; + Button btnMarkPicked; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_container_detail); + 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; + }); + + initializeLayout(); + + btnMarkPicked.setOnClickListener(v -> { + Toast.makeText(this, "Container marked as picked", Toast.LENGTH_SHORT).show(); + + Intent intent = new Intent(ContainerDetailActivity.this, TrackingActivity.class); + //intent.putExtra("container_id", container.getContainerId()); + startActivity(intent); + + }); + } + + public void initializeLayout() { + containerDetailId = findViewById(R.id.container_detail_id); + containerDestination = findViewById(R.id.container_destination); + driverId = findViewById(R.id.driver_Id); + driverName = findViewById(R.id.driver_name); + btnMarkPicked = findViewById(R.id.btn_mark_picked); + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeActivity.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeActivity.java new file mode 100644 index 0000000..c2f9739 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeActivity.java @@ -0,0 +1,153 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens; + +import android.content.Intent; +import android.os.Bundle; +import android.widget.Toast; + +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.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.adapters.ContainerAdapter; +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiService; +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiServiceFactory; +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.MotiveApiService; +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.interfaces.SelectListener; +import com.utopiaindustries.selftrucking.models.Container; +import com.utopiaindustries.selftrucking.R; +import com.utopiaindustries.selftrucking.models.ContainerWorkflow; +import com.utopiaindustries.selftrucking.models.DriverResponse; + +import java.util.ArrayList; +import java.util.List; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class HomeActivity extends AppCompatActivity implements SelectListener { + + //String[] item = {"Material", "Design", "Components", "Android", "5.0 Lollipop"}; + //AutoCompleteTextView autoCompleteTextView; + //ArrayAdapter adapterItems; + HomeViewModel homeViewModel; + RecyclerView containerRecyclerView; + ContainerAdapter adapter; + List containerList = new ArrayList<>(); + ApiService apiService; + MotiveApiService motiveApiService; + DriverResponse driverResponse; + + @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; + }); + + initializeLayout(); + + /*autoCompleteTextView.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); + + } + });*/ + } + + + public void initializeLayout() { + homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class); + containerRecyclerView = findViewById(R.id.container_list); + containerRecyclerView.setLayoutManager(new LinearLayoutManager(this)); + apiService = ApiServiceFactory.getApiService(); + motiveApiService = ApiServiceFactory.getMotiveApiService(); + + + driverResponse = (DriverResponse) getIntent().getSerializableExtra("driverResponse"); + assert driverResponse != null; + containerList.addAll(driverResponse.getContainerWorkflowData()); + + //dummyData(); + + adapter = new ContainerAdapter(containerList, this); + containerRecyclerView.setAdapter(adapter); + + /*autoCompleteTextView = findViewById(R.id.auto_complete_textview); + adapterItems = new ArrayAdapter(this, R.layout.list_items, item); + autoCompleteTextView.setAdapter(adapterItems);*/ + } + + @Override + public void onItemClicked(ContainerWorkflow container) { + Toast.makeText(this, String.valueOf(container.getContainerNo()), Toast.LENGTH_SHORT).show(); + + Intent intent = new Intent(HomeActivity.this, ContainerDetailActivity.class); + intent.putExtra("container_id", container.getContainerNo()); + startActivity(intent); + + + } + + /*public void dummyData() { + Container container1 = new Container("1","Karachi To Lahore","Assigned","11","abc"); + Container container2 = new Container("2","Lahore To Lahore","Assigned","11","abc"); + Container container3 = new Container("3","Islamabad To Lahore","Assigned","11","abc"); + Container container4 = new Container("4","Peshawar To Lahore","Assigned","11","abc"); + Container container5 = new Container("5","Multan To Lahore","Assigned","11","abc"); + Container container6 = new Container("6","Faisalabad To Lahore","Assigned","11","abc"); + Container container7 = new Container("7","Quetta To Lahore","Assigned","11","abc"); + + containerList.add(container1); + containerList.add(container2); + containerList.add(container3); + containerList.add(container4); + containerList.add(container5); + containerList.add(container6); + containerList.add(container7); + }*/ + + private void fetchAssignedContainers() { + apiService.fetchAllReports("").enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if( response.isSuccessful() && response.body() != null ){ + + } + else { + + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + System.out.println( t.getMessage() ); + } + }); + } + + private void fetchTruckLocation() { + motiveApiService.getDriverLocation("").enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + + } + + @Override + public void onFailure(Call> call, Throwable t) { + + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeViewModel.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeViewModel.java new file mode 100644 index 0000000..0bf137b --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/HomeViewModel.java @@ -0,0 +1,8 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens; + +import androidx.lifecycle.ViewModel; + +public class HomeViewModel extends ViewModel { + + +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/TrackingActivity.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/TrackingActivity.java new file mode 100644 index 0000000..8980f42 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/TrackingActivity.java @@ -0,0 +1,59 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.OnMapReadyCallback; +import com.google.android.gms.maps.SupportMapFragment; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.MarkerOptions; +import com.utopiaindustries.selftrucking.R; + +public class TrackingActivity extends AppCompatActivity implements OnMapReadyCallback { + + GoogleMap myMap; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_tracking); + 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; + }); + + initializeLayout(); + + } + + public void initializeLayout() { + SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); + mapFragment.getMapAsync(TrackingActivity.this); + } + + @Override + public void onMapReady(@NonNull GoogleMap googleMap) { + + myMap = googleMap; + + LatLng sydney = new LatLng(-34, 151); + Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.truck_map); + Bitmap resizedIcon = Bitmap.createScaledBitmap(icon, 150, 150, false); + myMap.addMarker(new MarkerOptions().position(sydney).title("Sydney").icon(BitmapDescriptorFactory.fromBitmap(resizedIcon))); + myMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/adapters/ContainerAdapter.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/adapters/ContainerAdapter.java new file mode 100644 index 0000000..67a1c84 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/adapters/ContainerAdapter.java @@ -0,0 +1,61 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.adapters; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.interfaces.SelectListener; +import com.utopiaindustries.selftrucking.models.Container; +import com.utopiaindustries.selftrucking.R; +import com.utopiaindustries.selftrucking.models.ContainerWorkflow; + +import java.util.List; + +public class ContainerAdapter extends RecyclerView.Adapter { + + private List containerList; + private SelectListener listener; + + public ContainerAdapter(List containerList, SelectListener listener) { + this.containerList = containerList; + this.listener = listener; + } + + @NonNull + @Override + public ContainerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_container, parent, false); + return new ContainerViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ContainerViewHolder holder, int position) { + ContainerWorkflow container = containerList.get(position); + holder.containerId.setText(container.getContainerNo()); + holder.destination.setText(container.getDestination()); + holder.itemView.setOnClickListener(v -> listener.onItemClicked(container)); + } + + @Override + public int getItemCount() { + return containerList.size(); + } + + public interface OnContainerClickListener { + void onContainerClick(Container container); + } + + public static class ContainerViewHolder extends RecyclerView.ViewHolder { + TextView containerId, destination; + + public ContainerViewHolder(@NonNull View itemView) { + super(itemView); + containerId = itemView.findViewById(R.id.container_id); + destination = itemView.findViewById(R.id.container_destination); + } + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiService.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiService.java new file mode 100644 index 0000000..cf49e8a --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiService.java @@ -0,0 +1,35 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice; + +import com.utopiaindustries.selftrucking.models.Container; +import com.utopiaindustries.selftrucking.models.DriverResponse; + +import java.util.List; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Path; +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/authentication/authenticate-user") + Call isUserAuthenticated( + @Query("username") String username, + @Query("password") String password, + @Query("roles") String[] roles + ); + * */ +} + + diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiServiceFactory.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiServiceFactory.java new file mode 100644 index 0000000..4d2d710 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/ApiServiceFactory.java @@ -0,0 +1,25 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice; + +import retrofit2.Retrofit; + +public class ApiServiceFactory { + + private static ApiService apiService; + private static MotiveApiService motiveApiService; + + public synchronized static ApiService getApiService() { + if ( apiService == null ) { + Retrofit retrofit = RetrofitClient.getClient(); + apiService = retrofit.create( ApiService.class ); + } + return apiService; + } + + public synchronized static MotiveApiService getMotiveApiService() { + if ( motiveApiService == null ) { + Retrofit retrofit = MotiveClient.getClient(); + motiveApiService = retrofit.create( MotiveApiService.class ); + } + return motiveApiService; + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveApiService.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveApiService.java new file mode 100644 index 0000000..eda1fc2 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveApiService.java @@ -0,0 +1,14 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice; + +import com.utopiaindustries.selftrucking.models.Container; + +import java.util.List; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Path; + +public interface MotiveApiService { + @GET("api/v1/drivers/{driverId}/location") + Call> getDriverLocation(@Path("driverId") String driverId); +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveClient.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveClient.java new file mode 100644 index 0000000..4ebba92 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/MotiveClient.java @@ -0,0 +1,34 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class MotiveClient { + + private final static String BASE_URL = "https://api.gomotive.com/"; + + private static Retrofit retrofit; + + public synchronized static Retrofit getClient() { + + Gson gson = new GsonBuilder() + //.registerTypeAdapter(Boolean.class, new BooleanTypeAdapter()) + .create(); + + if (retrofit == null) { + try { + retrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + //.client( SSLCheckHttpClient.getOkHttpClient() ) + .addConverterFactory(GsonConverterFactory.create(gson)) + .build(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return retrofit; + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/RetrofitClient.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/RetrofitClient.java new file mode 100644 index 0000000..938a136 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/apiservice/RetrofitClient.java @@ -0,0 +1,34 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class RetrofitClient { + + private final static String BASE_URL = "http://192.168.90.228:8080/cosmos/";//"http://192.168.90.27:8080/uind/"; + + private static Retrofit retrofit; + + public synchronized static Retrofit getClient() { + + Gson gson = new GsonBuilder() + //.registerTypeAdapter(Boolean.class, new BooleanTypeAdapter()) + .create(); + + if (retrofit == null) { + try { + retrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + //.client( SSLCheckHttpClient.getOkHttpClient() ) + .addConverterFactory(GsonConverterFactory.create(gson)) + .build(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return retrofit; + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/interfaces/SelectListener.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/interfaces/SelectListener.java new file mode 100644 index 0000000..c941cc6 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/dashboardScreens/interfaces/SelectListener.java @@ -0,0 +1,9 @@ +package com.utopiaindustries.selftrucking.Activities.dashboardScreens.interfaces; + +import com.utopiaindustries.selftrucking.models.Container; +import com.utopiaindustries.selftrucking.models.ContainerWorkflow; + +public interface SelectListener { + + void onItemClicked(ContainerWorkflow container); +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginActivity.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginActivity.java new file mode 100644 index 0000000..2b8d470 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginActivity.java @@ -0,0 +1,107 @@ +package com.utopiaindustries.selftrucking.Activities.loginScreens; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +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.lifecycle.ViewModelProvider; + +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.HomeActivity; +import com.utopiaindustries.selftrucking.R; +import com.utopiaindustries.selftrucking.helper.Helper; +import com.utopiaindustries.selftrucking.helper.Preference; + +public class LoginActivity extends AppCompatActivity { + + EditText tfEmail, tfPassword; + Button btnLogin; + LoginViewModel loginViewModel; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_login); + 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; + }); + + initializeLayouts(); + + btnLogin.setOnClickListener(v -> { + if (isValidate()) { + loginViewModel.authenticateUser(tfEmail.getText().toString(), tfPassword.getText().toString()); + } + }); + + // Observe the user LiveData for a successful login + loginViewModel.getUser().observe(this, user -> { + if (user != null) { + // Handle successful login (e.g., navigate to another activity) + Preference.setMyBooleanPref(Helper.project_file, "isLoggedIn", getApplicationContext(), true); + Log.e("User-Details: ",""+user.toString()); + Toast.makeText(this, "Welcome " + user.getTruckerName(), Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(this, HomeActivity.class); + intent.putExtra("driverResponse", user.toString()); + startActivity(intent); + } + }); + + // Observe the error LiveData for failed login + loginViewModel.getError().observe(this, error -> { + if (error != null) { + Toast.makeText(this, error, Toast.LENGTH_SHORT).show(); + } + }); + } + + private void initializeLayouts() { + tfEmail = findViewById(R.id.tf_email); + tfPassword = findViewById(R.id.tf_password); + btnLogin = findViewById(R.id.btn_login); + + tfEmail.setText("muhammad.mujtaba"); + tfPassword.setText("Utopia01"); + + loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class); + + } + + public boolean isValidate() { + boolean returnValue = true; + String message = ""; + + if (tfPassword.getText().toString().isEmpty()) { + message = "Please enter password."; + returnValue = false; + } + + /*if (!Helper.isValidEmail(tfEmail.getText().toString())) { + message = "Please enter valid email."; + returnValue = false; + }*/ + + if (tfEmail.getText().toString().isEmpty()) { + message = "Please enter email."; + returnValue = false; + } + + if (!returnValue) { + Toast.makeText(this,message,Toast.LENGTH_SHORT).show(); + + } + + return returnValue; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginViewModel.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginViewModel.java new file mode 100644 index 0000000..b13da0b --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/LoginViewModel.java @@ -0,0 +1,68 @@ +package com.utopiaindustries.selftrucking.Activities.loginScreens; + +import android.text.TextUtils; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiService; +import com.utopiaindustries.selftrucking.Activities.dashboardScreens.apiservice.ApiServiceFactory; +import com.utopiaindustries.selftrucking.helper.Helper; +import com.utopiaindustries.selftrucking.models.Container; +import com.utopiaindustries.selftrucking.models.DriverResponse; + +import java.util.List; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class LoginViewModel extends ViewModel { + + private final MutableLiveData userLiveData = new MutableLiveData<>(); + private final MutableLiveData errorLiveData = new MutableLiveData<>(); + + // private MutableLiveData driverResponse; + private ApiService apiService; + + public LoginViewModel() { + //driverResponse = new MutableLiveData<>(); + apiService = ApiServiceFactory.getApiService(); + } + + public void authenticateUser(String user, String password) { + + apiService.isUserAuthenticated(user, password).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + userLiveData.setValue(response.body()); + } else { + errorLiveData.setValue(response.message()); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + errorLiveData.setValue(t.getMessage()); + } + }); + } + + public LiveData getUser() { + return userLiveData; + } + + public LiveData getError() { + return errorLiveData; + } + + /*public LiveData getIsValid() { + return isValid; + }*/ + + /*public LiveData getErrorMessage() { + return errorMessage; + }*/ +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/SplashActivity.java b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/SplashActivity.java new file mode 100644 index 0000000..7332b63 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/Activities/loginScreens/SplashActivity.java @@ -0,0 +1,66 @@ +package com.utopiaindustries.selftrucking.Activities.loginScreens; + +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.view.View; +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.selftrucking.Activities.dashboardScreens.HomeActivity; +import com.utopiaindustries.selftrucking.R; + +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; + }); + + setTheme(R.style.Base_Theme_SelfTruckingApp); + setContentView(R.layout.activity_splash); + + //hideStatusBar(); + txtVersion = findViewById(R.id.txt_version); + txtVersion.setText(getResources().getString(R.string.app_version)); + + //Preference.setMyStringPref(Helper.project_file,"IsRating",this,"False"); + + //isLoggedIn = Preference.getMyBooleanPref(Helper.project_file,"isLoggedIn",getApplicationContext()); + + new Handler().postDelayed(new Runnable() { + public void run() { + + if (isLoggedIn) { + Intent myIntent = new Intent(SplashActivity.this, HomeActivity.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/selftrucking/helper/Helper.java b/app/src/main/java/com/utopiaindustries/selftrucking/helper/Helper.java new file mode 100644 index 0000000..e2b7155 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/helper/Helper.java @@ -0,0 +1,12 @@ +package com.utopiaindustries.selftrucking.helper; + +import android.text.TextUtils; + +public class Helper { + + public static final String project_file = "Self-Trucking"; + + public static boolean isValidEmail(CharSequence target) { + return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches(); + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/helper/Preference.java b/app/src/main/java/com/utopiaindustries/selftrucking/helper/Preference.java new file mode 100644 index 0000000..9514c3e --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/helper/Preference.java @@ -0,0 +1,73 @@ +package com.utopiaindustries.selftrucking.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 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/selftrucking/models/Container.java b/app/src/main/java/com/utopiaindustries/selftrucking/models/Container.java new file mode 100644 index 0000000..d0ba170 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/selftrucking/models/Container.java @@ -0,0 +1,58 @@ +package com.utopiaindustries.selftrucking.models; + +public class Container { + + private String containerId; + private String destination; + private String status; // e.g., "Assigned", "Picked Up", "In Transit", "Delivered", "Returned" + private String assignedDriverId; + private String returnTicketUrl; + + public Container(String containerId, String destination, String status, String assignedDriverId, String returnTicketUrl) { + this.containerId = containerId; + this.destination = destination; + this.status = status; + this.assignedDriverId = assignedDriverId; + this.returnTicketUrl = returnTicketUrl; + } + + public String getContainerId() { + return containerId; + } + + public void setContainerId(String containerId) { + this.containerId = containerId; + } + + public String getDestination() { + return destination; + } + + public void setDestination(String destination) { + this.destination = destination; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getAssignedDriverId() { + return assignedDriverId; + } + + public void setAssignedDriverId(String assignedDriverId) { + this.assignedDriverId = assignedDriverId; + } + + public String getReturnTicketUrl() { + return returnTicketUrl; + } + + public void setReturnTicketUrl(String returnTicketUrl) { + this.returnTicketUrl = returnTicketUrl; + } +} diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/models/ContainerWorkflow.java b/app/src/main/java/com/utopiaindustries/selftrucking/models/ContainerWorkflow.java index 76f87c9..1aa5608 100644 --- a/app/src/main/java/com/utopiaindustries/selftrucking/models/ContainerWorkflow.java +++ b/app/src/main/java/com/utopiaindustries/selftrucking/models/ContainerWorkflow.java @@ -1,12 +1,10 @@ package com.utopiaindustries.selftrucking.models; -import javax.annotation.Generated; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; -@Generated("jsonschema2pojo") -public class ContainerWorkflowDatum { +public class ContainerWorkflow { @SerializedName("containerNo") @Expose diff --git a/app/src/main/java/com/utopiaindustries/selftrucking/models/DriverResponse.java b/app/src/main/java/com/utopiaindustries/selftrucking/models/DriverResponse.java index 2152219..3397fbf 100644 --- a/app/src/main/java/com/utopiaindustries/selftrucking/models/DriverResponse.java +++ b/app/src/main/java/com/utopiaindustries/selftrucking/models/DriverResponse.java @@ -2,19 +2,17 @@ package com.utopiaindustries.selftrucking.models; import java.util.List; -import javax.annotation.Generated; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; -@Generated("jsonschema2pojo") -public class Example { +public class DriverResponse { @SerializedName("truckerName") @Expose private String truckerName; @SerializedName("containerWorkflowData") @Expose - private List containerWorkflowData; + private List containerWorkflowData; @SerializedName("message") @Expose private String message; @@ -30,11 +28,11 @@ public class Example { this.truckerName = truckerName; } - public List getContainerWorkflowData() { + public List getContainerWorkflowData() { return containerWorkflowData; } - public void setContainerWorkflowData(List containerWorkflowData) { + public void setContainerWorkflowData(List containerWorkflowData) { this.containerWorkflowData = containerWorkflowData; } 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/ic_email.xml b/app/src/main/res/drawable/ic_email.xml new file mode 100644 index 0000000..4c104e9 --- /dev/null +++ b/app/src/main/res/drawable/ic_email.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/ic_password.xml b/app/src/main/res/drawable/ic_password.xml new file mode 100644 index 0000000..1813549 --- /dev/null +++ b/app/src/main/res/drawable/ic_password.xml @@ -0,0 +1,5 @@ + + + + + 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..4ca7bc5 --- /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/truck.png b/app/src/main/res/drawable/truck.png new file mode 100644 index 0000000000000000000000000000000000000000..355d932c135c36e927c9e4e485f7b8b0b4502b92 GIT binary patch literal 30994 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/truck_map.png b/app/src/main/res/drawable/truck_map.png new file mode 100644 index 0000000000000000000000000000000000000000..855cb58f778d84c295c1c6d4b57bbc2bdb600b14 GIT binary patch literal 22959 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/wave.xml b/app/src/main/res/drawable/wave.xml new file mode 100644 index 0000000..543d16f --- /dev/null +++ b/app/src/main/res/drawable/wave.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_container_detail.xml b/app/src/main/res/layout/activity_container_detail.xml new file mode 100644 index 0000000..254a280 --- /dev/null +++ b/app/src/main/res/layout/activity_container_detail.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + +