Circleci project setup (#7)

This commit is contained in:
2023-02-27 22:33:09 +00:00
committed by GitHub
parent 565c5fe90b
commit 24461b9444
206 changed files with 3145 additions and 4460 deletions

58
.circleci/config.yml Normal file
View File

@@ -0,0 +1,58 @@
# Use the latest 2.1 version of CircleCI pipeline process engine.
# See: https://circleci.com/docs/2.0/configuration-reference
# For a detailed guide to building and testing on Android, read the docs:
# https://circleci.com/docs/2.0/language-android/ for more details.
version: 2.1
# Orbs are reusable packages of CircleCI configuration that you may share across projects, enabling you to create encapsulated, parameterized commands, jobs, and executors that can be used across multiple projects.
# See: https://circleci.com/docs/2.0/orb-intro/
orbs:
android: circleci/android@1.0.3
# Define a job to be invoked later in a workflow.
# See: https://circleci.com/docs/2.0/configuration-reference/#jobs
jobs:
# Below is the definition of your job to build and test your app, you can rename and customize it as you want.
build-and-test:
# These next lines define the Android machine image executor.
# See: https://circleci.com/docs/2.0/executor-types/
executor:
name: android/android-machine
# Add steps to the job
# See: https://circleci.com/docs/2.0/configuration-reference/#steps
steps:
# Checkout the code as the first step.
- checkout
# Setup files for build.
- run:
name: Setup variables for build
command: |
echo "$GOOGLE_SERVICES_KEY" > "app/google-services.json"
# echo "$RELEASE_KEYSTORE_BASE64" | base64 --decode > "android/app/release_keystore.jks"
- run:
name: Grant execute permission for gradlew
command: |
chmod +x gradlew
# The next step will run the unit tests
- android/run-tests:
test-command: ./gradlew testDriverDebugUnitTest --continue
# Then start the emulator and run the Instrumentation tests!
# - android/start-emulator-and-run-tests:
# test-command: ./gradlew connectedDebugAndroidTest
# system-image: system-images;android-25;google_apis;x86
# And finally run the release build
# - run:
# name: Assemble release build
# command: |
# ./gradlew assembleDriverRelease
# Invoke jobs via workflows
# See: https://circleci.com/docs/2.0/configuration-reference/#workflows
workflows:
sample: # This is the name of the workflow, feel free to change it to better match your workflow.
# Inside the workflow, you define the jobs you want to run.
jobs:
- build-and-test

2
.gitignore vendored
View File

@@ -7,6 +7,8 @@
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/misc.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures

View File

@@ -1,22 +1,6 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JetCodeStyleSettings>
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value>
<package name="java.util" alias="false" withSubpackages="false" />
<package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
<package name="io.ktor" alias="false" withSubpackages="true" />
</value>
</option>
<option name="PACKAGES_IMPORT_LAYOUT">
<value>
<package name="" alias="false" withSubpackages="true" />
<package name="java" alias="false" withSubpackages="true" />
<package name="javax" alias="false" withSubpackages="true" />
<package name="kotlin" alias="false" withSubpackages="true" />
<package name="" alias="true" withSubpackages="true" />
</value>
</option>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">

6
.idea/compiler.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>

7
.idea/dictionaries/h_mal.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<component name="ProjectDictionaryState">
<dictionary name="h_mal">
<words>
<w>viewmodel</w>
</words>
</dictionary>
</component>

4
.idea/gradle.xml generated
View File

@@ -4,16 +4,16 @@
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="PLATFORM" />
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="Android Studio java home" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="IllegalIdentifier" enabled="false" level="ERROR" enabled_by_default="false" />
</profile>
</component>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
</set>
</option>
</component>
</project>

View File

@@ -13,61 +13,99 @@ repositories {
mavenCentral()
}
def relStorePassword = System.getenv("RELEASE_STORE_PASSWORD")
def relKeyPassword = System.getenv("RELEASE_KEY_PASSWORD")
def relKeyAlias = System.getenv("RELEASE_KEY_ALIAS")
def relStoreFile = System.getenv("RELEASE_KEYSTORE")
android {
compileSdkVersion 28
compileSdkVersion 31
defaultConfig {
applicationId "h_mal.appttude.com.driver"
applicationId "h_mal.appttude.com"
minSdkVersion 24
targetSdkVersion 28
targetSdkVersion 31
versionCode 6
versionName "1.6"
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
}
signingConfigs {
release {
storePassword relStorePassword
keyPassword relKeyPassword
keyAlias relKeyAlias
// storeFile file(relStoreFile)
}
}
buildTypes {
release {
minifyEnabled false
// signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
flavorDimensions "Default"
productFlavors {
driver {
applicationIdSuffix ".driver"
versionCode 6
versionName "1.0.5"
}
admin {
applicationIdSuffix ".driverAdmin"
versionCode 4
versionName "0.0.5"
}
}
sourceSets {
driver {
manifest {
srcFile 'src/driver/AndroidManifest.xml'
}
}
admin {
manifest {
srcFile 'src/driver_admin/AndroidManifest.xml'
}
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "androidx.appcompat:appcompat:1.0.0"
implementation "com.google.android.material:material:1.0.0"
implementation "androidx.appcompat:appcompat:1.4.2"
implementation "com.google.android.material:material:1.6.0"
implementation "androidx.cardview:cardview:1.0.0"
implementation "androidx.legacy:legacy-support-v4:1.0.0"
implementation "androidx.exifinterface:exifinterface:1.0.0"
implementation "androidx.constraintlayout:constraintlayout:1.1.3"
implementation "androidx.fragment:fragment-ktx:1.2.5"
implementation "androidx.activity:activity-ktx:1.2.0"
implementation "androidx.recyclerview:recyclerview:1.1.0"
implementation "androidx.navigation:navigation-fragment-ktx:2.3.3"
implementation "androidx.navigation:navigation-ui-ktx:2.3.3"
implementation "androidx.exifinterface:exifinterface:1.3.6"
implementation "androidx.constraintlayout:constraintlayout:2.1.4"
implementation "androidx.fragment:fragment-ktx:1.4.0"
implementation "androidx.activity:activity-ktx:1.4.0"
implementation "androidx.recyclerview:recyclerview:1.2.1"
implementation "androidx.navigation:navigation-fragment-ktx:2.5.3"
implementation "androidx.navigation:navigation-ui-ktx:2.5.3"
implementation "androidx.drawerlayout:drawerlayout:1.1.1"
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
implementation 'androidx.viewpager:viewpager:1.0.0'
testImplementation "junit:junit:4.12"
androidTestImplementation "androidx.test.ext:junit:1.1.1"
androidTestImplementation "androidx.test.espresso:espresso-core:3.1.0"
androidTestImplementation "androidx.test:rules:1.1.1"
testImplementation "junit:junit:4.13.2"
androidTestImplementation "androidx.test.ext:junit:1.1.5"
androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1"
androidTestImplementation "androidx.test:rules:1.5.0"
implementation 'androidx.test.espresso:espresso-idling-resource:3.5.1'
implementation "androidx.legacy:legacy-support-v4:1.0.0"
// Google play services
implementation "com.google.android.gms:play-services-auth:15.0.1"
implementation "com.google.android.gms:play-services-auth:20.4.1"
// Google firebase
def firebaseVer = "16.0.1"
def firebaseVer = "20.1.0"
implementation "com.google.firebase:firebase-core:$firebaseVer"
implementation "com.google.firebase:firebase-auth:$firebaseVer"
implementation "com.google.firebase:firebase-auth:21.0.0"
implementation "com.google.firebase:firebase-storage:$firebaseVer"
implementation "com.google.firebase:firebase-database:$firebaseVer"
// Photoviewer
@@ -75,9 +113,9 @@ dependencies {
/* Picasso photo loader */
implementation "com.squareup.picasso:picasso:2.71828"
/* Gson */
implementation "com.google.code.gson:gson:2.3.1"
implementation "com.google.code.gson:gson:2.8.9"
/* coroutines support for firebase operations */
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.1.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.1"
// Circle Image View
implementation "com.mikhaellopez:circularimageview:4.2.0"
@@ -89,4 +127,8 @@ dependencies {
/* Image Carousal */
implementation 'com.synnapps:carouselview:0.1.5'
/ * Glide */
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
}

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.Objects
package h_mal.appttude.com.objects

View File

@@ -1,9 +1,6 @@
package h_mal.appttude.com.driver.Objects
package h_mal.appttude.com.objects
import h_mal.appttude.com.driver.model.DriversLicenseObject
import h_mal.appttude.com.driver.model.MotObject
import h_mal.appttude.com.driver.model.PrivateHireObject
import h_mal.appttude.com.driver.model.VehicleProfileObject
import h_mal.appttude.com.model.*
import java.util.*
class ArchiveObject {

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.Objects
package h_mal.appttude.com.objects

View File

@@ -1,7 +1,7 @@
package h_mal.appttude.com.driver.Objects
package h_mal.appttude.com.objects
import h_mal.appttude.com.driver.Objects.WholeObject.DriverProfile
import h_mal.appttude.com.driver.Objects.WholeObject.VehicleProfile
import h_mal.appttude.com.objects.wholeObject.DriverProfile
import h_mal.appttude.com.objects.wholeObject.VehicleProfile
class WholeDriverObject {

View File

@@ -1,8 +1,8 @@
package h_mal.appttude.com.driver.Objects.WholeObject
package h_mal.appttude.com.objects.wholeObject
import h_mal.appttude.com.driver.model.DriverProfileObject
import h_mal.appttude.com.driver.model.DriversLicenseObject
import h_mal.appttude.com.driver.model.PrivateHireObject
import h_mal.appttude.com.model.DriverProfileObject
import h_mal.appttude.com.model.DriversLicenseObject
import h_mal.appttude.com.model.PrivateHireObject
class DriverProfile {

View File

@@ -1,8 +1,8 @@
package h_mal.appttude.com.driver.Objects.WholeObject
package h_mal.appttude.com.objects.wholeObject
import android.os.Parcel
import android.os.Parcelable
import h_mal.appttude.com.driver.Objects.WholeDriverObject
import h_mal.appttude.com.objects.WholeDriverObject
class MappedObject : Parcelable {
@@ -28,6 +28,7 @@ class MappedObject : Parcelable {
}
companion object {
@JvmField
val CREATOR: Parcelable.Creator<MappedObject?> = object : Parcelable.Creator<MappedObject?> {
override fun createFromParcel(`in`: Parcel): MappedObject? {
return MappedObject(`in`)

View File

@@ -1,10 +1,10 @@
package h_mal.appttude.com.driver.Objects.WholeObject
package h_mal.appttude.com.objects.wholeObject
import h_mal.appttude.com.driver.Objects.InsuranceObject
import h_mal.appttude.com.driver.Objects.LogbookObject
import h_mal.appttude.com.driver.Objects.PrivateHireVehicleObject
import h_mal.appttude.com.driver.model.MotObject
import h_mal.appttude.com.driver.model.VehicleProfileObject
import h_mal.appttude.com.model.InsuranceObject
import h_mal.appttude.com.model.LogbookObject
import h_mal.appttude.com.model.PrivateHireVehicleObject
import h_mal.appttude.com.model.MotObject
import h_mal.appttude.com.model.VehicleProfileObject
class VehicleProfile {

View File

@@ -1,37 +1,20 @@
package h_mal.appttude.com.driver.SuperUser
package h_mal.appttude.com.ui
import android.app.Activity
import android.content.Context
import android.util.DisplayMetrics
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import androidx.fragment.app.Fragment
import h_mal.appttude.com.driver.Global.FirebaseClass
import h_mal.appttude.com.driver.Global.SetApprovalDialog
import h_mal.appttude.com.driver.ui.driver.MainActivity
import h_mal.appttude.com.driver.Objects.ArchiveObject
import h_mal.appttude.com.driver.Objects.WholeObject.MappedObject
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.ui.driver.vehicleprofile.InsuranceFragment
import h_mal.appttude.com.driver.ui.driver.driverprofile.DriverLicenseFragment
import h_mal.appttude.com.driver.ui.driver.driverprofile.DriverProfileFragment
import h_mal.appttude.com.driver.ui.driver.driverprofile.PrivateHireLicenseFragment
import h_mal.appttude.com.driver.ui.driver.vehicleprofile.LogbookFragment
import h_mal.appttude.com.driver.ui.driver.vehicleprofile.MotFragment
import h_mal.appttude.com.driver.ui.driver.vehicleprofile.PrivateHireVehicleFragment
import h_mal.appttude.com.driver.ui.driver.vehicleprofile.VehicleProfileFragment
import h_mal.appttude.com.objects.wholeObject.MappedObject
import h_mal.appttude.com.R
class ApprovalListAdapter(
val activity: Activity,
objects: Array<MappedObject>
private val activity: Activity,
objects: Array<MappedObject?>
): ArrayAdapter<MappedObject?>(activity, 0, objects) {
var mappedObject: MappedObject = objects[0]
var mappedObject: MappedObject? = objects[0]
var names: Array<String> = arrayOf(
"Driver Profile",

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.SuperUser
package h_mal.appttude.com.ui
import android.app.AlertDialog
import android.content.Context

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.SuperUser
package h_mal.appttude.com.ui
import android.app.AlertDialog
import android.content.DialogInterface
@@ -12,16 +12,15 @@ import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.ValueEventListener
import h_mal.appttude.com.driver.ui.driver.MainActivity
import h_mal.appttude.com.driver.Objects.WholeDriverObject
import h_mal.appttude.com.driver.Objects.WholeObject.MappedObject
import h_mal.appttude.com.driver.R
import kotlinx.android.synthetic.main.fragment_home_super_user.*
import h_mal.appttude.com.objects.WholeDriverObject
import h_mal.appttude.com.objects.wholeObject.MappedObject
import h_mal.appttude.com.R
import kotlinx.android.synthetic.admin.fragment_home_super_user.*
import java.io.IOException
import java.util.*
class homeSuperUserFragment : Fragment() {
class HomeSuperUserFragment : Fragment() {
var users: DatabaseReference? = null
var mappedObjectList: MutableList<MappedObject>? = null
private var sharedPreferences: SharedPreferences? = null

View File

@@ -1,12 +1,9 @@
package h_mal.appttude.com.driver.ui.driver
package h_mal.appttude.com.ui
import android.Manifest
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.widget.ImageView
import androidx.core.view.GravityCompat
import androidx.navigation.NavController
import androidx.navigation.findNavController
@@ -16,18 +13,11 @@ import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
import com.google.android.material.navigation.NavigationView
import com.google.firebase.auth.FirebaseUser
import com.squareup.picasso.Picasso.LoadedFrom
import com.squareup.picasso.Target
import h_mal.appttude.com.driver.Global.ApprovalsClass
import h_mal.appttude.com.driver.Global.ArchiveClass
import h_mal.appttude.com.driver.Global.ImageViewClass
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.BaseActivity
import h_mal.appttude.com.driver.dialogs.ExitDialog.displayExitDialog
import h_mal.appttude.com.driver.ui.user.LoginActivity
import h_mal.appttude.com.driver.utils.ActivityIntentBuilder.createIntent
import h_mal.appttude.com.driver.utils.setPicassoImage
import h_mal.appttude.com.driver.viewmodels.MainViewModel
import h_mal.appttude.com.R
import h_mal.appttude.com.base.BaseActivity
import h_mal.appttude.com.dialogs.ExitDialog.displayExitDialog
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.MainViewModel
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.nav_header_main.view.*
@@ -47,6 +37,7 @@ class MainActivity : BaseActivity<MainViewModel>(),
super.onCreate(savedInstanceState)
setSupportActionBar(toolbar)
supportActionBar?.setDisplayShowTitleEnabled(false)
navController = findNavController(R.id.container)
appBarConfiguration = AppBarConfiguration(navController.graph, drawer_layout)
@@ -70,7 +61,7 @@ class MainActivity : BaseActivity<MainViewModel>(),
drawer_layout.closeDrawer(GravityCompat.START)
} else {
val navHostFragment = supportFragmentManager.findFragmentById(R.id.container)
navHostFragment?.childFragmentManager?.backStackEntryCount?.takeIf { it > 1 }?.let {
navHostFragment?.childFragmentManager?.backStackEntryCount?.takeIf { it >= 1 }?.let {
return super.onBackPressed()
}
displayExitDialog()
@@ -90,14 +81,12 @@ class MainActivity : BaseActivity<MainViewModel>(),
val header: View = nav_view.getHeaderView(0)
header.driver_email.text = user.email
header.driver_name.text = user.displayName
header.profileImage.setPicassoImage(user.photoUrl)
header.profileImage.setGlideImage(user.photoUrl)
}
private fun setupLogoutInDrawer(){
logout.setOnClickListener {
getViewModel().logOut()
startActivity(createIntent<LoginActivity>())
finish()
}
}

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.SuperUser
package h_mal.appttude.com.ui
import android.app.AlertDialog
import android.content.Context
@@ -12,10 +12,9 @@ import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.squareup.picasso.Picasso
import h_mal.appttude.com.driver.ui.driver.MainActivity
import h_mal.appttude.com.driver.Objects.UserObject
import h_mal.appttude.com.driver.Objects.WholeObject.MappedObject
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.objects.UserObject
import h_mal.appttude.com.objects.wholeObject.MappedObject
import h_mal.appttude.com.R
class RecyclerViewAdapter constructor(var context: Context?, var objects: List<MappedObject>?) :

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.SuperUser
package h_mal.appttude.com.ui
import android.os.Bundle
import android.util.Log
@@ -7,8 +7,8 @@ import android.view.View
import android.view.ViewGroup
import android.widget.GridView
import androidx.fragment.app.Fragment
import h_mal.appttude.com.driver.Objects.WholeObject.MappedObject
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.objects.wholeObject.MappedObject
import h_mal.appttude.com.R
class UserMainFragment : Fragment() {
@@ -20,8 +20,8 @@ class UserMainFragment : Fragment() {
// Inflate the layout for this fragment
val view: View = inflater.inflate(R.layout.fragment_user_main, container, false)
Log.i("UserMain", "onCreateView: height = " + view.height)
val mappedObject: MappedObject = requireArguments().getParcelable<MappedObject>("mapped")
activity?.title = mappedObject.wholeDriverObject?.user_details?.profileName
val mappedObject: MappedObject? = requireArguments().getParcelable<MappedObject>("mapped")
activity?.title = mappedObject?.wholeDriverObject?.user_details?.profileName
val listView: GridView = view.findViewById(R.id.approvals_list)
listView.adapter = ApprovalListAdapter(requireActivity(), arrayOf(mappedObject))

View File

@@ -83,7 +83,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_archive_black_24dp"
android:tint="@color/colour_three" />
app:tint="@color/colour_three" />
</FrameLayout>
</RelativeLayout>
</androidx.cardview.widget.CardView>

View File

@@ -3,8 +3,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SuperUser.homeSuperUserFragment">
tools:context=".ui.HomeSuperUserFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.UserMainFragment">
<GridView
android:id="@+id/approvals_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="2"
android:rowCount="4"
android:stretchMode="columnWidth"
tools:listitem="@layout/approval_list_grid_item"/>
</RelativeLayout>

View File

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colour_nine">
<com.mikhaellopez.circularimageview.CircularImageView
android:id="@+id/driverPic"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginLeft="24dp"
android:layout_marginTop="24dp"
android:layout_marginBottom="24dp"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
app:civ_border_width="3dp"
app:civ_shadow_radius="1dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/choice_img_round" />
<ImageView
android:id="@+id/approval_iv"
android:layout_width="10dp"
android:layout_height="10dp"
android:layout_marginRight="3dp"
android:layout_marginTop="3dp"
app:layout_constraintTop_toTopOf="@id/driverPic"
app:layout_constraintRight_toRightOf="@id/driverPic"
android:adjustViewBounds="true"
tools:src="@android:drawable/presence_online" />
<TextView
android:id="@+id/driver_no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="24dp"
android:textColor="@android:color/white"
android:textSize="12sp"
android:textStyle="bold"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/driverPic"
tools:text="T22" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="24dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="@id/driverPic"
app:layout_constraintLeft_toRightOf="@id/driverPic"
app:layout_constraintRight_toLeftOf="@id/driver_no"
app:layout_constraintTop_toTopOf="@id/driverPic">
<TextView
android:id="@+id/username_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:textSize="18sp"
android:textStyle="bold"
tools:text="Haider Malik" />
<TextView
android:id="@+id/emailaddress_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:textSize="11sp"
tools:text="h.malik144.au@gmail.com" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,40 @@
package h_mal.appttude.com
import android.content.res.Resources
import androidx.annotation.StringRes
import androidx.test.espresso.Espresso.onData
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.ViewInteraction
import androidx.test.espresso.action.ViewActions
import androidx.test.espresso.assertion.ViewAssertions
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.espresso.matcher.ViewMatchers.withId
import org.hamcrest.CoreMatchers.*
open class BaseTestRobot {
fun fillEditText(resId: Int, text: String): ViewInteraction =
onView(withId(resId)).perform(ViewActions.replaceText(text), ViewActions.closeSoftKeyboard())
fun clickButton(resId: Int): ViewInteraction = onView((withId(resId))).perform(ViewActions.click())
fun textView(resId: Int): ViewInteraction = onView(withId(resId))
fun matchText(viewInteraction: ViewInteraction, text: String): ViewInteraction = viewInteraction
.check(ViewAssertions.matches(ViewMatchers.withText(text)))
fun matchText(resId: Int, text: String): ViewInteraction = matchText(textView(resId), text)
fun clickListItem(listRes: Int, position: Int) {
onData(anything())
.inAdapterView(allOf(withId(listRes)))
.atPosition(position).perform(ViewActions.click())
}
fun checkErrorOnTextEntry(resId: Int, errorMessage: String): ViewInteraction =
onView(withId(resId)).check(matches(checkErrorMessage(errorMessage)))
fun getStringFromResource(@StringRes resId: Int): String = Resources.getSystem().getString(resId)
}

View File

@@ -0,0 +1,38 @@
package h_mal.appttude.com
import androidx.annotation.StringRes
import androidx.appcompat.app.AppCompatActivity
import androidx.test.espresso.IdlingRegistry
import androidx.test.rule.ActivityTestRule
import h_mal.appttude.com.espresso.IdlingResourceClass
import org.junit.AfterClass
import org.junit.BeforeClass
import org.junit.Ignore
import org.junit.Rule
abstract class BaseUiTest<T : AppCompatActivity> {
@Ignore
abstract fun getApplicationClass(): Class<T>
@get:Rule
var mActivityTestRule = ActivityTestRule(getApplicationClass())
companion object {
@BeforeClass
@JvmStatic
fun setUp() {
IdlingRegistry.getInstance().register(IdlingResourceClass.countingIdlingResource)
}
@AfterClass
@JvmStatic
fun tearDown() {
IdlingRegistry.getInstance().unregister(IdlingResourceClass.countingIdlingResource)
}
}
fun getResourceString(@StringRes stringRes: Int): String {
return mActivityTestRule.activity.getString(stringRes)
}
}

View File

@@ -0,0 +1,29 @@
package h_mal.appttude.com
import android.view.View
import android.widget.EditText
import com.google.android.material.textfield.TextInputLayout
import org.hamcrest.Description
import org.hamcrest.Matcher
import org.hamcrest.TypeSafeMatcher
/**
* Matcher for testing error of TextInputLayout
*/
fun checkErrorMessage(expectedErrorText: String): Matcher<View?>? {
return object : TypeSafeMatcher<View?>() {
override fun matchesSafely(view: View?): Boolean {
if (view is EditText) {
return view.error.toString() == expectedErrorText
}
if (view !is TextInputLayout) return false
val error = view.error ?: return false
return expectedErrorText == error.toString()
}
override fun describeTo(d: Description?) {}
}
}

View File

@@ -1,27 +0,0 @@
package h_mal.appttude.com.driver;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("h_mal.appttude.com.driver", appContext.getPackageName());
}
}

View File

@@ -1,54 +0,0 @@
package h_mal.appttude.com.driver;
import android.view.View;
import androidx.test.rule.ActivityTestRule;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import h_mal.appttude.com.driver.ui.driver.HomeFragment;
import h_mal.appttude.com.driver.ui.driver.MainActivity;
import static org.junit.Assert.assertNotNull;
public class MainActivityTest {
@Rule
public ActivityTestRule<MainActivity> activityActivityTestRule = new ActivityTestRule<MainActivity>(MainActivity.class);
private MainActivity mainActivity = null;
private HomeFragment hdf;
@Before
public void setUp() throws Exception {
mainActivity = activityActivityTestRule.getActivity();
hdf = new HomeFragment();
mainActivity.getSupportFragmentManager().beginTransaction().replace(R.id.container, hdf).commit();
}
@Test
public void testViews(){
View view = hdf.getView().findViewById(R.id.driver);
assertNotNull(view);
// Bundle bundle = new Bundle();
// bundle.putInt("selectedListItem", 0);
// FragmentFactory factory = new FragmentFactory();
// homeDriverFragment hdf = new homeDriverFragment();
//
// launchInContainer(hdf.getClass(), bundle, factory);
// Espresso.onView(ViewMatchers.withId(2131231038)).check(ViewAssertions.matches(ViewMatchers.withText("Hello World!")));
}
@After
public void TearDown() throws Exception{
mainActivity = null;
}
}

View File

@@ -1,8 +0,0 @@
package h_mal.appttude.com.driver.base
import org.junit.Assert.*
class BaseActivityTest{
}

View File

@@ -1,199 +0,0 @@
package h_mal.appttude.com.driver.user;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import androidx.test.espresso.ViewInteraction;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import h_mal.appttude.com.driver.R;
import h_mal.appttude.com.driver.ui.user.LoginActivity;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.*;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.*;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.is;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class EspressoTestTwo {
@Rule
public ActivityTestRule<LoginActivity> mActivityTestRule = new ActivityTestRule<>(LoginActivity.class);
@Test
public void espressoTestTwo() {
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction appCompatEditText = onView(
allOf(withId(R.id.email),
childAtPosition(
childAtPosition(
withId(R.id.fields_holder),
0),
0),
isDisplayed()));
appCompatEditText.perform(replaceText("h.malik144.au@gmail.com"), closeSoftKeyboard());
ViewInteraction appCompatEditText2 = onView(
allOf(withId(R.id.password),
childAtPosition(
childAtPosition(
withId(R.id.fields_holder),
1),
0),
isDisplayed()));
appCompatEditText2.perform(replaceText("crack167"), closeSoftKeyboard());
ViewInteraction appCompatEditText3 = onView(
allOf(withId(R.id.password), withText("crack167"),
childAtPosition(
childAtPosition(
withId(R.id.fields_holder),
1),
0),
isDisplayed()));
appCompatEditText3.perform(pressImeActionButton());
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction button = onView(
allOf(withId(R.id.driver),
childAtPosition(
childAtPosition(
withId(R.id.container),
0),
0),
isDisplayed()));
button.check(matches(isDisplayed()));
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction appCompatImageButton = onView(
allOf(withContentDescription("Open navigation drawer"),
childAtPosition(
allOf(withId(R.id.toolbar),
childAtPosition(
withClassName(is("android.support.design.widget.AppBarLayout")),
0)),
1),
isDisplayed()));
appCompatImageButton.perform(click());
ViewInteraction cardView = onView(
allOf(withId(R.id.car),
childAtPosition(
childAtPosition(
withId(R.id.container),
1),
1),
isDisplayed()));
cardView.perform(click());
ViewInteraction cardView2 = onView(
allOf(withId(R.id.vehicle_prof),
childAtPosition(
childAtPosition(
withId(R.id.container),
1),
0),
isDisplayed()));
cardView2.perform(click());
pressBack();
ViewInteraction appCompatButton = onView(
allOf(withId(R.id.driver), withText("Driver Profile"),
childAtPosition(
childAtPosition(
withId(R.id.container),
1),
0),
isDisplayed()));
appCompatButton.perform(click());
ViewInteraction cardView3 = onView(
allOf(withId(R.id.driver_prof),
childAtPosition(
childAtPosition(
withId(R.id.container),
1),
0),
isDisplayed()));
cardView3.perform(click());
pressBack();
ViewInteraction cardView4 = onView(
allOf(withId(R.id.private_hire),
childAtPosition(
childAtPosition(
withId(R.id.container),
1),
1),
isDisplayed()));
cardView4.perform(click());
ViewInteraction appCompatButton2 = onView(
allOf(withId(android.R.id.button1), withText("View/Edit"),
childAtPosition(
childAtPosition(
withClassName(is("android.widget.ScrollView")),
0),
3)));
appCompatButton2.perform(scrollTo(), click());
}
private static Matcher<View> childAtPosition(
final Matcher<View> parentMatcher, final int position) {
return new TypeSafeMatcher<View>() {
@Override
public void describeTo(Description description) {
description.appendText("Child at position " + position + " in parent ");
parentMatcher.describeTo(description);
}
@Override
public boolean matchesSafely(View view) {
ViewParent parent = view.getParent();
return parent instanceof ViewGroup && parentMatcher.matches(parent)
&& view.equals(((ViewGroup) parent).getChildAt(position));
}
};
}
}

View File

@@ -1,147 +0,0 @@
package h_mal.appttude.com.driver.user;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import androidx.test.espresso.ViewInteraction;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import h_mal.appttude.com.driver.R;
import h_mal.appttude.com.driver.ui.user.LoginActivity;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.*;
import static androidx.test.espresso.matcher.ViewMatchers.*;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.is;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class LoginActivityTest {
@Rule
public ActivityTestRule<LoginActivity> mActivityTestRule = new ActivityTestRule<>(LoginActivity.class);
@Test
public void loginActivityTest() {
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction appCompatEditText = onView(
allOf(withId(R.id.email),
childAtPosition(
childAtPosition(
withId(R.id.fields_holder),
0),
0),
isDisplayed()));
appCompatEditText.perform(replaceText("h.malik144.au@gmail.com"), closeSoftKeyboard());
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction appCompatEditText2 = onView(
allOf(withId(R.id.password),
childAtPosition(
childAtPosition(
withId(R.id.fields_holder),
1),
0),
isDisplayed()));
appCompatEditText2.perform(replaceText("crack167"), closeSoftKeyboard());
// ViewInteraction appCompatButton = onView(
// allOf(withId(R.id.email_sign_in_button), withText("Sign in"),
// childAtPosition(
// allOf(withId(R.id.email_login_form),
// childAtPosition(
// withClassName(is("android.widget.RelativeLayout")),
// 0)),
// 1),
// isDisplayed()));
// appCompatButton.perform(click());
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// ViewInteraction textView = onView(
// allOf(withText("Choice Minicabs"),
// childAtPosition(
// allOf(withId(R.id.toolbar),
// childAtPosition(
// IsInstanceOf.<View>instanceOf(android.widget.LinearLayout.class),
// 0)),
// 1),
// isDisplayed()));
// textView.check(matches(isDisplayed()));
// Added a sleep statement to match the app's execution delay.
// The recommended way to handle such scenarios is to use Espresso idling resources:
// https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ViewInteraction appCompatButton2 = onView(
allOf(withId(R.id.driver), withText("Driver Profile"),
childAtPosition(
childAtPosition(
withId(R.id.container),
1),
0),
isDisplayed()));
appCompatButton2.perform(click());
}
private static Matcher<View> childAtPosition(
final Matcher<View> parentMatcher, final int position) {
return new TypeSafeMatcher<View>() {
@Override
public void describeTo(Description description) {
description.appendText("Child at position " + position + " in parent ");
parentMatcher.describeTo(description);
}
@Override
public boolean matchesSafely(View view) {
ViewParent parent = view.getParent();
return parent instanceof ViewGroup && parentMatcher.matches(parent)
&& view.equals(((ViewGroup) parent).getChildAt(position));
}
};
}
}

View File

@@ -0,0 +1,17 @@
package h_mal.appttude.com.robots
import h_mal.appttude.com.BaseTestRobot
import h_mal.appttude.com.R
fun home(func: HomeRobot.() -> Unit) = HomeRobot().apply { func() }
class HomeRobot: BaseTestRobot() {
fun checkTitleExists(title: String) = matchText(R.id.prova_title_tv, title)
fun clickLogin() = clickButton(R.id.email_sign_in_button)
fun clickRegister() = clickButton(R.id.register_button)
fun clickForgotPassword() = clickButton(R.id.forgot)
}

View File

@@ -0,0 +1,24 @@
package h_mal.appttude.com.robots
import h_mal.appttude.com.BaseTestRobot
import h_mal.appttude.com.R
fun login(func: LoginRobot.() -> Unit) = LoginRobot().apply { func() }
class LoginRobot: BaseTestRobot() {
fun setEmail(email: String) = fillEditText(R.id.email, email);
fun setPassword(pass: String) = fillEditText(R.id.password, pass)
fun clickLogin() = clickButton(R.id.email_sign_in_button)
fun clickRegister() = clickButton(R.id.register_button)
fun clickForgotPassword() = clickButton(R.id.forgot)
fun checkEmailError(err: String) = checkErrorOnTextEntry(R.id.email, err)
fun checkPasswordError(err: String) = checkErrorOnTextEntry(R.id.password, err)
}

View File

@@ -0,0 +1,27 @@
package h_mal.appttude.com.robots
import h_mal.appttude.com.BaseTestRobot
import h_mal.appttude.com.R
fun register(func: RegisterRobot.() -> Unit) = RegisterRobot().apply { func() }
class RegisterRobot: BaseTestRobot() {
fun setName(name: String) = fillEditText(R.id.name_register, name)
fun setEmail(email: String) = fillEditText(R.id.email_register, email)
fun setPassword(pass: String) = fillEditText(R.id.password_top, pass)
fun setPasswordConfirm(pass: String) = fillEditText(R.id.password_bottom, pass)
fun clickLogin() = clickButton(R.id.email_sign_up)
fun checkNameError(err: String) = checkErrorOnTextEntry(R.id.name_register, err)
fun checkEmailError(err: String) = checkErrorOnTextEntry(R.id.email_register, err)
fun checkPasswordError(err: String) = checkErrorOnTextEntry(R.id.password_top, err)
fun checkPasswordConfirmError(err: String) = checkErrorOnTextEntry(R.id.password_bottom, err)
}

View File

@@ -0,0 +1,42 @@
package h_mal.appttude.com.tests
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import com.google.firebase.auth.FirebaseAuth
import h_mal.appttude.com.BaseUiTest
import h_mal.appttude.com.R
import h_mal.appttude.com.robots.home
import h_mal.appttude.com.ui.user.LoginActivity
import h_mal.appttude.com.robots.login
import h_mal.appttude.com.robots.register
import org.junit.*
import org.junit.runner.RunWith
@LargeTest
@RunWith(AndroidJUnit4::class)
class LoginActivityTest: BaseUiTest<LoginActivity>() {
@Ignore
override fun getApplicationClass() = LoginActivity::class.java
@After
fun afterTest(){
FirebaseAuth.getInstance().signOut()
}
@Test
fun verifyUserLogin_validUsernameAndPassword_loggedIn() {
login {
setEmail("test-user@testuserdriver.com")
setPassword("Password1234")
clickLogin()
}
home {
checkTitleExists(getResourceString(R.string.welcome_title))
}
}
}

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round">
<activity
android:name="h_mal.appttude.com.ui.user.LoginActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar.User"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="h_mal.appttude.com.ui.MainActivity"
android:configChanges="orientation|screenSize"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="h_mal.appttude.com.ui.update.UpdateActivity"
android:theme="@style/AppTheme.NoActionBar.Update" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="h_mal.appttude.com.driver"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>

View File

@@ -1,19 +1,16 @@
package h_mal.appttude.com.driver.ui.driver
package h_mal.appttude.com.ui
import android.os.Bundle
import android.view.View
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.BaseFragment
import h_mal.appttude.com.driver.utils.navigateTo
import h_mal.appttude.com.driver.viewmodels.DriverLicenseViewModel
import androidx.fragment.app.Fragment
import h_mal.appttude.com.R
import h_mal.appttude.com.base.BaseFragment
import h_mal.appttude.com.utils.navigateTo
import h_mal.appttude.com.viewmodels.DriverLicenseViewModel
import kotlinx.android.synthetic.main.fragment_driver_overall.*
class DriverOverallFragment : BaseFragment<DriverLicenseViewModel>() {
private val viewmodel: DriverLicenseViewModel by getFragmentViewModel()
override fun getViewModel(): DriverLicenseViewModel = viewmodel
override fun getLayoutId(): Int = R.layout.fragment_driver_overall
class DriverOverallFragment : Fragment(R.layout.fragment_driver_overall) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

View File

@@ -0,0 +1,61 @@
package h_mal.appttude.com.ui
import android.os.Bundle
import android.view.View
import h_mal.appttude.com.R
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.data.DRIVER
import h_mal.appttude.com.utils.hide
import h_mal.appttude.com.utils.navigateTo
import h_mal.appttude.com.utils.show
import h_mal.appttude.com.viewmodels.RoleViewModel
import kotlinx.android.synthetic.main.driver_profile_request.*
import kotlinx.android.synthetic.main.fragment_home_driver.*
import kotlinx.android.synthetic.main.home_buttons_container.*
import kotlinx.android.synthetic.main.home_buttons_container.driver
class HomeFragment : DataSubmissionBaseFragment<RoleViewModel, String>(R.layout.fragment_home_driver) {
private val viewmodel: RoleViewModel by getFragmentViewModel()
override fun getViewModel(): RoleViewModel = viewmodel
override var model = String()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewmodel.getDataFromDatabase()
}
override fun onSuccess(data: Any?) {
super.onSuccess(data)
if (data == DRIVER){
loadDriver()
return
}
loadNonDriver()
}
private fun loadNonDriver(){
home_buttons_container.hide()
profile_request_container.show()
request_driver_button.setOnClickListener {
viewmodel.setDataInDatabase(DRIVER)
}
}
private fun loadDriver(){
home_buttons_container.show()
profile_request_container.hide()
driver.setOnClickListener {
view?.navigateTo(R.id.to_driverOverallFragment)
}
car.setOnClickListener {
view?.navigateTo(R.id.to_vehicleOverallFragment)
}
}
}

View File

@@ -0,0 +1,101 @@
package h_mal.appttude.com.ui
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import androidx.core.view.GravityCompat
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
import com.google.android.material.navigation.NavigationView
import com.google.firebase.auth.FirebaseUser
import h_mal.appttude.com.R
import h_mal.appttude.com.base.BaseActivity
import h_mal.appttude.com.dialogs.ExitDialog.displayExitDialog
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.MainViewModel
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.nav_header_main.view.*
class MainActivity : BaseActivity<MainViewModel>(),
NavigationView.OnNavigationItemSelectedListener {
private val vm by createLazyViewModel<MainViewModel>()
override fun getViewModel(): MainViewModel = vm
override val layoutId: Int = R.layout.activity_main
lateinit var navController: NavController
lateinit var appBarConfiguration: AppBarConfiguration
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setSupportActionBar(toolbar)
supportActionBar?.setDisplayShowTitleEnabled(false)
navController = findNavController(R.id.container)
appBarConfiguration = AppBarConfiguration(navController.graph, drawer_layout)
nav_view.setupWithNavController(navController)
setupActionBarWithNavController(navController, appBarConfiguration)
getViewModel().getUserDetails()
setupLogoutInDrawer()
}
override fun onSupportNavigateUp(): Boolean {
return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}
override fun setTitle(title: CharSequence) {
toolbar.title = title
}
override fun onBackPressed() {
if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
drawer_layout.closeDrawer(GravityCompat.START)
} else {
val navHostFragment = supportFragmentManager.findFragmentById(R.id.container)
navHostFragment?.childFragmentManager?.backStackEntryCount?.takeIf { it >= 1 }?.let {
return super.onBackPressed()
}
displayExitDialog()
}
}
override fun onSuccess(data: Any?) {
super.onSuccess(data)
when(data){
is FirebaseUser -> {
setupDrawer(data)
}
}
}
private fun setupDrawer(user: FirebaseUser) {
val header: View = nav_view.getHeaderView(0)
header.driver_email.text = user.email
header.driver_name.text = user.displayName
header.profileImage.setGlideImage(user.photoUrl)
}
private fun setupLogoutInDrawer(){
logout.setOnClickListener {
getViewModel().logOut()
}
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
// Handle navigation view item clicks here.
when (item.itemId) {
R.id.nav_user_settings -> { }
}
drawer_layout.closeDrawer(GravityCompat.START)
return true
}
}

View File

@@ -1,19 +1,16 @@
package h_mal.appttude.com.driver.ui.driver
package h_mal.appttude.com.ui
import android.os.Bundle
import android.view.View
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.BaseFragment
import h_mal.appttude.com.driver.utils.navigateTo
import h_mal.appttude.com.driver.viewmodels.DriverLicenseViewModel
import androidx.fragment.app.Fragment
import h_mal.appttude.com.R
import h_mal.appttude.com.base.BaseFragment
import h_mal.appttude.com.utils.navigateTo
import h_mal.appttude.com.viewmodels.DriverLicenseViewModel
import kotlinx.android.synthetic.main.fragment_vehicle_overall.*
class VehicleOverallFragment : BaseFragment<DriverLicenseViewModel>() {
private val viewmodel: DriverLicenseViewModel by getFragmentViewModel()
override fun getViewModel(): DriverLicenseViewModel = viewmodel
override fun getLayoutId(): Int = R.layout.fragment_vehicle_overall
class VehicleOverallFragment : Fragment(R.layout.fragment_vehicle_overall) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

View File

@@ -0,0 +1,20 @@
package h_mal.appttude.com.ui
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.View
import h_mal.appttude.com.R
import h_mal.appttude.com.utils.navigateTo
import kotlinx.android.synthetic.driver.fragment_welcome.*
class WelcomeFragment : Fragment(R.layout.fragment_welcome) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
email_sign_in_button.setOnClickListener {
view.navigateTo(R.id.to_driverOverallFragment)
}
}
}

View File

@@ -0,0 +1,59 @@
package h_mal.appttude.com.ui.driverprofile
import android.net.Uri
import android.os.Bundle
import android.view.View
import h_mal.appttude.com.R
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.model.DriversLicenseObject
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.DriverLicenseViewModel
import kotlinx.android.synthetic.main.fragment_driver_license.*
class DriverLicenseFragment :
DataSubmissionBaseFragment<DriverLicenseViewModel, DriversLicenseObject>(R.layout.fragment_driver_license) {
private val viewmodel: DriverLicenseViewModel by getFragmentViewModel()
override fun getViewModel(): DriverLicenseViewModel = viewmodel
override var model = DriversLicenseObject()
private var imageUri: Uri? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lic_expiry.apply {
setTextOnChange { model.licenseExpiry = it }
setOnClickListener {
DateDialog(this) { date ->
model.licenseExpiry = date
}
}
}
lic_no.setTextOnChange { model.licenseNumber = it }
search_image.setOnClickListener { openGalleryWithPermissionRequest() }
submit.setOnClickListener { submit() }
}
override fun submit() {
validateEditTexts(lic_expiry, lic_no).takeIf { !it }?.let { return }
viewmodel.setDataInDatabase(model, imageUri)
}
override fun setFields(data: DriversLicenseObject) {
super.setFields(data)
driversli_img.setGlideImage(data.licenseImageString)
lic_no.setText(data.licenseNumber)
lic_expiry.setText(data.licenseExpiry)
}
override fun onImageGalleryResult(imageUri: Uri?) {
super.onImageGalleryResult(imageUri)
this.imageUri = imageUri
driversli_img.setGlideImage(imageUri)
}
}

View File

@@ -1,24 +1,24 @@
package h_mal.appttude.com.driver.ui.driver.driverprofile
package h_mal.appttude.com.ui.driverprofile
import android.net.Uri
import android.os.Bundle
import android.view.View
import h_mal.appttude.com.driver.Global.DateDialog
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.model.DriverProfileObject
import h_mal.appttude.com.driver.utils.setPicassoImage
import h_mal.appttude.com.driver.viewmodels.DriverProfileViewModel
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.R
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.model.DriverProfileObject
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.DriverProfileViewModel
import kotlinx.android.synthetic.main.fragment_driver_profile.*
class DriverProfileFragment: DataSubmissionBaseFragment<DriverProfileViewModel, DriverProfileObject>() {
class DriverProfileFragment: DataSubmissionBaseFragment
<DriverProfileViewModel, DriverProfileObject>(R.layout.fragment_driver_profile) {
var localUri: Uri? = null
private val viewmodel by getFragmentViewModel<DriverProfileViewModel>()
override fun getViewModel(): DriverProfileViewModel = viewmodel
override fun getLayoutId(): Int = R.layout.fragment_driver_profile
override var model = DriverProfileObject()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -30,17 +30,21 @@ class DriverProfileFragment: DataSubmissionBaseFragment<DriverProfileViewModel,
dob_input.apply {
setTextOnChange{ model.dob = it }
setOnClickListener {
DateDialog(this)
DateDialog(this){ date ->
model.dob = date
}
}
}
ni_number.setTextOnChange{ model.ni = it }
date_first.apply {
setTextOnChange{ model.dateFirst = it }
setOnClickListener {
DateDialog(this)
DateDialog(this){ date ->
model.dateFirst = date
}
}
}
add_driver_pic.setOnClickListener { openGalleryWithPermissionRequest() }
add_photo.setOnClickListener { openGalleryWithPermissionRequest() }
submit_driver.setOnClickListener{ submit() }
}
@@ -55,7 +59,7 @@ class DriverProfileFragment: DataSubmissionBaseFragment<DriverProfileViewModel,
override fun setFields(data: DriverProfileObject) {
super.setFields(data)
driver_pic.setPicassoImage(data.driverPic)
driver_pic.setGlideImage(data.driverPic)
names_input.setText(data.forenames)
address_input.setText(data.address)
postcode_input.setText(data.postcode)
@@ -67,7 +71,7 @@ class DriverProfileFragment: DataSubmissionBaseFragment<DriverProfileViewModel,
override fun onImageGalleryResult(imageUri: Uri?) {
super.onImageGalleryResult(imageUri)
localUri = imageUri
driver_pic.setPicassoImage(imageUri)
driver_pic.setGlideImage(imageUri)
}
}

View File

@@ -1,23 +1,23 @@
package h_mal.appttude.com.driver.ui.driver.driverprofile
package h_mal.appttude.com.ui.driverprofile
import android.net.Uri
import android.os.Bundle
import android.view.View
import h_mal.appttude.com.driver.Global.DateDialog
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.model.PrivateHireObject
import h_mal.appttude.com.driver.utils.setPicassoImage
import h_mal.appttude.com.driver.viewmodels.PrivateHireLicenseViewModel
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.R
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.model.PrivateHireObject
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.PrivateHireLicenseViewModel
import kotlinx.android.synthetic.main.fragment_private_hire_license.*
class PrivateHireLicenseFragment : DataSubmissionBaseFragment<PrivateHireLicenseViewModel, PrivateHireObject>() {
class PrivateHireLicenseFragment : DataSubmissionBaseFragment
<PrivateHireLicenseViewModel, PrivateHireObject>(R.layout.fragment_private_hire_license) {
val viewmodel by getFragmentViewModel<PrivateHireLicenseViewModel>()
override fun getViewModel(): PrivateHireLicenseViewModel = viewmodel
override var model = PrivateHireObject()
override fun getLayoutId(): Int = R.layout.fragment_private_hire_license
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -26,7 +26,9 @@ class PrivateHireLicenseFragment : DataSubmissionBaseFragment<PrivateHireLicense
ph_expiry.apply {
setTextOnChange{ model.phExpiry = it }
setOnClickListener {
DateDialog(this)
DateDialog(this){ date ->
model.phExpiry = date
}
}
}
@@ -42,14 +44,14 @@ class PrivateHireLicenseFragment : DataSubmissionBaseFragment<PrivateHireLicense
override fun setFields(data: PrivateHireObject) {
super.setFields(data)
imageView2.setPicassoImage(data.phImageString)
imageView2.setGlideImage(data.phImageString)
ph_no.setText(data.phNumber)
ph_expiry.setText(data.phExpiry)
}
override fun onImageGalleryResult(imageUri: Uri?) {
super.onImageGalleryResult(imageUri)
imageView2.setPicassoImage(imageUri)
imageView2.setGlideImage(imageUri)
}
}

View File

@@ -1,25 +1,24 @@
package h_mal.appttude.com.driver.ui.driver.vehicleprofile
package h_mal.appttude.com.ui.vehicleprofile
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.ImageView
import h_mal.appttude.com.driver.Global.DateDialog
import h_mal.appttude.com.driver.Objects.InsuranceObject
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.utils.setPicassoImage
import h_mal.appttude.com.driver.viewmodels.InsuranceViewModel
import h_mal.appttude.com.R
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.model.InsuranceObject
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.InsuranceViewModel
import kotlinx.android.synthetic.main.fragment_insurance.*
class InsuranceFragment : DataSubmissionBaseFragment<InsuranceViewModel, InsuranceObject>() {
class InsuranceFragment : DataSubmissionBaseFragment<InsuranceViewModel, InsuranceObject>(R.layout.fragment_insurance) {
private var selectedImages: List<Uri>? = listOf()
private val viewmodel: InsuranceViewModel by getFragmentViewModel()
override fun getViewModel(): InsuranceViewModel = viewmodel
override fun getLayoutId(): Int = R.layout.fragment_insurance
override var model = InsuranceObject()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -28,8 +27,11 @@ class InsuranceFragment : DataSubmissionBaseFragment<InsuranceViewModel, Insuran
insurer.setTextOnChange { model.insurerName = it }
insurance_exp.apply {
setOnClickListener { DateDialog(this) }
setTextOnChange { model.expiryDate = it }
setOnClickListener {
DateDialog(this) { date ->
model.expiryDate = date
}
}
}
uploadInsurance.setOnClickListener { openGalleryWithPermissionRequest() }
@@ -40,8 +42,10 @@ class InsuranceFragment : DataSubmissionBaseFragment<InsuranceViewModel, Insuran
carouselView.setImageClickListener(null)
carouselView.setImageListener { i: Int, imageView: ImageView ->
when (list[i]) {
is Uri -> { imageView.setPicassoImage(list[i] as Uri) }
is String -> imageView.setPicassoImage(list[i] as String)
is Uri -> {
imageView.setGlideImage(list[i] as Uri)
}
is String -> imageView.setGlideImage(list[i] as String)
}
}
carouselView.pageCount = list.size

View File

@@ -1,22 +1,21 @@
package h_mal.appttude.com.driver.ui.driver.vehicleprofile
package h_mal.appttude.com.ui.vehicleprofile
import android.net.Uri
import android.os.Bundle
import android.view.View
import h_mal.appttude.com.driver.Objects.LogbookObject
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.utils.setPicassoImage
import h_mal.appttude.com.driver.viewmodels.LogbookViewModel
import h_mal.appttude.com.model.LogbookObject
import h_mal.appttude.com.R
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.LogbookViewModel
import kotlinx.android.synthetic.main.fragment_logbook.*
class LogbookFragment : DataSubmissionBaseFragment<LogbookViewModel, LogbookObject>() {
class LogbookFragment : DataSubmissionBaseFragment<LogbookViewModel, LogbookObject>(R.layout.fragment_logbook) {
private val viewmodel by getFragmentViewModel<LogbookViewModel>()
override fun getViewModel(): LogbookViewModel = viewmodel
override var model = LogbookObject()
override fun getLayoutId(): Int = R.layout.fragment_logbook
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -38,7 +37,7 @@ class LogbookFragment : DataSubmissionBaseFragment<LogbookViewModel, LogbookObje
override fun setFields(data: LogbookObject) {
super.setFields(data)
log_book_img.setPicassoImage(data.photoString)
log_book_img.setGlideImage(data.photoString)
v5c_no.setText(data.v5cnumber)
}
@@ -46,6 +45,6 @@ class LogbookFragment : DataSubmissionBaseFragment<LogbookViewModel, LogbookObje
super.onImageGalleryResult(imageUri)
picUri = imageUri
log_book_img.setPicassoImage(picUri)
log_book_img.setGlideImage(picUri)
}
}

View File

@@ -1,32 +1,32 @@
package h_mal.appttude.com.driver.ui.driver.vehicleprofile
package h_mal.appttude.com.ui.vehicleprofile
import android.net.Uri
import android.os.Bundle
import android.view.View
import h_mal.appttude.com.driver.Global.DateDialog
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.model.MotObject
import h_mal.appttude.com.driver.utils.setPicassoImage
import h_mal.appttude.com.driver.viewmodels.MotViewModel
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.R
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.model.MotObject
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.MotViewModel
import kotlinx.android.synthetic.main.fragment_mot.*
class MotFragment: DataSubmissionBaseFragment<MotViewModel, MotObject>(){
class MotFragment: DataSubmissionBaseFragment<MotViewModel, MotObject>(R.layout.fragment_mot){
private val viewmodel by getFragmentViewModel<MotViewModel>()
override fun getViewModel(): MotViewModel = viewmodel
override var model = MotObject()
override fun getLayoutId(): Int = R.layout.fragment_mot
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mot_expiry.apply {
setTextOnChange{ model.motExpiry = it }
setOnClickListener {
DateDialog(this)
DateDialog(this){ date ->
model.motExpiry = date
}
}
}
@@ -42,12 +42,12 @@ class MotFragment: DataSubmissionBaseFragment<MotViewModel, MotObject>(){
override fun setFields(data: MotObject) {
super.setFields(data)
mot_img.setPicassoImage(data.motImageString)
mot_img.setGlideImage(data.motImageString)
mot_expiry.setText(data.motExpiry)
}
override fun onImageGalleryResult(imageUri: Uri?) {
super.onImageGalleryResult(imageUri)
mot_img.setPicassoImage(imageUri)
mot_img.setGlideImage(imageUri)
}
}

View File

@@ -1,33 +1,34 @@
package h_mal.appttude.com.driver.ui.driver.vehicleprofile
package h_mal.appttude.com.ui.vehicleprofile
import android.net.Uri
import android.os.Bundle
import android.view.View
import h_mal.appttude.com.driver.Global.DateDialog
import h_mal.appttude.com.driver.Objects.PrivateHireVehicleObject
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.utils.setPicassoImage
import h_mal.appttude.com.driver.viewmodels.PrivateHireVehicleViewModel
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.model.PrivateHireVehicleObject
import h_mal.appttude.com.R
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.PrivateHireVehicleViewModel
import kotlinx.android.synthetic.main.fragment_private_hire_vehicle.*
class PrivateHireVehicleFragment: DataSubmissionBaseFragment<PrivateHireVehicleViewModel, PrivateHireVehicleObject>(){
class PrivateHireVehicleFragment: DataSubmissionBaseFragment
<PrivateHireVehicleViewModel, PrivateHireVehicleObject>(R.layout.fragment_private_hire_vehicle){
private val viewmodel by getFragmentViewModel<PrivateHireVehicleViewModel>()
override fun getViewModel(): PrivateHireVehicleViewModel = viewmodel
override var model = PrivateHireVehicleObject()
override fun getLayoutId(): Int = R.layout.fragment_private_hire_vehicle
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
ph_no.setTextOnChange{ model.phCarNumber = it }
ph_expiry.apply {
setTextOnChange{ model.phCarExpiry = it }
setOnClickListener {
DateDialog(this)
DateDialog(this){ date ->
model.phCarExpiry = date
}
}
}
@@ -43,13 +44,13 @@ class PrivateHireVehicleFragment: DataSubmissionBaseFragment<PrivateHireVehicleV
override fun setFields(data: PrivateHireVehicleObject) {
super.setFields(data)
imageView2.setPicassoImage(data.phCarImageString)
imageView2.setGlideImage(data.phCarImageString)
ph_no.setText(data.phCarNumber)
ph_expiry.setText(data.phCarExpiry)
}
override fun onImageGalleryResult(imageUri: Uri?) {
super.onImageGalleryResult(imageUri)
imageView2.setPicassoImage(imageUri)
imageView2.setGlideImage(imageUri)
}
}

View File

@@ -1,22 +1,22 @@
package h_mal.appttude.com.driver.ui.driver.vehicleprofile
package h_mal.appttude.com.ui.vehicleprofile
import android.os.Bundle
import android.view.View
import h_mal.appttude.com.driver.Global.DateDialog
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.model.VehicleProfileObject
import h_mal.appttude.com.driver.viewmodels.VehicleProfileViewModel
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.R
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.model.VehicleProfileObject
import h_mal.appttude.com.viewmodels.VehicleProfileViewModel
import kotlinx.android.synthetic.main.fragment_vehicle_setup.*
class VehicleProfileFragment: DataSubmissionBaseFragment<VehicleProfileViewModel, VehicleProfileObject>(){
class VehicleProfileFragment: DataSubmissionBaseFragment
<VehicleProfileViewModel, VehicleProfileObject>(R.layout.fragment_vehicle_setup){
private val viewmodel by getFragmentViewModel<VehicleProfileViewModel>()
override fun getViewModel(): VehicleProfileViewModel = viewmodel
override var model = VehicleProfileObject()
override fun getLayoutId(): Int = R.layout.fragment_vehicle_setup
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -29,9 +29,10 @@ class VehicleProfileFragment: DataSubmissionBaseFragment<VehicleProfileViewModel
address.setTextOnChange { model.keeperAddress = it }
postcode.setTextOnChange { model.keeperPostCode = it }
start_date.apply {
setTextOnChange{ model.startDate = it }
setOnClickListener {
DateDialog(this)
DateDialog(this){ date ->
model.startDate = date
}
}
}
seized_checkbox.setOnCheckedChangeListener { _, res -> model.isSeized = res}

View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background_with_curve"
tools:context=".ui.user.LoginFragment">
<ImageView
android:id="@+id/background_img"
android:src="@drawable/welcome_background"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
style="@style/imageBackground"
android:contentDescription="@string/image_description" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/activity_horizontal_margin"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.button.MaterialButton
android:id="@+id/email_sign_in_button"
style="@style/TextButton.WithIcon"
android:text="@string/login"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.9" />
<TextView
android:id="@+id/register_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/or_create_my_account"
android:textColor="@android:color/white"
android:layout_marginTop="@dimen/activity_horizontal_margin"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/email_sign_in_button" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_nice_to_meet_you"
android:textColor="@android:color/white"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="32dp"/>
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/get_a_new_experience"
android:layout_marginTop="6dp"
android:textStyle="bold"
android:textSize="24sp"
app:layout_constraintLeft_toLeftOf="parent"
android:textColor="@android:color/white"
app:layout_constraintTop_toBottomOf="@id/textView3"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,4 @@
<resources>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
</resources>

View File

@@ -1,50 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="h_mal.appttude.com.driver">
package="h_mal.appttude.com">
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:name=".application.DriverApplication"
android:name="h_mal.appttude.com.application.DriverApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".update.UpdateActivity" />
<activity
android:name=".ui.user.LoginActivity"
android:label="@string/app_name"
android:theme="@style/Theme.Design.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.driver.MainActivity"
android:configChanges="orientation|screenSize"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="h_mal.appttude.com.driver"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.Archive
package h_mal.appttude.com.Archive
import android.os.Bundle
import android.view.LayoutInflater
@@ -10,12 +10,11 @@ import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.ValueEventListener
import h_mal.appttude.com.driver.Global.FirebaseClass
import h_mal.appttude.com.driver.Objects.ArchiveObject
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.R
class ArchiveFragment : Fragment() {
var archive: ArchiveObject? = null
// var archive: ArchiveObject? = null
private var reference: DatabaseReference? = null
private var listView: ListView? = null
var archiveString: String? = null
@@ -27,18 +26,18 @@ class ArchiveFragment : Fragment() {
// )
// .child(FirebaseClass.ARCHIVE_FIREBASE)
archiveString = requireArguments().getString("archive")
var s: String = ""
when (archiveString) {
FirebaseClass.PRIVATE_HIRE_FIREBASE -> s = "Private Hire"
FirebaseClass.DRIVERS_LICENSE_FIREBASE -> s = "License"
FirebaseClass.VEHICLE_DETAILS_FIREBASE -> s = "Vehicle"
FirebaseClass.MOT_FIREBASE -> s = "M.O.T"
FirebaseClass.INSURANCE_FIREBASE -> s = "Insurance"
FirebaseClass.LOG_BOOK_FIREBASE -> s = "Logbook"
FirebaseClass.PRIVATE_HIRE_VEHICLE_LICENSE -> s = "Private Hire Vehicle"
}
requireActivity().title = s + " Archive"
// archiveString = requireArguments().getString("archive")
// var s: String = ""
// when (archiveString) {
// FirebaseClass.PRIVATE_HIRE_FIREBASE -> s = "Private Hire"
// FirebaseClass.DRIVERS_LICENSE_FIREBASE -> s = "License"
// FirebaseClass.VEHICLE_DETAILS_FIREBASE -> s = "Vehicle"
// FirebaseClass.MOT_FIREBASE -> s = "M.O.T"
// FirebaseClass.INSURANCE_FIREBASE -> s = "Insurance"
// FirebaseClass.LOG_BOOK_FIREBASE -> s = "Logbook"
// FirebaseClass.PRIVATE_HIRE_VEHICLE_LICENSE -> s = "Private Hire Vehicle"
// }
// requireActivity().title = s + " Archive"
}
override fun onCreateView(
@@ -52,12 +51,12 @@ class ArchiveFragment : Fragment() {
return view
}
var valueEventListener: ValueEventListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
archive = dataSnapshot.getValue(ArchiveObject::class.java)
listView!!.adapter = ArchiveObjectListAdapter(archive, requireContext(), archiveString)
}
override fun onCancelled(databaseError: DatabaseError) {}
}
// var valueEventListener: ValueEventListener = object : ValueEventListener {
// override fun onDataChange(dataSnapshot: DataSnapshot) {
// archive = dataSnapshot.getValue(ArchiveObject::class.java)
// listView!!.adapter = ArchiveObjectListAdapter(archive, requireContext(), archiveString)
// }
//
// override fun onCancelled(databaseError: DatabaseError) {}
// }
}

View File

@@ -0,0 +1,221 @@
package h_mal.appttude.com.Archive
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
//import h_mal.appttude.com.Global.FirebaseClass
//import h_mal.appttude.com.Global.ImageSwiperClass
//import h_mal.appttude.com.Objects.ArchiveObject
import h_mal.appttude.com.model.InsuranceObject
import h_mal.appttude.com.R
import h_mal.appttude.com.model.VehicleProfileObject
import h_mal.appttude.com.utils.DateUtils.convertDateStringDatePattern
import java.text.ParseException
class ArchiveObjectListAdapter(
// var archiveObject: ArchiveObject?,
var context: Context?,
var archiveString: String?
) : BaseAdapter() {
var size: Int = 0
lateinit var mKeys: Array<String>
private var dateArchivedText: TextView? = null
override fun getCount(): Int {
return size
}
override fun getItem(position: Int): Any? {
when (archiveString) {
// FirebaseClass.PRIVATE_HIRE_FIREBASE -> return archiveObject?.private_hire
// ?.get(mKeys[position])
// FirebaseClass.DRIVERS_LICENSE_FIREBASE -> return archiveObject?.driver_license
// ?.get(mKeys[position])
// FirebaseClass.VEHICLE_DETAILS_FIREBASE -> return archiveObject?.vehicle_details
// ?.get(mKeys[position])
// FirebaseClass.MOT_FIREBASE -> return archiveObject?.mot_details?.get(mKeys[position])
// FirebaseClass.INSURANCE_FIREBASE -> return archiveObject?.insurance_details?.get(
// mKeys[position]
// )
// FirebaseClass.LOG_BOOK_FIREBASE -> return archiveObject?.log_book
// ?.get(mKeys.get(position))
// FirebaseClass.PRIVATE_HIRE_VEHICLE_LICENSE -> return archiveObject?.ph_car?.get(mKeys[position])
else -> return mKeys[position]
}
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View, parent: ViewGroup): View {
var listItemView: View = convertView
//
// if (listItemView == null) {
// if (((archiveString == FirebaseClass.PRIVATE_HIRE_FIREBASE) || (archiveString == FirebaseClass.DRIVERS_LICENSE_FIREBASE) || (archiveString == FirebaseClass.MOT_FIREBASE) || (archiveString == FirebaseClass.LOG_BOOK_FIREBASE) || (archiveString == FirebaseClass.PRIVATE_HIRE_VEHICLE_LICENSE))) {
// listItemView = LayoutInflater.from(context).inflate(
// R.layout.archive_license_item, parent, false
// )
// val imageView: ImageView = listItemView.findViewById(R.id.image_archive)
// dateArchivedText = listItemView.findViewById(R.id.date_archived)
// val expiryHolder: LinearLayout = listItemView.findViewById(R.id.expiry_view)
// val fieldTwo: LinearLayout = listItemView.findViewById(R.id.field_two_view)
// val expiryText: TextView = listItemView.findViewById(R.id.exp_text)
// val fiewTwoLable: TextView = listItemView.findViewById(R.id.field_two)
// val fieldTwoText: TextView = listItemView.findViewById(R.id.field_two_text)
// when (archiveString) {
//// FirebaseClass.PRIVATE_HIRE_FIREBASE -> {
//// expiryHolder.visibility = View.VISIBLE
//// fieldTwo.visibility = View.VISIBLE
//// val privateHireObject: PrivateHireObject =
//// getItem(position) as PrivateHireObject
//// Picasso.get().load(privateHireObject.phImageString)
//// .placeholder(R.drawable.choice_img)
//// .into(imageView)
//// dateString(position)
//// expiryText.text = privateHireObject.phExpiry
//// fiewTwoLable.text = "Private Hire License No.:"
//// fieldTwoText.text = privateHireObject.phNumber
//// }
//// FirebaseClass.DRIVERS_LICENSE_FIREBASE -> {
//// expiryHolder.visibility = View.VISIBLE
//// fieldTwo.visibility = View.VISIBLE
//// val driversLicenseObject: DriversLicenseObject =
//// getItem(position) as DriversLicenseObject
//// Picasso.get().load(driversLicenseObject.licenseImageString)
//// .placeholder(R.drawable.choice_img)
//// .into(imageView)
//// dateString(position)
//// expiryText.text = driversLicenseObject.licenseExpiry
//// fiewTwoLable.text = "License No.:"
//// fieldTwoText.text = driversLicenseObject.licenseNumber
//// }
//// FirebaseClass.MOT_FIREBASE -> {
//// expiryHolder.visibility = View.VISIBLE
//// fieldTwo.visibility = View.GONE
//// val motObject: MotObject = getItem(position) as MotObject
//// Picasso.get().load(motObject.motImageString)
//// .placeholder(R.drawable.choice_img)
//// .into(imageView)
//// dateString(position)
//// expiryText.text = motObject.motExpiry
//// }
//// FirebaseClass.LOG_BOOK_FIREBASE -> {
//// expiryHolder.visibility = View.GONE
//// fieldTwo.visibility = View.VISIBLE
//// val logbookObject: LogbookObject = getItem(position) as LogbookObject
//// Picasso.get().load(logbookObject.photoString)
//// .into(MainActivity.loadImage(imageView))
//// dateString(position)
//// fiewTwoLable.text = "V5C No.:"
//// fieldTwoText.text = logbookObject.v5cnumber
//// }
//// FirebaseClass.PRIVATE_HIRE_VEHICLE_LICENSE -> {
//// expiryHolder.visibility = View.VISIBLE
//// fieldTwo.visibility = View.VISIBLE
//// val privateHireVehicleObject: PrivateHireVehicleObject =
//// getItem(position) as PrivateHireVehicleObject
//// Picasso.get().load(privateHireVehicleObject.phCarImageString)
//// .into(MainActivity.loadImage(imageView))
//// dateString(position)
//// expiryText.text = privateHireVehicleObject.phCarExpiry
//// fiewTwoLable.text = "Private Hire Vehicle License No.:"
//// fieldTwoText.text = privateHireVehicleObject.phCarNumber
//// }
//// }
//// } else if ((archiveString == FirebaseClass.INSURANCE_FIREBASE)) {
//// listItemView = LayoutInflater.from(context).inflate(
//// R.layout.archive_insurance_item, parent, false
//// )
//// val holder: View = listItemView.findViewById(R.id.image_pager)
//// val swiperClass: ImageSwiperClass = ImageSwiperClass(context, holder)
//// // swiperClass.hideDelete();
//// listItemView.findViewById<View>(R.id.delete).visibility = View.GONE
//// // holder.findViewById(R.id.delete).setVisibility(View.INVISIBLE);
//// dateArchivedText = listItemView.findViewById(R.id.date_archived)
//// dateString(position)
//// val expiryText: TextView = listItemView.findViewById(R.id.exp_text)
//// val fieldTwoText: TextView = listItemView.findViewById(R.id.archive_insurer)
//// val insuranceObject: InsuranceObject = getItem(position) as InsuranceObject
////// swiperClass.reinstantiateList(insuranceObject.photoStrings)
//// expiryText.text = insuranceObject.expiryDate
//// fieldTwoText.text = insuranceObject.insurerName
//// } else if ((archiveString == FirebaseClass.VEHICLE_DETAILS_FIREBASE)) {
//// listItemView = LayoutInflater.from(context).inflate(
//// R.layout.archive_vehicle_item, parent, false
//// )
//// dateArchivedText = listItemView.findViewById(R.id.date_archived)
//// dateString(position)
//// val numberPlate: TextView = listItemView.findViewById(R.id.number_plate)
//// val keeperName: TextView = listItemView.findViewById(R.id.keeper_name)
//// val keeperAddress: TextView = listItemView.findViewById(R.id.keeper_address)
//// val carText: TextView = listItemView.findViewById(R.id.car_text_arch)
//// val carColour: TextView = listItemView.findViewById(R.id.car_colour)
//// val carSeized: TextView = listItemView.findViewById(R.id.seized_checkbox)
//// val startDate: TextView = listItemView.findViewById(R.id.first_date)
//// val vehicleProfileObject: VehicleProfileObject =
//// getItem(position) as VehicleProfileObject
//// numberPlate.text = vehicleProfileObject.reg
//// keeperName.text = vehicleProfileObject.keeperName
//// keeperAddress.text = vehicleProfileObject.keeperAddress + "\n" + vehicleProfileObject.keeperPostCode
//// carText.text = vehicleProfileObject.make + " " + vehicleProfileObject.model
//// carColour.text = vehicleProfileObject.colour
//// val s: String
//// if (vehicleProfileObject.isSeized) {
//// s = "Yes"
//// } else {
//// s = "No"
//// }
//// carSeized.text = s
//// startDate.text = vehicleProfileObject.startDate
//// }
//// }
return listItemView
}
private fun dateString(position: Int) {
var success: Boolean = true
try {
dateArchivedText!!.text = mKeys[position].convertDateStringDatePattern("yyyyMMdd_HHmmss", "dd/MM/yyyy")
} catch (e: ParseException) {
e.printStackTrace()
success = false
} finally {
if (!success) {
dateArchivedText!!.text = mKeys.get(position).substring(0, 8)
}
}
}
companion object {
private val TAG: String = "ArchiveObjectListAdapte"
}
// init {
// archiveObject?.apply {
// val map = when (archiveString) {
// FirebaseClass.PRIVATE_HIRE_FIREBASE -> private_hire
// FirebaseClass.DRIVERS_LICENSE_FIREBASE -> driver_license
// FirebaseClass.VEHICLE_DETAILS_FIREBASE -> vehicle_details
// FirebaseClass.MOT_FIREBASE -> mot_details
// FirebaseClass.INSURANCE_FIREBASE -> insurance_details
// FirebaseClass.LOG_BOOK_FIREBASE -> log_book
// FirebaseClass.PRIVATE_HIRE_VEHICLE_LICENSE -> ph_car
// else -> null
// }
// setUp(map)
// }
//
// }
private fun setUp(map: HashMap<String,*>?){
size = map?.size ?: 0
map?.keys?.toTypedArray()?.let{
mKeys = it
}
}
}

View File

@@ -1,11 +1,11 @@
package h_mal.appttude.com.driver.application
package h_mal.appttude.com.application
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import h_mal.appttude.com.driver.data.FirebaseAuthSource
import h_mal.appttude.com.driver.data.FirebaseDatabaseSource
import h_mal.appttude.com.driver.data.FirebaseStorageSource
import h_mal.appttude.com.driver.viewmodels.*
import h_mal.appttude.com.data.FirebaseAuthSource
import h_mal.appttude.com.data.FirebaseDatabaseSource
import h_mal.appttude.com.data.FirebaseStorageSource
import h_mal.appttude.com.viewmodels.*
class ApplicationViewModelFactory(
private val auth: FirebaseAuthSource,
@@ -28,6 +28,7 @@ class ApplicationViewModelFactory(
isAssignableFrom(MotViewModel::class.java) -> MotViewModel(auth, database, storage)
isAssignableFrom(LogbookViewModel::class.java) -> LogbookViewModel(auth, database, storage)
isAssignableFrom(PrivateHireVehicleViewModel::class.java) -> PrivateHireVehicleViewModel(auth, database, storage)
isAssignableFrom(RoleViewModel::class.java) -> RoleViewModel(auth, database, storage)
else -> throw IllegalArgumentException("Unknown ViewModel class")
} as T
}

View File

@@ -1,9 +1,10 @@
package h_mal.appttude.com.driver.application
package h_mal.appttude.com.application
import android.app.Application
import h_mal.appttude.com.driver.data.FirebaseAuthSource
import h_mal.appttude.com.driver.data.FirebaseDatabaseSource
import h_mal.appttude.com.driver.data.FirebaseStorageSource
import h_mal.appttude.com.data.FirebaseAuthSource
import h_mal.appttude.com.data.FirebaseDatabaseSource
import h_mal.appttude.com.data.FirebaseStorageSource
import h_mal.appttude.com.espresso.IdlingResourceClass
import org.kodein.di.Kodein
import org.kodein.di.KodeinAware
import org.kodein.di.android.x.androidXModule

View File

@@ -1,9 +1,8 @@
package h_mal.appttude.com.driver.base
package h_mal.appttude.com.base
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.LayoutParams
import android.view.ViewGroup.LayoutParams.*
import androidx.activity.viewModels
@@ -11,13 +10,14 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.application.ApplicationViewModelFactory
import h_mal.appttude.com.driver.data.ViewState
import h_mal.appttude.com.driver.utils.displayToast
import h_mal.appttude.com.driver.utils.hide
import h_mal.appttude.com.driver.utils.show
import h_mal.appttude.com.driver.utils.triggerAnimation
import h_mal.appttude.com.application.ApplicationViewModelFactory
import h_mal.appttude.com.R
import h_mal.appttude.com.data.ViewState
import h_mal.appttude.com.espresso.IdlingResourceClass
import h_mal.appttude.com.utils.displayToast
import h_mal.appttude.com.utils.hide
import h_mal.appttude.com.utils.show
import h_mal.appttude.com.utils.triggerAnimation
import org.kodein.di.KodeinAware
import org.kodein.di.android.kodein
import org.kodein.di.generic.instance
@@ -32,6 +32,7 @@ abstract class BaseActivity<V : BaseViewModel> : AppCompatActivity(), KodeinAwar
override val kodein by kodein()
val factory by instance<ApplicationViewModelFactory>()
private val idlingResource by instance<IdlingResourceClass>()
inline fun <reified VM : ViewModel> createLazyViewModel(): Lazy<VM> = viewModels { factory }
inline fun <reified VM : ViewModel> createViewModel(): VM =
@@ -56,7 +57,6 @@ abstract class BaseActivity<V : BaseViewModel> : AppCompatActivity(), KodeinAwar
loadingView = layoutInflater.inflate(R.layout.progress_layout, null)
loadingView.setOnClickListener(null)
addContentView(loadingView, LayoutParams(MATCH_PARENT, MATCH_PARENT))
loadingView.hide()
}
@@ -76,6 +76,7 @@ abstract class BaseActivity<V : BaseViewModel> : AppCompatActivity(), KodeinAwar
open fun onStarted() {
loadingView.fadeIn()
loading = true
IdlingResourceClass.increment()
}
/**
@@ -84,6 +85,7 @@ abstract class BaseActivity<V : BaseViewModel> : AppCompatActivity(), KodeinAwar
open fun onSuccess(data: Any?) {
loadingView.fadeOut()
loading = false
IdlingResourceClass.decrement()
}
/**
@@ -93,6 +95,7 @@ abstract class BaseActivity<V : BaseViewModel> : AppCompatActivity(), KodeinAwar
error?.let { displayToast(it) }
loadingView.fadeOut()
loading = false
IdlingResourceClass.decrement()
}
private fun configureObserver() {

View File

@@ -1,34 +1,32 @@
package h_mal.appttude.com.driver.base
package h_mal.appttude.com.base
import android.app.Activity
import android.content.ClipData
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import h_mal.appttude.com.driver.application.ApplicationViewModelFactory
import h_mal.appttude.com.driver.data.ViewState
import h_mal.appttude.com.driver.utils.PermissionsUtils
import h_mal.appttude.com.application.ApplicationViewModelFactory
import h_mal.appttude.com.data.ViewState
import h_mal.appttude.com.utils.PermissionsUtils
import org.kodein.di.KodeinAware
import org.kodein.di.android.x.kodein
import org.kodein.di.generic.instance
const val IMAGE_SELECT_REQUEST_CODE = 401
abstract class BaseFragment<V : BaseViewModel> : Fragment(), KodeinAware {
abstract class BaseFragment<V : BaseViewModel>(@LayoutRes contentLayoutId: Int) :
Fragment(contentLayoutId), KodeinAware {
var mActivity: BaseActivity<V>? = null
abstract fun getViewModel(): V
abstract fun getLayoutId(): Int
private var multipleImage: Boolean = false
fun setImageSelectionAsMultiple(){
fun setImageSelectionAsMultiple() {
multipleImage = true
}
@@ -37,12 +35,6 @@ abstract class BaseFragment<V : BaseViewModel> : Fragment(), KodeinAware {
inline fun <reified VM : ViewModel> getFragmentViewModel(): Lazy<VM> = viewModels { factory }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(getLayoutId(), container, false)
@Suppress("UNCHECKED_CAST")
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
@@ -72,22 +64,22 @@ abstract class BaseFragment<V : BaseViewModel> : Fragment(), KodeinAware {
}
private fun configureObserver() {
getViewModel().uiState.observe(viewLifecycleOwner, Observer {
getViewModel().uiState.observe(viewLifecycleOwner) {
when (it) {
is ViewState.HasStarted -> onStarted()
is ViewState.HasData<*> -> onSuccess(it.data.getContentIfNotHandled())
is ViewState.HasError -> onFailure(it.error.getContentIfNotHandled())
}
})
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK){
when(requestCode){
if (resultCode == Activity.RESULT_OK) {
when (requestCode) {
IMAGE_SELECT_REQUEST_CODE -> {
data?.clipData?.convertToList()?.let { clip ->
val list = clip.takeIf { it.size > 10 }?.let{
val list = clip.takeIf { it.size > 10 }?.let {
clip.subList(0, 9)
} ?: clip
onImageGalleryResult(list)
@@ -100,15 +92,7 @@ abstract class BaseFragment<V : BaseViewModel> : Fragment(), KodeinAware {
}
}
private fun ClipData.convertToList(): List<Uri> {
val list = mutableListOf<Uri>()
for (i in 0 until itemCount) {
val item: ClipData.Item = getItemAt(i)
val uri = item.uri
list.add(uri)
}
return list.toList()
}
private fun ClipData.convertToList(): List<Uri> = 0.rangeTo(itemCount).map { getItemAt(it).uri }
/**
* Pair with {@link #Fragment.onRequestPermissionsResult}
@@ -121,7 +105,7 @@ abstract class BaseFragment<V : BaseViewModel> : Fragment(), KodeinAware {
fun onPermissionRequest(
requestCode: Int, ourRequestCode: Int, grantResults: IntArray,
permissionGranted: () -> Unit
){
) {
when (requestCode) {
ourRequestCode -> {
if (PermissionsUtils.isGranted(grantResults)) {
@@ -132,13 +116,20 @@ abstract class BaseFragment<V : BaseViewModel> : Fragment(), KodeinAware {
}
}
open fun onImageGalleryResult(imageUri: Uri?){ }
open fun onImageGalleryResult(imageUris: List<Uri>?){ }
/**
* Called on the result of image selection
*/
open fun onImageGalleryResult(imageUri: Uri?) {}
/**
* Called on the result of multiple image selection
*/
open fun onImageGalleryResult(imageUris: List<Uri>?) {}
fun openGalleryForImage() {
val intent = Intent(Intent.ACTION_PICK)
intent.type = "image/*"
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, multipleImage);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, multipleImage)
startActivityForResult(intent, IMAGE_SELECT_REQUEST_CODE)
}

View File

@@ -1,9 +1,9 @@
package h_mal.appttude.com.driver.base
package h_mal.appttude.com.base
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import h_mal.appttude.com.driver.data.ViewState
import h_mal.appttude.com.driver.utils.Event
import h_mal.appttude.com.data.ViewState
import h_mal.appttude.com.utils.Event
abstract class BaseViewModel: ViewModel(){
open val uiState: MutableLiveData<ViewState> = MutableLiveData()

View File

@@ -1,16 +1,21 @@
package h_mal.appttude.com.driver.base
package h_mal.appttude.com.base
import android.Manifest
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.EditText
import androidx.annotation.LayoutRes
import androidx.core.widget.doAfterTextChanged
import h_mal.appttude.com.driver.utils.PermissionsUtils.askForPermissions
import h_mal.appttude.com.driver.utils.TextValidationUtils.validateEditText
import h_mal.appttude.com.data.UserAuthState
import h_mal.appttude.com.ui.user.LoginActivity
import h_mal.appttude.com.utils.PermissionsUtils.askForPermissions
import h_mal.appttude.com.utils.TextValidationUtils.validateEditText
private const val IMAGE_PERMISSION_RESULT = 402
abstract class DataSubmissionBaseFragment<V : DataSubmissionBaseViewModel<T>, T: Any> : BaseFragment<BaseViewModel>(){
abstract class DataSubmissionBaseFragment<V : DataSubmissionBaseViewModel<T>, T: Any>
(@LayoutRes contentLayoutId: Int) : BaseFragment<BaseViewModel>(contentLayoutId){
var picUri: Uri? = null
@@ -19,10 +24,17 @@ abstract class DataSubmissionBaseFragment<V : DataSubmissionBaseViewModel<T>, T:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
getViewModel().stateLiveData.observe(viewLifecycleOwner) {
if (it is UserAuthState.LoggedOut) {
val intent = Intent(requireContext(), LoginActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
requireActivity().finish()
}
}
getViewModel().getDataFromDatabase()
}
@Suppress("UNCHECKED_CAST")
override fun onSuccess(data: Any?) {
super.onSuccess(data)
@@ -37,9 +49,7 @@ abstract class DataSubmissionBaseFragment<V : DataSubmissionBaseViewModel<T>, T:
model = data
}
open fun submit(){
}
open fun submit(){}
fun openGalleryWithPermissionRequest(){
if (askForPermissions(Manifest.permission.READ_EXTERNAL_STORAGE, IMAGE_PERMISSION_RESULT)) {

View File

@@ -1,23 +1,25 @@
package h_mal.appttude.com.driver.base
package h_mal.appttude.com.base
import android.net.Uri
import androidx.lifecycle.MutableLiveData
import com.google.firebase.database.DatabaseReference
import com.google.firebase.storage.StorageReference
import h_mal.appttude.com.driver.data.FirebaseCompletion
import h_mal.appttude.com.driver.data.FirebaseDatabaseSource
import h_mal.appttude.com.driver.data.FirebaseStorageSource
import h_mal.appttude.com.driver.utils.Coroutines.io
import h_mal.appttude.com.driver.utils.DateUtils.getDateTimeStamp
import h_mal.appttude.com.driver.utils.getDataFromDatabaseRef
import h_mal.appttude.com.data.*
import h_mal.appttude.com.utils.Coroutines.io
import h_mal.appttude.com.utils.DateUtils.getDateTimeStamp
import h_mal.appttude.com.utils.getDataFromDatabaseRef
import kotlinx.coroutines.Job
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import java.io.IOException
abstract class DataSubmissionBaseViewModel<T : Any>(
auth: FirebaseAuthentication,
private val database: FirebaseDatabaseSource,
private val storage: FirebaseStorageSource?
) : BaseViewModel() {
val stateLiveData = auth.userStateListener()
val uid: String = auth.getUid() ?: ""
abstract val databaseRef: DatabaseReference
abstract val storageRef: StorageReference?

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.data
package h_mal.appttude.com.data
sealed class DataFieldState {
object DefaultState : DataFieldState()

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.data
package h_mal.appttude.com.data
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError

View File

@@ -1,8 +1,9 @@
package h_mal.appttude.com.driver.data
package h_mal.appttude.com.data
import android.net.Uri
import com.google.android.gms.tasks.Task
import com.google.firebase.auth.*
import java.io.IOException
class FirebaseAuthSource: FirebaseAuthentication{
private val auth = FirebaseAuth.getInstance()
@@ -24,25 +25,32 @@ class FirebaseAuthSource: FirebaseAuthentication{
override fun updateProfile(
name: String?,
profilePic: Uri?
): Task<Void>? {
): Task<Void> {
val profileUpdates = UserProfileChangeRequest.Builder().apply {
name?.let { setDisplayName(it) }
profilePic?.let { setPhotoUri(it) }
}.build()
return getUser()?.updateProfile(profileUpdates)
return getCurrentUser().updateProfile(profileUpdates)
}
override fun reauthenticate(
email: String,
password: String
): Task<Void>? {
): Task<Void> {
val credential = EmailAuthProvider.getCredential(email, password)
return getUser()?.reauthenticate(credential)
return getCurrentUser().reauthenticate(credential)
}
override fun updateEmail(email: String): Task<Void>? = getUser()?.updateEmail(email)
override fun updatePassword(password: String): Task<Void>? = getUser()?.updatePassword(password)
override fun deleteProfile() = getUser()?.delete()
override fun updateEmail(email: String): Task<Void> = getCurrentUser().updateEmail(email)
override fun updatePassword(password: String): Task<Void> = getCurrentUser().updatePassword(password)
override fun deleteProfile(): Task<Void> = getCurrentUser().delete()
override fun userStateListener() : FirebaseLiveData {
return FirebaseLiveData(auth)
}
private fun getCurrentUser(): FirebaseUser{
return getUser() ?: throw IOException("User not signed in")
}
}

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.data
package h_mal.appttude.com.data
import android.net.Uri
import com.google.android.gms.tasks.Task
@@ -15,12 +15,13 @@ interface FirebaseAuthentication{
fun updateProfile(
name: String?,
profilePic: Uri?
): Task<Void>?
): Task<Void>
fun reauthenticate(
email: String,
password: String
): Task<Void>?
fun updateEmail(email: String): Task<Void>?
fun updatePassword(password: String): Task<Void>?
fun deleteProfile(): Task<Void>?
): Task<Void>
fun updateEmail(email: String): Task<Void>
fun updatePassword(password: String): Task<Void>
fun deleteProfile(): Task<Void>
fun userStateListener() : FirebaseLiveData
}

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.data
package h_mal.appttude.com.data
sealed class FirebaseCompletion{
object Default: FirebaseCompletion()

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.data
package h_mal.appttude.com.data
import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.FirebaseDatabase

View File

@@ -0,0 +1,28 @@
package h_mal.appttude.com.data
import androidx.lifecycle.LiveData
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.FirebaseUser
class FirebaseLiveData(
private val firebaseAuth: FirebaseAuth
): LiveData<UserAuthState>(){
override fun onActive() {
super.onActive()
firebaseAuth.addAuthStateListener(stateListener)
}
override fun onInactive() {
super.onInactive()
firebaseAuth.removeAuthStateListener(stateListener)
}
private val stateListener = FirebaseAuth.AuthStateListener { p0 ->
if (p0.currentUser == null) {
postValue(UserAuthState.LoggedOut)
} else {
postValue(UserAuthState.LoggedIn(p0.currentUser!!))
}
}
}

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.data
package h_mal.appttude.com.data
import android.net.Uri
import com.google.firebase.storage.FirebaseStorage

View File

@@ -0,0 +1,4 @@
package h_mal.appttude.com.data
const val DRIVER = "driver"
const val ADMIN = "super_user"

View File

@@ -0,0 +1,9 @@
package h_mal.appttude.com.data
import com.google.firebase.auth.FirebaseUser
import h_mal.appttude.com.utils.Event
sealed class UserAuthState {
object LoggedOut : UserAuthState()
class LoggedIn(val data: FirebaseUser) : UserAuthState()
}

View File

@@ -1,6 +1,6 @@
package h_mal.appttude.com.driver.data
package h_mal.appttude.com.data
import h_mal.appttude.com.driver.utils.Event
import h_mal.appttude.com.utils.Event
sealed class ViewState {

View File

@@ -1,30 +1,34 @@
package h_mal.appttude.com.driver.Global
package h_mal.appttude.com.dialogs
import android.app.AlertDialog
import android.app.DatePickerDialog
import android.app.DatePickerDialog.OnDateSetListener
import android.content.Context
import android.icu.util.Calendar
import android.os.Build
import android.view.View
import android.widget.EditText
import androidx.annotation.RequiresApi
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.utils.DateUtils
import h_mal.appttude.com.R
import h_mal.appttude.com.utils.DateUtils
private const val DATE_FORMAT = "dd/MM/yyyy"
@RequiresApi(api = Build.VERSION_CODES.N)
class DateDialog(
private val editText: EditText
private val editText: EditText,
dateSelected:(String?) -> Unit
) : DatePickerDialog(editText.context, AlertDialog.THEME_HOLO_LIGHT) {
var dateSetListener: OnDateSetListener =
private val dateSetListener: OnDateSetListener =
OnDateSetListener { _, year, month, dayOfMonth ->
val cal = Calendar.getInstance()
cal.set(year, month + 1, dayOfMonth)
editText.setText(DateUtils.parseCalenderIntoDateString(cal, DATE_FORMAT))
val date = DateUtils.parseCalenderIntoDateString(cal, DATE_FORMAT)
dateSelected(date)
editText.setText(date)
editText.error = null
}
init {

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.dialogs
package h_mal.appttude.com.dialogs
import android.app.Activity
import android.app.AlertDialog
@@ -10,11 +10,11 @@ object ExitDialog{
fun Activity.displayExitDialog() = AlertDialog.Builder(this)
.setTitle("Leave?")
.setMessage("Are you sure you want to exit?")
.setNegativeButton(android.R.string.no, null)
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(
android.R.string.yes
android.R.string.ok
) { _, _ ->
this.finish()
finish()
exitProcess(0)
}
.create()

View File

@@ -1,227 +0,0 @@
package h_mal.appttude.com.driver.Archive
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import com.squareup.picasso.Picasso
import h_mal.appttude.com.driver.Global.FirebaseClass
import h_mal.appttude.com.driver.Global.ImageSwiperClass
import h_mal.appttude.com.driver.ui.driver.MainActivity
import h_mal.appttude.com.driver.Objects.ArchiveObject
import h_mal.appttude.com.driver.Objects.InsuranceObject
import h_mal.appttude.com.driver.Objects.LogbookObject
import h_mal.appttude.com.driver.Objects.PrivateHireVehicleObject
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.model.DriversLicenseObject
import h_mal.appttude.com.driver.model.MotObject
import h_mal.appttude.com.driver.model.PrivateHireObject
import h_mal.appttude.com.driver.model.VehicleProfileObject
import h_mal.appttude.com.driver.utils.DateUtils.convertDateStringDatePattern
import java.text.ParseException
class ArchiveObjectListAdapter(
var archiveObject: ArchiveObject?,
var context: Context?,
var archiveString: String?
) : BaseAdapter() {
var size: Int = 0
lateinit var mKeys: Array<String>
private var dateArchivedText: TextView? = null
override fun getCount(): Int {
return size
}
override fun getItem(position: Int): Any? {
when (archiveString) {
FirebaseClass.PRIVATE_HIRE_FIREBASE -> return archiveObject?.private_hire
?.get(mKeys[position])
FirebaseClass.DRIVERS_LICENSE_FIREBASE -> return archiveObject?.driver_license
?.get(mKeys[position])
FirebaseClass.VEHICLE_DETAILS_FIREBASE -> return archiveObject?.vehicle_details
?.get(mKeys[position])
FirebaseClass.MOT_FIREBASE -> return archiveObject?.mot_details?.get(mKeys[position])
FirebaseClass.INSURANCE_FIREBASE -> return archiveObject?.insurance_details?.get(
mKeys[position]
)
FirebaseClass.LOG_BOOK_FIREBASE -> return archiveObject?.log_book
?.get(mKeys.get(position))
FirebaseClass.PRIVATE_HIRE_VEHICLE_LICENSE -> return archiveObject?.ph_car?.get(mKeys[position])
else -> return mKeys[position]
}
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View, parent: ViewGroup): View {
var listItemView: View = convertView
if (listItemView == null) {
if (((archiveString == FirebaseClass.PRIVATE_HIRE_FIREBASE) || (archiveString == FirebaseClass.DRIVERS_LICENSE_FIREBASE) || (archiveString == FirebaseClass.MOT_FIREBASE) || (archiveString == FirebaseClass.LOG_BOOK_FIREBASE) || (archiveString == FirebaseClass.PRIVATE_HIRE_VEHICLE_LICENSE))) {
listItemView = LayoutInflater.from(context).inflate(
R.layout.archive_license_item, parent, false
)
val imageView: ImageView = listItemView.findViewById(R.id.image_archive)
dateArchivedText = listItemView.findViewById(R.id.date_archived)
val expiryHolder: LinearLayout = listItemView.findViewById(R.id.expiry_view)
val fieldTwo: LinearLayout = listItemView.findViewById(R.id.field_two_view)
val expiryText: TextView = listItemView.findViewById(R.id.exp_text)
val fiewTwoLable: TextView = listItemView.findViewById(R.id.field_two)
val fieldTwoText: TextView = listItemView.findViewById(R.id.field_two_text)
when (archiveString) {
// FirebaseClass.PRIVATE_HIRE_FIREBASE -> {
// expiryHolder.visibility = View.VISIBLE
// fieldTwo.visibility = View.VISIBLE
// val privateHireObject: PrivateHireObject =
// getItem(position) as PrivateHireObject
// Picasso.get().load(privateHireObject.phImageString)
// .placeholder(R.drawable.choice_img)
// .into(imageView)
// dateString(position)
// expiryText.text = privateHireObject.phExpiry
// fiewTwoLable.text = "Private Hire License No.:"
// fieldTwoText.text = privateHireObject.phNumber
// }
// FirebaseClass.DRIVERS_LICENSE_FIREBASE -> {
// expiryHolder.visibility = View.VISIBLE
// fieldTwo.visibility = View.VISIBLE
// val driversLicenseObject: DriversLicenseObject =
// getItem(position) as DriversLicenseObject
// Picasso.get().load(driversLicenseObject.licenseImageString)
// .placeholder(R.drawable.choice_img)
// .into(imageView)
// dateString(position)
// expiryText.text = driversLicenseObject.licenseExpiry
// fiewTwoLable.text = "License No.:"
// fieldTwoText.text = driversLicenseObject.licenseNumber
// }
// FirebaseClass.MOT_FIREBASE -> {
// expiryHolder.visibility = View.VISIBLE
// fieldTwo.visibility = View.GONE
// val motObject: MotObject = getItem(position) as MotObject
// Picasso.get().load(motObject.motImageString)
// .placeholder(R.drawable.choice_img)
// .into(imageView)
// dateString(position)
// expiryText.text = motObject.motExpiry
// }
// FirebaseClass.LOG_BOOK_FIREBASE -> {
// expiryHolder.visibility = View.GONE
// fieldTwo.visibility = View.VISIBLE
// val logbookObject: LogbookObject = getItem(position) as LogbookObject
// Picasso.get().load(logbookObject.photoString)
// .into(MainActivity.loadImage(imageView))
// dateString(position)
// fiewTwoLable.text = "V5C No.:"
// fieldTwoText.text = logbookObject.v5cnumber
// }
// FirebaseClass.PRIVATE_HIRE_VEHICLE_LICENSE -> {
// expiryHolder.visibility = View.VISIBLE
// fieldTwo.visibility = View.VISIBLE
// val privateHireVehicleObject: PrivateHireVehicleObject =
// getItem(position) as PrivateHireVehicleObject
// Picasso.get().load(privateHireVehicleObject.phCarImageString)
// .into(MainActivity.loadImage(imageView))
// dateString(position)
// expiryText.text = privateHireVehicleObject.phCarExpiry
// fiewTwoLable.text = "Private Hire Vehicle License No.:"
// fieldTwoText.text = privateHireVehicleObject.phCarNumber
// }
}
} else if ((archiveString == FirebaseClass.INSURANCE_FIREBASE)) {
listItemView = LayoutInflater.from(context).inflate(
R.layout.archive_insurance_item, parent, false
)
val holder: View = listItemView.findViewById(R.id.image_pager)
val swiperClass: ImageSwiperClass = ImageSwiperClass(context, holder)
// swiperClass.hideDelete();
listItemView.findViewById<View>(R.id.delete).visibility = View.GONE
// holder.findViewById(R.id.delete).setVisibility(View.INVISIBLE);
dateArchivedText = listItemView.findViewById(R.id.date_archived)
dateString(position)
val expiryText: TextView = listItemView.findViewById(R.id.exp_text)
val fieldTwoText: TextView = listItemView.findViewById(R.id.archive_insurer)
val insuranceObject: InsuranceObject = getItem(position) as InsuranceObject
// swiperClass.reinstantiateList(insuranceObject.photoStrings)
expiryText.text = insuranceObject.expiryDate
fieldTwoText.text = insuranceObject.insurerName
} else if ((archiveString == FirebaseClass.VEHICLE_DETAILS_FIREBASE)) {
listItemView = LayoutInflater.from(context).inflate(
R.layout.archive_vehicle_item, parent, false
)
dateArchivedText = listItemView.findViewById(R.id.date_archived)
dateString(position)
val numberPlate: TextView = listItemView.findViewById(R.id.number_plate)
val keeperName: TextView = listItemView.findViewById(R.id.keeper_name)
val keeperAddress: TextView = listItemView.findViewById(R.id.keeper_address)
val carText: TextView = listItemView.findViewById(R.id.car_text_arch)
val carColour: TextView = listItemView.findViewById(R.id.car_colour)
val carSeized: TextView = listItemView.findViewById(R.id.seized_checkbox)
val startDate: TextView = listItemView.findViewById(R.id.first_date)
val vehicleProfileObject: VehicleProfileObject =
getItem(position) as VehicleProfileObject
numberPlate.text = vehicleProfileObject.reg
keeperName.text = vehicleProfileObject.keeperName
keeperAddress.text = vehicleProfileObject.keeperAddress + "\n" + vehicleProfileObject.keeperPostCode
carText.text = vehicleProfileObject.make + " " + vehicleProfileObject.model
carColour.text = vehicleProfileObject.colour
val s: String
if (vehicleProfileObject.isSeized) {
s = "Yes"
} else {
s = "No"
}
carSeized.text = s
startDate.text = vehicleProfileObject.startDate
}
}
return listItemView
}
private fun dateString(position: Int) {
var success: Boolean = true
try {
dateArchivedText!!.text = mKeys[position].convertDateStringDatePattern("yyyyMMdd_HHmmss", "dd/MM/yyyy")
} catch (e: ParseException) {
e.printStackTrace()
success = false
} finally {
if (!success) {
dateArchivedText!!.text = mKeys.get(position).substring(0, 8)
}
}
}
companion object {
private val TAG: String = "ArchiveObjectListAdapte"
}
init {
archiveObject?.apply {
val map = when (archiveString) {
FirebaseClass.PRIVATE_HIRE_FIREBASE -> private_hire
FirebaseClass.DRIVERS_LICENSE_FIREBASE -> driver_license
FirebaseClass.VEHICLE_DETAILS_FIREBASE -> vehicle_details
FirebaseClass.MOT_FIREBASE -> mot_details
FirebaseClass.INSURANCE_FIREBASE -> insurance_details
FirebaseClass.LOG_BOOK_FIREBASE -> log_book
FirebaseClass.PRIVATE_HIRE_VEHICLE_LICENSE -> ph_car
else -> null
}
setUp(map)
}
}
private fun setUp(map: HashMap<String,*>?){
size = map?.size ?: 0
map?.keys?.toTypedArray()?.let{
mKeys = it
}
}
}

View File

@@ -1,87 +0,0 @@
package h_mal.appttude.com.driver.Global
import h_mal.appttude.com.driver.Objects.ApprovalsObject
import h_mal.appttude.com.driver.Objects.WholeDriverObject
import h_mal.appttude.com.driver.R
class ApprovalsClass {
fun getOverApprovalStatusCode(wholeDriverObject: WholeDriverObject?): Int {
if (wholeDriverObject!!.approvalsObject != null) {
val approvalsObject: ApprovalsObject = wholeDriverObject!!.approvalsObject!!
val ints: IntArray = intArrayOf(
approvalsObject.driver_details_approval,
approvalsObject.driver_license_approval,
approvalsObject.private_hire_approval,
approvalsObject.vehicle_details_approval,
approvalsObject.insurance_details_approval,
approvalsObject.mot_details_approval,
approvalsObject.log_book_approval,
approvalsObject.ph_car_approval
)
return setImageResource(mode(ints))
}
return setImageResource(FirebaseClass.NO_DATE_PRESENT)
}
fun setStatusCode(userId: String?, approvalNameString: String, status: Int) {
// if (!(approvalNameString == "")) {
// MainActivity.mDatabase!!.child(FirebaseClass.USER_FIREBASE)
// .child((userId)!!).child(FirebaseClass.USER_APPROVALS)
// .child(approvalNameString)
// .setValue(status).addOnCompleteListener { task ->
// if (task.isSuccessful) {
// } else {
// }
// }
// }
}
fun setImageResource(statusCode: Int): Int {
val imageResource: Int
when (statusCode) {
FirebaseClass.APPROVAL_PENDING -> imageResource = R.drawable.pending
FirebaseClass.APPROVAL_DENIED -> imageResource = R.drawable.denied
FirebaseClass.APPROVED -> imageResource = R.drawable.approved
else -> imageResource = R.drawable.zero
}
return imageResource
}
companion object {
fun mode(array: IntArray): Int {
var mode: Int = array.get(0)
var maxCount: Int = 0
if (matchedArray(array, 3)) {
return 3
} else if (matchedArray(array, 0)) {
return 0
} else {
for (i in array.indices) {
val value: Int = array.get(i)
var count: Int = 1
for (j in array.indices) {
if (array.get(j) == value) count++
if (count > maxCount) {
mode = value
maxCount = count
}
}
}
if (mode == 3) {
return 1
}
}
return mode
}
private fun matchedArray(array: IntArray, match: Int): Boolean {
for (i: Int in array) {
if (i != match) {
return false
}
}
return true
}
}
}

View File

@@ -1,70 +0,0 @@
package h_mal.appttude.com.driver.Global
import android.app.AlertDialog
import android.content.Context
import android.os.Bundle
import androidx.fragment.app.Fragment
import h_mal.appttude.com.driver.utils.UPLOAD_NEW
class ArchiveClass {
fun archiveRecord(UID: String?, item: String?, `object`: Any?) {
// val toPath: DatabaseReference =
// MainActivity.mDatabase!!.child(FirebaseClass.USER_FIREBASE).child(
// (UID)!!
// )
// .child(FirebaseClass.ARCHIVE_FIREBASE).child((item)!!)
// toPath.child(MainActivity.dateTimeStamp).setValue(`object`)
// .addOnCompleteListener { task ->
// if (task.isSuccessful) {
// Log.i(TAG, "onComplete: archive successful")
// } else {
// Log.i(TAG, "onComplete: archive unsuccessful")
// }
// }
}
fun openDialogArchive(context: Context?, `object`: Any?, fragment: Fragment) {
if (`object` == null) {
// executeFragment(fragment)
} else {
val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder.setMessage("Do you want to View/Edit or Upload new?")
.setPositiveButton("View/Edit"
) { _, _ ->
// executeFragment(fragment)
}
.setNegativeButton("Upload New"
) { _, _ ->
val bundle = Bundle()
bundle.putString(UPLOAD_NEW, "Yes")
fragment.arguments = bundle
// executeFragment(fragment)
}
.create().show()
}
}
fun openDialogArchive(context: Context?, `object`: Any?, user: String?, fragment: Fragment?) {
val bundle: Bundle = Bundle()
bundle.putString("user_id", user)
fragment!!.arguments = bundle
if (`object` == null) {
// executeFragment(fragment)
} else {
val builder: AlertDialog.Builder = AlertDialog.Builder(context)
builder.setMessage("Do you want to View/Edit or Upload new?")
.setPositiveButton("View/Edit"
) { _, _ ->
// executeFragment(fragment)
}
.setNegativeButton("Upload New"
) { _, _ ->
bundle.putString(UPLOAD_NEW, "Yes")
// executeFragment(fragment)
}
.create().show()
}
}
}

View File

@@ -1,71 +0,0 @@
package h_mal.appttude.com.driver.Global
import android.content.Context
import android.net.Uri
class FirebaseClass constructor(var context: Context?, var filePath: Uri?, var delegate: Response) {
open interface Response {
fun processFinish(output: Uri?)
}
fun uploadImage(path: String, name: String) {
// if (filePath != null) {
// val progressDialog: ProgressDialog = ProgressDialog(context)
// progressDialog.setTitle("Uploading...")
// progressDialog.show()
// val ref: StorageReference = MainActivity.storageReference!!.child(
// ("images/" + MainActivity.auth!!.currentUser!!
// .uid + "/" + path
// + "/" + name)
// )
// val uploadTask: UploadTask = ref.putFile(filePath!!)
// uploadTask.addOnProgressListener { taskSnapshot ->
// val progress: Double =
// (100.0 * taskSnapshot.bytesTransferred / taskSnapshot
// .totalByteCount)
// progressDialog.setMessage("Uploaded " + progress.toInt() + "%")
// }.continueWithTask { task ->
// if (!task.isSuccessful) {
// throw (task.exception)!!
// }
//
// // Continue with the task to get the download URL
// ref.downloadUrl
// }.addOnCompleteListener { task ->
// if (task.isSuccessful) {
// delegate.processFinish(task.result)
// progressDialog.dismiss()
// context?.displayToast("Uploaded Successfully")
// println("onComplete: uploaded Successful uri: " + task.result)
// } else {
// delegate.processFinish(null)
// progressDialog.dismiss()
// context?.displayToast("Uploaded Successfully")
// }
// }
// }
}
companion object {
val USER_FIREBASE: String = "user"
val DRIVER_FIREBASE: String = "driver_profile"
val DRIVER_DETAILS_FIREBASE: String = "driver_details"
val PRIVATE_HIRE_FIREBASE: String = "private_hire"
val DRIVERS_LICENSE_FIREBASE: String = "driver_license"
val DRIVER_STATUS: String = "driver_status"
val USER_APPROVALS: String = "approvalsObject"
val APPROVAL_CONSTANT: String = "_approval"
val ARCHIVE_FIREBASE: String = "archive"
val DRIVER_NUMBER: String = "driver_number"
val VEHICLE_FIREBASE: String = "vehicle_profile"
val MOT_FIREBASE: String = "mot_details"
val VEHICLE_DETAILS_FIREBASE: String = "vehicle_details"
val INSURANCE_FIREBASE: String = "insurance_details"
val LOG_BOOK_FIREBASE: String = "log_book"
val PRIVATE_HIRE_VEHICLE_LICENSE: String = "private_hire_vehicle"
val NO_DATE_PRESENT: Int = 0
val APPROVAL_PENDING: Int = 1
val APPROVAL_DENIED: Int = 2
val APPROVED: Int = 3
}
}

View File

@@ -1,129 +0,0 @@
package h_mal.appttude.com.driver.Global
import android.Manifest
import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.pm.PackageManager
import android.icu.text.SimpleDateFormat
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore
import android.widget.Button
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.FileProvider
import androidx.fragment.app.Fragment
import h_mal.appttude.com.driver.R
import java.io.File
import java.util.*
class ImageSelectorDialog : Dialog {
private val TAG: String = this.javaClass.simpleName
private var saveFileName: String
var fragment: Fragment? = null
constructor(context: Context) : super(context) {
saveFileName = "default_name"
}
constructor(context: Context, themeResId: Int) : super(context, themeResId) {
saveFileName = "default_name"
}
protected constructor(
context: Context,
cancelable: Boolean,
cancelListener: DialogInterface.OnCancelListener?
) : super(context, cancelable, cancelListener) {
saveFileName = "default_name"
}
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setContentView(R.layout.address_dialog)
//check if we have we have storage rights
val permissionPic: Int = ActivityCompat.checkSelfPermission(
context,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
val permissionCam: Int =
ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
// fragment = MainActivity.mainFragmentManager.fragments[0]
val upload: Button = findViewById(R.id.upload)
val takePic: Button = findViewById(R.id.take_pic)
upload.setOnClickListener {
if (permissionPic == PackageManager.PERMISSION_GRANTED) {
chooseImage()
} else {
Toast.makeText(context, "Storage permissions required", Toast.LENGTH_SHORT)
.show()
ActivityCompat.requestPermissions(
(fragment!!.requireActivity()),
arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
STORAGE_PERMISSION_CODE
)
}
dismiss()
}
takePic.setOnClickListener {
if (permissionCam == PackageManager.PERMISSION_GRANTED) {
val cameraIntent: Intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
val file: File = createFile()
photoURI = Uri.fromFile(file)
val imageUri: Uri = FileProvider.getUriForFile(
context,
"h_mal.appttude.com.driver",
file
)
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri)
fragment!!.startActivityForResult(cameraIntent, CAMERA_REQUEST)
} else {
Toast.makeText(context, "Camera Permissions required", Toast.LENGTH_SHORT)
.show()
ActivityCompat.requestPermissions(
(fragment!!.requireActivity()), arrayOf(Manifest.permission.CAMERA),
MY_CAMERA_PERMISSION_CODE
)
}
dismiss()
}
}
fun setImageName(saveFileName: String) {
this.saveFileName = saveFileName
}
private fun createFile(): File {
//create directory
val root: File = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
//create file
val sdf: SimpleDateFormat = SimpleDateFormat("yyyyMMdd_HHmm")
val currentDateandTime: String = sdf.format(Date())
val fname: String = saveFileName + currentDateandTime
val image: File = File(root, fname)
return image
}
private fun chooseImage() {
val intent: Intent = Intent()
intent.type = "image/*"
intent.action = Intent.ACTION_GET_CONTENT
fragment!!.startActivityForResult(
Intent.createChooser(intent, "Select Picture"),
PICK_IMAGE_REQUEST
)
}
companion object {
val PICK_IMAGE_REQUEST: Int = 71
val CAMERA_REQUEST: Int = 1888
val MY_CAMERA_PERMISSION_CODE: Int = 100
val STORAGE_PERMISSION_CODE: Int = 101
var photoURI: Uri? = null
}
}

View File

@@ -1,159 +0,0 @@
package h_mal.appttude.com.driver.Global
import android.Manifest
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.net.Uri
import android.os.Environment
import android.provider.MediaStore
import android.view.View
import android.widget.ImageView
import android.widget.Toast
import androidx.core.app.ActivityCompat
import h_mal.appttude.com.driver.utils.DateUtils.getDateStamp
import h_mal.appttude.com.driver.utils.DateUtils.getDateTimeStamp
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
class ImageSelectorResults // public FilepathResponse delegate;
{
lateinit var activity: Activity
interface FilepathResponse {
fun processFinish(output: Uri?)
}
fun Results(
activity: Activity, requestCode: Int, resultCode: Int, data: Intent?, filePath: Uri?,
imageView: ImageView?, delegate: FilepathResponse
) {
var filePath: Uri? = filePath
this.activity = activity
if ((requestCode == ImageSelectorDialog.PICK_IMAGE_REQUEST) && (resultCode == Activity.RESULT_OK
) && (data != null) && (data.data != null)
) {
val uri = data.data
var bitmap: Bitmap? = null
try {
bitmap =
MediaStore.Images.Media.getBitmap(activity.contentResolver, uri)
if (imageView!!.visibility != View.VISIBLE) {
imageView.visibility = View.VISIBLE
}
imageView.setImageBitmap(bitmap)
} catch (e: IOException) {
e.printStackTrace()
} finally {
if (bitmap != null) {
delegate.processFinish(uri)
}
}
}
if (requestCode == ImageSelectorDialog.CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
//check if we have we have storage rights
val permission: Int = ActivityCompat.checkSelfPermission(
(activity)!!,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
if (permission != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(activity, "Storage permissions not granted", Toast.LENGTH_SHORT)
.show()
return
} else {
try {
val f: File =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
val fname: String = "driver" + getDateStamp() + ".jpg"
val image = File(f, fname)
val fileOutputStream = FileOutputStream(image)
filePath = ImageSelectorDialog.photoURI
val bitmap: Bitmap = MediaStore.Images.Media
.getBitmap(
activity.contentResolver,
ImageSelectorDialog.photoURI
)
imageView!!.setImageBitmap(bitmap)
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream)
fileOutputStream.flush()
fileOutputStream.close()
galleryAddPic()
} catch (e: Exception) {
e.printStackTrace()
}
}
delegate.processFinish(filePath)
}
}
fun Results(
activity: Activity,
requestCode: Int,
resultCode: Int,
data: Intent?,
filePath: Uri?,
delegate: FilepathResponse
) {
var filePath: Uri? = filePath
this.activity = activity
if ((requestCode == ImageSelectorDialog.PICK_IMAGE_REQUEST) && (resultCode == Activity.RESULT_OK
) && (data != null) && (data.data != null)
) {
filePath = data.data
var bitmap: Bitmap? = null
try {
bitmap =
MediaStore.Images.Media.getBitmap(activity.contentResolver, filePath)
} catch (e: IOException) {
e.printStackTrace()
} finally {
if (bitmap != null) {
delegate.processFinish(filePath)
}
}
}
if (requestCode == ImageSelectorDialog.CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
//check if we have we have storage rights
val permission: Int = ActivityCompat.checkSelfPermission(
(activity),
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
if (permission != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(activity, "Storage permissions not granted", Toast.LENGTH_SHORT)
.show()
return
} else {
try {
val f: File =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
val fname: String = "driver" + getDateTimeStamp() + ".jpg"
val image: File = File(f, fname)
val fileOutputStream: FileOutputStream = FileOutputStream(image)
filePath = ImageSelectorDialog.photoURI
val bitmap: Bitmap = MediaStore.Images.Media
.getBitmap(
activity.contentResolver,
ImageSelectorDialog.photoURI
)
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream)
fileOutputStream.flush()
fileOutputStream.close()
galleryAddPic()
} catch (e: Exception) {
e.printStackTrace()
}
}
delegate.processFinish(filePath)
}
}
private fun galleryAddPic() {
val mediaScanIntent: Intent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val f: File = File(ImageSelectorDialog.photoURI!!.path)
val contentUri: Uri = Uri.fromFile(f)
mediaScanIntent.data = contentUri
activity.sendBroadcast(mediaScanIntent)
}
}

View File

@@ -1,159 +0,0 @@
package h_mal.appttude.com.driver.Global
import android.content.Context
import android.content.ContextWrapper
import android.view.View
import android.widget.ImageView
import h_mal.appttude.com.driver.R
class ImageSwiperClass(
private val context: Context?,
wholeView: View
) : ContextWrapper(context) {
private var left: ImageView = wholeView.findViewById(R.id.left)
private var right: ImageView = wholeView.findViewById(R.id.right)
var list: List<Any>? = null
// fun addLocalString(uris: List<Uri>) {
// list = uris
// }
//
// fun addFirebaseStrings(uris: List<String>) {
// list = uris
// }
//
// private var adapter: SlidingImageViewAdapter? = null
// lateinit var viewPager: ViewPager
//
//
// fun reinstantiateList(imageStrings: MutableList<String?>?) {
// this.imageStrings = imageStrings
// adapter = SlidingImageViewAdapter()
// viewPager.adapter = adapter
// setArrows()
// }
//
// fun hideDelete() {
// delete.hide()
// }
//
// private val leftClick: View.OnClickListener = View.OnClickListener {
// viewPager.currentItem = viewPager.currentItem - 1
// setArrows()
// }
// private val rightClick: View.OnClickListener = View.OnClickListener {
// viewPager.currentItem = viewPager.currentItem + 1
// setArrows()
// }
//
// private fun deleteDialog(position: Int) {
// val builder: AlertDialog.Builder = AlertDialog.Builder(context)
// builder.setMessage("Are you sure you want to delete?")
// .setPositiveButton(
// android.R.string.ok
// ) { _, _ ->
// imageStrings!!.removeAt(position)
// viewPager.adapter = adapter
// // adapter.notifyDataSetChanged();
// }
// .setNegativeButton(android.R.string.cancel, null)
// .create()
// .show()
// }
//
// private fun setArrows() {
// with(list) {
// when (list) {
// isNullOrEmpty() -> { }
// isNotEmpty() -> { }
//
// }
// }
//
// if (list?.isNotEmpty()) {
// //left arrow
// if (viewPager.currentItem > 0) {
// setAnimation(left, true)
// } else {
// setAnimation(left, false)
// }
//
// //right
// if (viewPager.currentItem == imageStrings!!.size - 1) {
// setAnimation(right, false)
// } else {
// setAnimation(right, true)
// }
// }
// if (imageStrings == null) {
// setAnimation(left, false)
// setAnimation(right, false)
// }
// }
//
// private fun setAnimation(view: ImageView, up: Boolean) {
// val start: Float
// val finish: Float
// if (up) {
// start = 0.2f
// finish = 1.0f
// } else {
// start = 1.0f
// finish = 0.2f
// }
// val animation1 = AlphaAnimation(start, finish)
// animation1.duration = 500
// animation1.fillAfter = true
// view.alpha = finish
// }
//
// internal inner class SlidingImageViewAdapter : PagerAdapter() {
//
// override fun getCount(): Int = list?.size ?: 0
//
// override fun destroyItem(container: ViewGroup, position: Int, item: Any) {
// container.removeView(item as View?)
// }
//
// override fun isViewFromObject(view: View, o: Any): Boolean = view == o
//
// override fun instantiateItem(container: ViewGroup, position: Int): Any {
// val pagerPic: View =
// LayoutInflater.from(context).inflate(R.layout.insurance_item, container, false)
// setArrows()
// if (imageStrings != null && imageStrings!!.size > 0) {
// mainImage = pagerPic.rootView.findViewById(R.id.main_image)
// Picasso.get().load(imageStrings!!.get(position))
// .placeholder(R.drawable.choice_img)
// .into(MainActivity.loadImage(mainImage))
// }
// container.addView(pagerPic, 0)
// return pagerPic
// }
// }
//
//
// init {
// left.setOnClickListener(leftClick)
// right.setOnClickListener(rightClick)
// viewPager = wholeView.findViewById(R.id.view_pager)
// delete = wholeView.findViewById(R.id.delete)
// viewPager.addOnPageChangeListener(object : OnPageChangeListener {
// override fun onPageScrolled(i: Int, v: Float, i1: Int) {
// val animation1: AlphaAnimation = AlphaAnimation(0.2f, 1.0f)
// animation1.duration = 200
// animation1.fillAfter = true
// delete.startAnimation(animation1)
// }
//
// override fun onPageSelected(i: Int) {
// setArrows()
// delete.setOnClickListener { deleteDialog(i) }
// }
//
// override fun onPageScrollStateChanged(i: Int) {}
// })
// }
}

View File

@@ -1,97 +0,0 @@
package h_mal.appttude.com.driver.Global
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.github.chrisbanes.photoview.PhotoView
import com.google.android.material.floatingactionbutton.FloatingActionButton
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.utils.DateUtils
import java.io.File
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException
class ImageViewClass {
fun open(bitmap: Bitmap?) {
Companion.bitmap = bitmap
// executeFragment(ImageViewerFragment())
}
class ImageViewerFragment : Fragment() {
private lateinit var viewer: View
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
viewer = inflater.inflate(R.layout.fragment_image_viewer, container, false)
val fab: FloatingActionButton = viewer.findViewById(R.id.download_pic)
if (bitmap != null) {
val photoView: PhotoView = viewer.findViewById(R.id.photo_view)
photoView.setImageBitmap(bitmap)
fab.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View) {
try {
downloadPic()
} catch (e: FileNotFoundException) {
e.printStackTrace()
}
}
})
}
return viewer
}
override fun onResume() {
super.onResume()
(activity as AppCompatActivity?)!!.supportActionBar!!.hide()
requireActivity().window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
}
override fun onStop() {
super.onStop()
(activity as AppCompatActivity?)!!.supportActionBar!!.show()
requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
}
@Throws(FileNotFoundException::class)
private fun downloadPic() {
val f: File =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
val fname: String = "driver" + DateUtils.getDateTimeStamp() + ".jpg"
val image: File = File(f, fname)
val fileOutputStream: FileOutputStream = FileOutputStream(image)
bitmap!!.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream)
try {
fileOutputStream.flush()
fileOutputStream.close()
val mediaScanIntent: Intent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val contentUri: Uri = Uri.fromFile(image)
mediaScanIntent.data = contentUri
requireActivity().sendBroadcast(mediaScanIntent)
} catch (e: IOException) {
e.printStackTrace()
}
}
}
companion object {
val IMAGE_VALUE: String = "image"
private var bitmap: Bitmap? = null
}
}

View File

@@ -1,115 +0,0 @@
package h_mal.appttude.com.driver.Global
import android.app.Activity
import android.app.AlertDialog
import android.content.DialogInterface
import android.widget.ImageView
class SetApprovalDialog constructor(
var statusCode: Int,
private val activity: Activity,
private val userId: String?,
position: Int,
private val imageView: ImageView
) {
private val groupNames: Array<String> = arrayOf("Pending", "Denied", "Approved")
private val approvalNameString: String
fun init() {
val checkedItem: Int
when (statusCode) {
FirebaseClass.APPROVAL_PENDING -> checkedItem = 0
FirebaseClass.APPROVAL_DENIED -> checkedItem = 1
FirebaseClass.APPROVED -> checkedItem = 2
else -> checkedItem = -1
}
val alertBuilder: AlertDialog.Builder = AlertDialog.Builder(
activity
)
alertBuilder.setSingleChoiceItems(groupNames, checkedItem, singleChoiceListener)
// .setPositiveButton(android.R.string.ok, submit);
alertBuilder.create().ownerActivity
alertBuilder.show()
}
var singleChoiceListener: DialogInterface.OnClickListener =
object : DialogInterface.OnClickListener {
override fun onClick(dialog: DialogInterface, which: Int) {
when (which) {
0 -> {
statusCode = FirebaseClass.APPROVAL_PENDING
publishStatuscode(statusCode, dialog)
return
}
1 -> {
statusCode = FirebaseClass.APPROVAL_DENIED
publishStatuscode(statusCode, dialog)
return
}
2 -> {
statusCode = FirebaseClass.APPROVED
publishStatuscode(statusCode, dialog)
return
}
}
}
}
private fun publishStatuscode(status: Int, dialog: DialogInterface) {
// if (!(approvalNameString == "")) {
// MainActivity.mDatabase!!.child(FirebaseClass.USER_FIREBASE).child(
// (userId)!!
// ).child(FirebaseClass.USER_APPROVALS).child(approvalNameString)
// .setValue(status).addOnCompleteListener { task ->
// if (task.isSuccessful) {
// Toast.makeText(activity, "Status change successful", Toast.LENGTH_SHORT)
// .show()
// imageView.setImageResource(
// MainActivity.approvalsClass!!.setImageResource(
// status
// )
// )
// dialog.dismiss()
// } else {
// Toast.makeText(
// activity,
// "Status change unsuccessful",
// Toast.LENGTH_SHORT
// ).show()
// }
//
// }
// } else {
// Toast.makeText(activity, "Could not push status", Toast.LENGTH_SHORT).show()
// }
}
private fun getElement(i: Int): String {
var element: String = ""
when (i) {
0 -> element =
FirebaseClass.DRIVER_DETAILS_FIREBASE + FirebaseClass.APPROVAL_CONSTANT
1 -> element =
FirebaseClass.DRIVERS_LICENSE_FIREBASE + FirebaseClass.APPROVAL_CONSTANT
2 -> element =
FirebaseClass.PRIVATE_HIRE_FIREBASE + FirebaseClass.APPROVAL_CONSTANT
3 -> element =
FirebaseClass.VEHICLE_DETAILS_FIREBASE + FirebaseClass.APPROVAL_CONSTANT
4 -> element =
FirebaseClass.INSURANCE_FIREBASE + FirebaseClass.APPROVAL_CONSTANT
5 -> element =
FirebaseClass.MOT_FIREBASE + FirebaseClass.APPROVAL_CONSTANT
6 -> element =
FirebaseClass.LOG_BOOK_FIREBASE + FirebaseClass.APPROVAL_CONSTANT
7 -> element =
FirebaseClass.PRIVATE_HIRE_VEHICLE_LICENSE + FirebaseClass.APPROVAL_CONSTANT
}
return element
}
init {
approvalNameString = getElement(position)
init()
}
}

View File

@@ -1,15 +0,0 @@
package h_mal.appttude.com.driver.Objects
class LogbookObject {
var photoString: String? = null
var v5cnumber: String? = null
constructor(photoString: String?, v5cnumber: String?) {
this.photoString = photoString
this.v5cnumber = v5cnumber
}
constructor()
}

View File

@@ -1,6 +0,0 @@
package h_mal.appttude.com.driver.data
enum class Roles(name: String) {
Driver("driver"),
SuperUser("super_user")
}

View File

@@ -1,31 +0,0 @@
package h_mal.appttude.com.driver.ui.driver
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.utils.navigateTo
import kotlinx.android.synthetic.main.fragment_home_driver.*
class HomeFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_home_driver, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
driver.setOnClickListener {
view.navigateTo(R.id.to_driverOverallFragment)
}
car.setOnClickListener {
view.navigateTo(R.id.to_vehicleOverallFragment)
}
}
}

View File

@@ -1,57 +0,0 @@
package h_mal.appttude.com.driver.ui.driver.driverprofile
import android.net.Uri
import android.os.Bundle
import android.view.View
import h_mal.appttude.com.driver.Global.DateDialog
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.model.DriversLicenseObject
import h_mal.appttude.com.driver.utils.setPicassoImage
import h_mal.appttude.com.driver.viewmodels.DriverLicenseViewModel
import kotlinx.android.synthetic.main.fragment_driver_license.*
class DriverLicenseFragment : DataSubmissionBaseFragment<DriverLicenseViewModel, DriversLicenseObject>() {
private val viewmodel: DriverLicenseViewModel by getFragmentViewModel()
override fun getViewModel(): DriverLicenseViewModel = viewmodel
override fun getLayoutId(): Int = R.layout.fragment_driver_license
override var model = DriversLicenseObject()
private var imageUri: Uri? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lic_expiry.apply {
setTextOnChange{ model.licenseExpiry = it }
setOnClickListener {
DateDialog(this)
}
}
lic_no.setTextOnChange{ model.licenseNumber = it }
upload_lic.setOnClickListener { openGalleryWithPermissionRequest() }
submit.setOnClickListener{ submit() }
}
override fun submit(){
validateEditTexts(lic_expiry,lic_no).takeIf { !it }?.let { return }
viewmodel.setDataInDatabase(model, imageUri)
}
override fun setFields(data: DriversLicenseObject) {
super.setFields(data)
driversli_img.setPicassoImage(data.licenseImageString)
lic_no.setText(data.licenseNumber)
lic_expiry.setText(data.licenseExpiry)
}
override fun onImageGalleryResult(imageUri: Uri?) {
super.onImageGalleryResult(imageUri)
this.imageUri = imageUri
driversli_img.setPicassoImage(imageUri)
}
}

View File

@@ -1,17 +0,0 @@
package h_mal.appttude.com.driver.update
import android.os.Bundle
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.BaseActivity
import h_mal.appttude.com.driver.viewmodels.UpdateUserViewModel
class UpdateActivity : BaseActivity<UpdateUserViewModel>() {
override val layoutId: Int = R.layout.update_activity
override fun getViewModel(): UpdateUserViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
createViewModel<UpdateUserViewModel>()
}
}

View File

@@ -1,35 +0,0 @@
package h_mal.appttude.com.driver.ui.user
import android.os.Bundle
import android.view.View
import androidx.fragment.app.activityViewModels
import com.google.firebase.auth.FirebaseUser
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.BaseFragment
import h_mal.appttude.com.driver.data.FirebaseCompletion
import h_mal.appttude.com.driver.utils.Coroutines.main
import h_mal.appttude.com.driver.utils.navigateTo
import h_mal.appttude.com.driver.viewmodels.UserViewModel
import kotlinx.coroutines.delay
class SplashScreenFragment : BaseFragment<UserViewModel>() {
private val userViewModel by activityViewModels<UserViewModel>()
override fun getViewModel(): UserViewModel = userViewModel
override fun getLayoutId(): Int = R.layout.fragment_splash_screen
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
userViewModel.splashscreenCheckUserIsLoggedIn()
}
override fun onSuccess(data: Any?) {
super.onSuccess(data)
when(data){
is FirebaseCompletion.Default -> view?.navigateTo(R.id.to_loginFragment)
}
}
}

View File

@@ -1,104 +0,0 @@
package h_mal.appttude.com.driver.utils
import android.app.Activity
import android.content.Context
import android.content.res.Resources
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.annotation.DrawableRes
import androidx.appcompat.widget.SearchView
import androidx.fragment.app.Fragment
import com.squareup.picasso.Picasso
import h_mal.appttude.com.driver.R
fun View.show() {
this.visibility = View.VISIBLE
}
fun View.hide() {
this.visibility = View.GONE
}
fun Context.displayToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
fun Fragment.displayToast(message: String) {
requireContext().displayToast(message)
}
fun EditText.setEnterPressedListener(action: () -> Unit) {
setOnEditorActionListener(TextView.OnEditorActionListener { _, id, _ ->
if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) {
action()
return@OnEditorActionListener true
}
false
})
}
fun ImageView.setPicassoImage(
url: String?,
@DrawableRes placeholderRes: Int = R.drawable.choice_img_round
) {
val creator = Picasso.get()
.load(url)
viewTreeObserver.addOnPreDrawListener {
creator.resize(width, height)
true
}
creator
.placeholder(placeholderRes)
.into(this)
}
fun ImageView.setPicassoImage(
url: Uri?,
@DrawableRes placeholderRes: Int = R.drawable.choice_img_round
) {
val creator = Picasso.get()
.load(url)
viewTreeObserver.addOnPreDrawListener {
creator.resize(width, height)
true
}
creator
.placeholder(placeholderRes)
.into(this)
}
fun ViewGroup.generateView(layoutId: Int): View = LayoutInflater
.from(context)
.inflate(layoutId, this, false)
fun Int.dpToPx(): Int = (this * Resources.getSystem().displayMetrics.density).toInt()
fun SearchView.onSubmitListener(searchSubmit: (String) -> Unit) {
this.setOnQueryTextListener(object :
SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(s: String): Boolean {
searchSubmit.invoke(s)
return true
}
override fun onQueryTextChange(s: String): Boolean {
return true
}
})
}
fun Fragment.hideKeyboard() {
val imm = context?.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager?
imm?.hideSoftInputFromWindow(view?.windowToken, 0)
}
fun EditText.extractString(): String = text.toString().trim()

View File

@@ -1,75 +0,0 @@
package h_mal.appttude.com.driver.viewmodels
import android.net.Uri
import h_mal.appttude.com.driver.base.BaseViewModel
import h_mal.appttude.com.driver.data.FirebaseAuthentication
import h_mal.appttude.com.driver.data.FirebaseCompletion
import h_mal.appttude.com.driver.data.FirebaseStorageSource
import h_mal.appttude.com.driver.utils.Coroutines.io
import kotlinx.coroutines.tasks.await
import java.io.IOException
class UpdateUserViewModel(
private val auth: FirebaseAuthentication,
private val storage: FirebaseStorageSource
) : BaseViewModel() {
fun updateEmail(oldEmail: String, password: String, newEmail: String) = io {
doTryOperation("Failed to update email"){
auth.reauthenticate(oldEmail, password)?.await()
val complete = auth.updateEmail(newEmail)?.await()
complete?.postResult("Email address")
}
}
fun updatePassword(oldEmail: String, password: String, newPassword: String) = io {
doTryOperation("Failed to update password"){
auth.reauthenticate(oldEmail, password)?.await()
val complete = auth.updatePassword(newPassword)?.await()
complete?.postResult("Password")
}
}
fun updateProfile(name: String?, localImageUri: Uri?) = io {
if (name.isNullOrBlank() && localImageUri == null) return@io
doTryOperation("Failed to update User"){
val profilePicUrl = localImageUri?.let {
val storageRef = storage.profileImageStorageRef(auth.getUid()!!)
storage.uploadImage(it, storageRef, "profile_pic")
}
val complete = auth.updateProfile(name, profilePicUrl)?.await()
complete.postResult("Profile updated")
}
}
fun deleteProfile(oldEmail: String, password: String) = io {
doTryOperation("Failed to delete profile"){
auth.reauthenticate(oldEmail, password)?.await()
val complete = auth.deleteProfile()?.await()
complete?.let {
onSuccess(FirebaseCompletion.ProfileDeleted("Profile deleted"))
return@doTryOperation
}
throw IOException("Failed to complete")
}
}
fun getUser(): Boolean {
return auth.getUser()?.let {
onSuccess(it)
true
} ?: false
}
private fun Void?.postResult(section: String){
this?.let {
onSuccess(FirebaseCompletion.Changed("$section has been updated"))
return
}
throw IOException("Failed to complete")
}
}

View File

@@ -0,0 +1,24 @@
package h_mal.appttude.com.espresso
import androidx.test.espresso.idling.CountingIdlingResource
object IdlingResourceClass {
private val CLASS_NAME = "IdlingResourceClass"
private const val RESOURCE = "GLOBAL"
@JvmField val countingIdlingResource = CountingIdlingResource(RESOURCE)
fun increment() {
if (!countingIdlingResource.isIdleNow) {
countingIdlingResource.increment()
}
}
fun decrement() {
if (countingIdlingResource.isIdleNow) {
countingIdlingResource.decrement()
}
}
}

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.model
package h_mal.appttude.com.model

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.model
package h_mal.appttude.com.model
data class DriversLicenseObject(

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.Objects
package h_mal.appttude.com.model

View File

@@ -0,0 +1,8 @@
package h_mal.appttude.com.model
data class LogbookObject(
var photoString: String? = null,
var v5cnumber: String? = null
)

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.driver.model
package h_mal.appttude.com.model

Some files were not shown because too many files have changed in this diff Show More