- flavours compartmentalised

Took 10 hours 11 minutes
This commit is contained in:
2023-03-28 21:38:33 +01:00
parent f87d986849
commit 16433d0852
130 changed files with 814 additions and 706 deletions

View File

@@ -14,6 +14,11 @@ orbs:
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:
# Parameters used for determining
parameters:
flavour:
type: string
default: "Driver"
# These next lines define the Android machine image executor.
# See: https://circleci.com/docs/2.0/executor-types/
executor:
@@ -29,14 +34,13 @@ jobs:
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
test-command: ./gradlew test<< parameters.flavour >>DebugUnitTest --continue
# Install Firebase tools needed for firebase emulator
- run:
name: Install firebase tools
@@ -50,15 +54,10 @@ jobs:
background: true
# Then start the emulator and run the Instrumentation tests!
- android/start-emulator-and-run-tests:
post-emulator-launch-assemble-command: ./gradlew assembleDriverDebugAndroidTest
test-command: ./gradlew connectedDriverDebugAndroidTest
post-emulator-launch-assemble-command: ./gradlew assemble<< parameters.flavour >>DebugAndroidTest
test-command: ./gradlew connected<< parameters.flavour >>DebugAndroidTest
system-image: system-images;android-25;google_apis;x86
# And finally run the release build
# - run:
# name: Assemble release build
# command: |
# ./gradlew assembleDriverRelease
# Then publish the artifacts of the Instrumentation tests!
# store test reports
- store_artifacts:
path: app/build/reports/androidTests/connected
destination: reports
@@ -74,11 +73,58 @@ jobs:
# Then publish the results of the Instrumentation tests!
- store_test_results:
path: app/build/outputs/androidTest-results/connected
# Assemble
assemble-and-release:
# Parameters used for determining
parameters:
flavour:
type: string
default: ""
executor:
name: android/android-machine
steps:
- run:
name: Setup variables for release
command: |
echo "$RELEASE_KEYSTORE_BASE64" | base64 --decode > "android/app/release_keystore.jks"
echo "$GOOGLE_PLAY_KEY" > "android/playstore.json"
# 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.
version: 2
all-branch:
jobs:
- build-and-test
- build-and-test:
flavour: Driver
filters:
branches:
ignore:
- main_driver
- main_admin
release-driver:
jobs:
- build-and-test:
flavour: Driver
- assemble-and-release:
flavour: "Driver"
filters:
branches:
only: main_driver
requires:
- build-and-test
release-admin:
jobs:
- build-and-test:
flavour: Admin
- assemble-and-release:
flavour: Admin
filters:
branches:
only: main_admin
requires:
- build-and-test

View File

@@ -14,7 +14,7 @@ def relStoreFile = System.getenv("RELEASE_KEYSTORE")
android {
compileSdkVersion 31
defaultConfig {
applicationId "h_mal.appttude.com"
applicationId "h_mal.appttude.com.driver"
minSdkVersion 24
targetSdkVersion 31
versionCode 6
@@ -47,7 +47,7 @@ android {
buildTypes {
release {
// signingConfig signingConfigs.release
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
@@ -66,12 +66,11 @@ android {
flavorDimensions "Default"
productFlavors {
driver {
applicationIdSuffix ".driver"
versionCode 6
versionName "1.0.5"
}
admin {
applicationIdSuffix ".driverAdmin"
applicationIdSuffix ".admin"
versionCode 4
versionName "0.0.5"
}
@@ -84,7 +83,7 @@ android {
}
admin {
manifest {
srcFile 'src/driver_admin/AndroidManifest.xml'
srcFile 'src/admin/AndroidManifest.xml'
}
}
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round">
</application>
</manifest>

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.objects
package h_mal.appttude.com.driver.admin.objects
class ApprovalsObject {
@@ -29,6 +29,6 @@ class ApprovalsObject {
this.mot_details_approval = mot_details_approval
this.insurance_details_approval = insurance_details_approval
this.log_book_approval = log_book_approval
ph_car_approval = private_hire_vehicle_approval
this.ph_car_approval = private_hire_vehicle_approval
}
}

View File

@@ -0,0 +1,33 @@
package h_mal.appttude.com.driver.admin.objects
import h_mal.appttude.com.driver.model.*
import java.util.*
class ArchiveObject {
var driver_license: HashMap<String, DriversLicense>? = null
var private_hire: HashMap<String, PrivateHireLicense>? = null
var vehicle_details: HashMap<String, VehicleProfile>? = null
var insurance_details: HashMap<String, Insurance>? = null
var mot_details: HashMap<String, Mot>? = null
var log_book: HashMap<String, Logbook>? = null
var ph_car: HashMap<String, PrivateHireVehicle>? = null
constructor()
constructor(
driver_license: HashMap<String, DriversLicense>?,
private_hire: HashMap<String, PrivateHireLicense>?,
vehicle_details: HashMap<String, VehicleProfile>?,
insurance_details: HashMap<String, Insurance>?,
mot_details: HashMap<String, Mot>?,
log_book: HashMap<String, Logbook>?,
private_hire_vehicle: HashMap<String, PrivateHireVehicle>?
) {
this.driver_license = driver_license
this.private_hire = private_hire
this.vehicle_details = vehicle_details
this.insurance_details = insurance_details
this.mot_details = mot_details
this.log_book = log_book
this.ph_car = private_hire_vehicle
}
}

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.objects
package h_mal.appttude.com.driver.admin.objects
class UserObject {

View File

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

View File

@@ -0,0 +1,24 @@
package h_mal.appttude.com.driver.admin.objects.wholeObject
import h_mal.appttude.com.driver.model.DriverProfile
import h_mal.appttude.com.driver.model.DriversLicense
import h_mal.appttude.com.driver.model.PrivateHireLicense
class DriverProfile {
var driver_profile: DriverProfile? = null
var driver_license: DriversLicense? = null
var private_hire: PrivateHireLicense? = null
constructor(
driver_profile: DriverProfile?,
driver_license: DriversLicense?,
private_hire: PrivateHireLicense?
) {
this.driver_profile = driver_profile
this.driver_license = driver_license
this.private_hire = private_hire
}
constructor()
}

View File

@@ -1,8 +1,8 @@
package h_mal.appttude.com.objects.wholeObject
package h_mal.appttude.com.driver.admin.objects.wholeObject
import android.os.Parcel
import android.os.Parcelable
import h_mal.appttude.com.objects.WholeDriverObject
import h_mal.appttude.com.driver.admin.objects.WholeDriverObject
class MappedObject : Parcelable {

View File

@@ -0,0 +1,31 @@
package h_mal.appttude.com.driver.admin.objects.wholeObject
import h_mal.appttude.com.driver.model.Insurance
import h_mal.appttude.com.driver.model.Logbook
import h_mal.appttude.com.driver.model.PrivateHireVehicle
import h_mal.appttude.com.driver.model.Mot
import h_mal.appttude.com.driver.model.VehicleProfile
class VehicleProfile {
var insurance_details: Insurance? = null
var log_book: Logbook? = null
var mot_details: Mot? = null
var vehicle_details: VehicleProfile? = null
var privateHireVehicle: PrivateHireVehicle? = null
constructor()
constructor(
insurance_details: Insurance?,
log_book: Logbook?,
mot_details: Mot?,
vehicle_details: VehicleProfile?,
private_hire_vehicle: PrivateHireVehicle?
) {
this.insurance_details = insurance_details
this.log_book = log_book
this.mot_details = mot_details
this.vehicle_details = vehicle_details
this.privateHireVehicle = private_hire_vehicle
}
}

View File

@@ -1,12 +1,12 @@
package h_mal.appttude.com.ui
package h_mal.appttude.com.driver.ui
import android.app.Activity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import h_mal.appttude.com.objects.wholeObject.MappedObject
import h_mal.appttude.com.R
import h_mal.appttude.com.driver.admin.objects.wholeObject.MappedObject
import h_mal.appttude.com.driver.R
class ApprovalListAdapter(

View File

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

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.ui
package h_mal.appttude.com.driver.ui
import android.app.AlertDialog
import android.content.DialogInterface
@@ -8,14 +8,14 @@ import android.util.Log
import android.view.*
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
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.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 h_mal.appttude.com.driver.admin.objects.WholeDriverObject
import h_mal.appttude.com.driver.admin.objects.wholeObject.MappedObject
import h_mal.appttude.com.driver.R
import java.io.IOException
import java.util.*
@@ -42,7 +42,7 @@ class HomeSuperUserFragment : Fragment() {
// Inflate the layout for this fragment
val view: View = inflater.inflate(R.layout.fragment_home_super_user, container, false)
recycler_view.apply {
view.findViewById<RecyclerView>(R.id.recycler_view).apply {
layoutManager = LinearLayoutManager(context)
recyclerViewAdapter = RecyclerViewAdapter(context, mappedObjectList)
adapter = recyclerViewAdapter

View File

@@ -0,0 +1,50 @@
package h_mal.appttude.com.driver.ui
import android.os.Bundle
import com.google.firebase.auth.FirebaseUser
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.DrawerActivity
import h_mal.appttude.com.driver.databinding.ActivityMainBinding
import h_mal.appttude.com.driver.databinding.NavHeaderMainBinding
import h_mal.appttude.com.driver.utils.setGlideImage
import h_mal.appttude.com.driver.viewmodels.MainViewModel
class MainActivity : DrawerActivity<MainViewModel, ActivityMainBinding>() {
override val containerId: Int = R.id.container
override val drawerLayoutId: Int = R.id.drawer_layout
override val toolbarId: Int = R.id.toolbar
override val navViewId: Int = R.id.nav_view
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.getUserDetails()
setupLogoutInDrawer()
}
override fun onSuccess(data: Any?) {
super.onSuccess(data)
when (data) {
is FirebaseUser -> {
setupDrawer(data)
}
}
}
private fun setupDrawer(user: FirebaseUser) {
NavHeaderMainBinding.inflate(layoutInflater).apply {
driverEmail.text = user.email
driverName.text = user.displayName
profileImage.setGlideImage(user.photoUrl)
}
}
private fun setupLogoutInDrawer() {
binding.logout.setOnClickListener {
viewModel.logOut()
}
}
}

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.ui
package h_mal.appttude.com.driver.ui
import android.app.AlertDialog
import android.content.Context
@@ -12,9 +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.objects.UserObject
import h_mal.appttude.com.objects.wholeObject.MappedObject
import h_mal.appttude.com.R
import h_mal.appttude.com.driver.admin.objects.UserObject
import h_mal.appttude.com.driver.admin.objects.wholeObject.MappedObject
import h_mal.appttude.com.driver.R
class RecyclerViewAdapter constructor(var context: Context?, var objects: List<MappedObject>?) :

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.ui
package h_mal.appttude.com.driver.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.objects.wholeObject.MappedObject
import h_mal.appttude.com.R
import h_mal.appttude.com.driver.admin.objects.wholeObject.MappedObject
import h_mal.appttude.com.driver.R
class UserMainFragment : Fragment() {

View File

@@ -1,33 +0,0 @@
package h_mal.appttude.com.objects
import h_mal.appttude.com.model.*
import java.util.*
class ArchiveObject {
var driver_license: HashMap<String, DriversLicenseObject>? = null
var private_hire: HashMap<String, PrivateHireObject>? = null
var vehicle_details: HashMap<String, VehicleProfileObject>? = null
var insurance_details: HashMap<String, InsuranceObject>? = null
var mot_details: HashMap<String, MotObject>? = null
var log_book: HashMap<String, LogbookObject>? = null
var ph_car: HashMap<String, PrivateHireVehicleObject>? = null
constructor()
constructor(
driver_license: HashMap<String, DriversLicenseObject>?,
private_hire: HashMap<String, PrivateHireObject>?,
vehicle_details: HashMap<String, VehicleProfileObject>?,
insurance_details: HashMap<String, InsuranceObject>?,
mot_details: HashMap<String, MotObject>?,
log_book: HashMap<String, LogbookObject>?,
private_hire_vehicle: HashMap<String, PrivateHireVehicleObject>?
) {
this.driver_license = driver_license
this.private_hire = private_hire
this.vehicle_details = vehicle_details
this.insurance_details = insurance_details
this.mot_details = mot_details
this.log_book = log_book
this.ph_car = private_hire_vehicle
}
}

View File

@@ -1,24 +0,0 @@
package h_mal.appttude.com.objects.wholeObject
import h_mal.appttude.com.model.DriverProfileObject
import h_mal.appttude.com.model.DriversLicenseObject
import h_mal.appttude.com.model.PrivateHireObject
class DriverProfile {
var driver_profile: DriverProfileObject? = null
var driver_license: DriversLicenseObject? = null
var private_hire: PrivateHireObject? = null
constructor(
driver_profile: DriverProfileObject?,
driver_license: DriversLicenseObject?,
private_hire: PrivateHireObject?
) {
this.driver_profile = driver_profile
this.driver_license = driver_license
this.private_hire = private_hire
}
constructor()
}

View File

@@ -1,38 +0,0 @@
package h_mal.appttude.com.objects.wholeObject
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 {
var insurance_details: InsuranceObject? = null
var log_book: LogbookObject? = null
var mot_details: MotObject? = null
var vehicle_details: VehicleProfileObject? = null
var privateHireVehicleObject: PrivateHireVehicleObject? = null
constructor()
// public VehicleProfile(InsuranceObject insurance_details, LogbookObject log_book, MotObject mot_details, VehicleProfileObject vehicle_details) {
// this.insurance_details = insurance_details;
// this.log_book = log_book;
// this.mot_details = mot_details;
// this.vehicle_details = vehicle_details;
// }
constructor(
insurance_details: InsuranceObject?,
log_book: LogbookObject?,
mot_details: MotObject?,
vehicle_details: VehicleProfileObject?,
private_hire_vehicle: PrivateHireVehicleObject?
) {
this.insurance_details = insurance_details
this.log_book = log_book
this.mot_details = mot_details
this.vehicle_details = vehicle_details
privateHireVehicleObject = private_hire_vehicle
}
}

View File

@@ -1,101 +0,0 @@
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

@@ -8,7 +8,8 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
tools:listitem="@layout/list_item_layout">
</androidx.recyclerview.widget.RecyclerView>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@+id/main_navigation"
app:startDestination="@id/homeAdminFragment">
<fragment
android:id="@+id/homeAdminFragment"
android:name="h_mal.appttude.com.driver.ui.HomeSuperUserFragment"
android:label="fragment_home"
tools:layout="@layout/fragment_home_super_user">
</fragment>
</navigation>

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com
package h_mal.appttude.com.driver
import android.content.res.Resources
import androidx.annotation.StringRes

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com
package h_mal.appttude.com.driver
import android.view.View
import androidx.annotation.StringRes
@@ -10,7 +10,7 @@ import androidx.test.espresso.UiController
import androidx.test.espresso.ViewAction
import androidx.test.espresso.matcher.ViewMatchers.isRoot
import androidx.test.platform.app.InstrumentationRegistry
import h_mal.appttude.com.base.BaseActivity
import h_mal.appttude.com.driver.base.BaseActivity
import org.hamcrest.Matcher
import org.junit.After
import org.junit.Before

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com
package h_mal.appttude.com.driver
private const val apiKey = "test_key"

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com
package h_mal.appttude.com.driver
import android.view.View
import android.widget.EditText

View File

@@ -1,10 +1,10 @@
package h_mal.appttude.com
package h_mal.appttude.com.driver
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.storage.FirebaseStorage
import h_mal.appttude.com.base.BaseActivity
import h_mal.appttude.com.data.FirebaseAuthSource
import h_mal.appttude.com.driver.base.BaseActivity
import h_mal.appttude.com.driver.data.FirebaseAuthSource
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.tasks.await
import org.junit.After

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com
package h_mal.appttude.com.driver
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.firebase
package h_mal.appttude.com.driver.firebase
data class SignUpResponse(
val expiresIn: String? = null,

View File

@@ -1,7 +1,7 @@
package h_mal.appttude.com.robots
package h_mal.appttude.com.driver.robots
import h_mal.appttude.com.BaseTestRobot
import h_mal.appttude.com.R
import h_mal.appttude.com.driver.BaseTestRobot
import h_mal.appttude.com.driver.R
fun home(func: HomeRobot.() -> Unit) = HomeRobot().apply { func() }
class HomeRobot : BaseTestRobot() {

View File

@@ -1,7 +1,7 @@
package h_mal.appttude.com.robots
package h_mal.appttude.com.driver.robots
import h_mal.appttude.com.BaseTestRobot
import h_mal.appttude.com.R
import h_mal.appttude.com.driver.BaseTestRobot
import h_mal.appttude.com.driver.R
fun login(func: LoginRobot.() -> Unit) = LoginRobot().apply { func() }

View File

@@ -1,7 +1,7 @@
package h_mal.appttude.com.robots
package h_mal.appttude.com.driver.robots
import h_mal.appttude.com.BaseTestRobot
import h_mal.appttude.com.R
import h_mal.appttude.com.driver.BaseTestRobot
import h_mal.appttude.com.driver.R
fun register(func: RegisterRobot.() -> Unit) = RegisterRobot().apply { func() }
class RegisterRobot : BaseTestRobot() {

View File

@@ -1,14 +1,14 @@
package h_mal.appttude.com.tests
package h_mal.appttude.com.driver.tests
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import h_mal.appttude.com.FirebaseTest
import h_mal.appttude.com.R
import h_mal.appttude.com.USER_PASSWORD
import h_mal.appttude.com.robots.home
import h_mal.appttude.com.robots.login
import h_mal.appttude.com.ui.user.LoginActivity
import h_mal.appttude.com.driver.FirebaseTest
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.USER_PASSWORD
import h_mal.appttude.com.driver.robots.home
import h_mal.appttude.com.driver.robots.login
import h_mal.appttude.com.driver.ui.user.LoginActivity
import org.junit.*
import org.junit.runner.RunWith

View File

@@ -1,15 +1,15 @@
package h_mal.appttude.com.tests
package h_mal.appttude.com.driver.tests
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import h_mal.appttude.com.FirebaseTest
import h_mal.appttude.com.R
import h_mal.appttude.com.USER_PASSWORD
import h_mal.appttude.com.robots.home
import h_mal.appttude.com.robots.login
import h_mal.appttude.com.robots.register
import h_mal.appttude.com.ui.user.LoginActivity
import h_mal.appttude.com.driver.FirebaseTest
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.USER_PASSWORD
import h_mal.appttude.com.driver.robots.home
import h_mal.appttude.com.driver.robots.login
import h_mal.appttude.com.driver.robots.register
import h_mal.appttude.com.driver.ui.user.LoginActivity
import org.junit.*
import org.junit.runner.RunWith

View File

@@ -1,39 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="h_mal.appttude.com.driver">
<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,13 +1,13 @@
package h_mal.appttude.com.ui
package h_mal.appttude.com.driver.ui
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.R
import h_mal.appttude.com.databinding.FragmentDriverOverallBinding
import h_mal.appttude.com.utils.navigateTo
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.databinding.FragmentDriverOverallBinding
import h_mal.appttude.com.driver.utils.navigateTo
class DriverOverallFragment : Fragment() {

View File

@@ -1,15 +1,15 @@
package h_mal.appttude.com.ui
package h_mal.appttude.com.driver.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.databinding.FragmentHomeDriverBinding
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 h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.data.DRIVER
import h_mal.appttude.com.driver.databinding.FragmentHomeDriverBinding
import h_mal.appttude.com.driver.utils.hide
import h_mal.appttude.com.driver.utils.navigateTo
import h_mal.appttude.com.driver.utils.show
import h_mal.appttude.com.driver.viewmodels.RoleViewModel
class HomeFragment :

View File

@@ -0,0 +1,51 @@
package h_mal.appttude.com.driver.ui
import android.os.Bundle
import com.google.firebase.auth.FirebaseUser
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.DrawerActivity
import h_mal.appttude.com.driver.databinding.ActivityMainBinding
import h_mal.appttude.com.driver.databinding.NavHeaderMainBinding
import h_mal.appttude.com.driver.utils.setGlideImage
import h_mal.appttude.com.driver.viewmodels.MainViewModel
class MainActivity : DrawerActivity<MainViewModel, ActivityMainBinding>() {
override val containerId: Int = R.id.container
override val drawerLayoutId: Int = R.id.drawer_layout
override val toolbarId: Int = R.id.toolbar
override val navViewId: Int = R.id.nav_view
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.getUserDetails()
setupLogoutInDrawer()
}
override fun onSuccess(data: Any?) {
super.onSuccess(data)
when (data) {
is FirebaseUser -> {
setupDrawer(data)
}
}
}
private fun setupDrawer(user: FirebaseUser) {
NavHeaderMainBinding.inflate(layoutInflater).apply {
driverEmail.text = user.email
driverName.text = user.displayName
profileImage.setGlideImage(user.photoUrl)
}
}
private fun setupLogoutInDrawer() {
binding.logout.setOnClickListener {
viewModel.logOut()
}
}
}

View File

@@ -1,13 +1,13 @@
package h_mal.appttude.com.ui
package h_mal.appttude.com.driver.ui
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.R
import h_mal.appttude.com.databinding.FragmentVehicleOverallBinding
import h_mal.appttude.com.utils.navigateTo
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.databinding.FragmentVehicleOverallBinding
import h_mal.appttude.com.driver.utils.navigateTo
class VehicleOverallFragment : Fragment() {

View File

@@ -1,13 +1,13 @@
package h_mal.appttude.com.ui
package h_mal.appttude.com.driver.ui
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.R
import h_mal.appttude.com.databinding.FragmentWelcomeBinding
import h_mal.appttude.com.utils.navigateTo
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.databinding.FragmentWelcomeBinding
import h_mal.appttude.com.driver.utils.navigateTo
class WelcomeFragment : Fragment() {

View File

@@ -1,13 +1,13 @@
package h_mal.appttude.com.ui.driverprofile
package h_mal.appttude.com.driver.ui.driverprofile
import android.net.Uri
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.databinding.FragmentDriverLicenseBinding
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.model.DriversLicense
import h_mal.appttude.com.utils.isTrue
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.DriverLicenseViewModel
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.databinding.FragmentDriverLicenseBinding
import h_mal.appttude.com.driver.dialogs.DateDialog
import h_mal.appttude.com.driver.model.DriversLicense
import h_mal.appttude.com.driver.utils.isTrue
import h_mal.appttude.com.driver.utils.setGlideImage
import h_mal.appttude.com.driver.viewmodels.DriverLicenseViewModel
class DriverLicenseFragment :
DataSubmissionBaseFragment<DriverLicenseViewModel, FragmentDriverLicenseBinding, DriversLicense>() {

View File

@@ -1,13 +1,13 @@
package h_mal.appttude.com.ui.driverprofile
package h_mal.appttude.com.driver.ui.driverprofile
import android.net.Uri
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.databinding.FragmentDriverProfileBinding
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.model.DriverProfile
import h_mal.appttude.com.utils.isTrue
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.DriverProfileViewModel
import h_mal.appttude.com.driver.databinding.FragmentDriverProfileBinding
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.dialogs.DateDialog
import h_mal.appttude.com.driver.model.DriverProfile
import h_mal.appttude.com.driver.utils.isTrue
import h_mal.appttude.com.driver.utils.setGlideImage
import h_mal.appttude.com.driver.viewmodels.DriverProfileViewModel
class DriverProfileFragment :

View File

@@ -1,13 +1,13 @@
package h_mal.appttude.com.ui.driverprofile
package h_mal.appttude.com.driver.ui.driverprofile
import android.net.Uri
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.databinding.FragmentPrivateHireLicenseBinding
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.model.PrivateHireLicense
import h_mal.appttude.com.utils.isTrue
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.PrivateHireLicenseViewModel
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.databinding.FragmentPrivateHireLicenseBinding
import h_mal.appttude.com.driver.dialogs.DateDialog
import h_mal.appttude.com.driver.model.PrivateHireLicense
import h_mal.appttude.com.driver.utils.isTrue
import h_mal.appttude.com.driver.utils.setGlideImage
import h_mal.appttude.com.driver.viewmodels.PrivateHireLicenseViewModel
class PrivateHireLicenseFragment : DataSubmissionBaseFragment

View File

@@ -1,16 +1,16 @@
package h_mal.appttude.com.ui.vehicleprofile
package h_mal.appttude.com.driver.ui.vehicleprofile
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.ImageView
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.databinding.FragmentInsuranceBinding
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.model.Insurance
import h_mal.appttude.com.utils.isTrue
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.InsuranceViewModel
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.databinding.FragmentInsuranceBinding
import h_mal.appttude.com.driver.dialogs.DateDialog
import h_mal.appttude.com.driver.model.Insurance
import h_mal.appttude.com.driver.utils.isTrue
import h_mal.appttude.com.driver.utils.setGlideImage
import h_mal.appttude.com.driver.viewmodels.InsuranceViewModel
class InsuranceFragment :

View File

@@ -1,12 +1,12 @@
package h_mal.appttude.com.ui.vehicleprofile
package h_mal.appttude.com.driver.ui.vehicleprofile
import android.net.Uri
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.databinding.FragmentLogbookBinding
import h_mal.appttude.com.model.Logbook
import h_mal.appttude.com.utils.isTrue
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.LogbookViewModel
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.databinding.FragmentLogbookBinding
import h_mal.appttude.com.driver.model.Logbook
import h_mal.appttude.com.driver.utils.isTrue
import h_mal.appttude.com.driver.utils.setGlideImage
import h_mal.appttude.com.driver.viewmodels.LogbookViewModel
class LogbookFragment :

View File

@@ -1,13 +1,13 @@
package h_mal.appttude.com.ui.vehicleprofile
package h_mal.appttude.com.driver.ui.vehicleprofile
import android.net.Uri
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.databinding.FragmentMotBinding
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.model.Mot
import h_mal.appttude.com.utils.isTrue
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.MotViewModel
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.databinding.FragmentMotBinding
import h_mal.appttude.com.driver.dialogs.DateDialog
import h_mal.appttude.com.driver.model.Mot
import h_mal.appttude.com.driver.utils.isTrue
import h_mal.appttude.com.driver.utils.setGlideImage
import h_mal.appttude.com.driver.viewmodels.MotViewModel
class MotFragment : DataSubmissionBaseFragment<MotViewModel, FragmentMotBinding, Mot>() {

View File

@@ -1,13 +1,13 @@
package h_mal.appttude.com.ui.vehicleprofile
package h_mal.appttude.com.driver.ui.vehicleprofile
import android.net.Uri
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.databinding.FragmentPrivateHireLicenseBinding
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.model.PrivateHireVehicle
import h_mal.appttude.com.utils.isTrue
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.PrivateHireVehicleViewModel
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.databinding.FragmentPrivateHireLicenseBinding
import h_mal.appttude.com.driver.dialogs.DateDialog
import h_mal.appttude.com.driver.model.PrivateHireVehicle
import h_mal.appttude.com.driver.utils.isTrue
import h_mal.appttude.com.driver.utils.setGlideImage
import h_mal.appttude.com.driver.viewmodels.PrivateHireVehicleViewModel
class PrivateHireVehicleFragment :

View File

@@ -1,11 +1,11 @@
package h_mal.appttude.com.ui.vehicleprofile
package h_mal.appttude.com.driver.ui.vehicleprofile
import h_mal.appttude.com.base.DataSubmissionBaseFragment
import h_mal.appttude.com.databinding.FragmentVehicleSetupBinding
import h_mal.appttude.com.dialogs.DateDialog
import h_mal.appttude.com.model.VehicleProfile
import h_mal.appttude.com.utils.isTrue
import h_mal.appttude.com.viewmodels.VehicleProfileViewModel
import h_mal.appttude.com.driver.base.DataSubmissionBaseFragment
import h_mal.appttude.com.driver.databinding.FragmentVehicleSetupBinding
import h_mal.appttude.com.driver.dialogs.DateDialog
import h_mal.appttude.com.driver.model.VehicleProfile
import h_mal.appttude.com.driver.utils.isTrue
import h_mal.appttude.com.driver.viewmodels.VehicleProfileViewModel
class VehicleProfileFragment : DataSubmissionBaseFragment

View File

@@ -1,18 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="h_mal.appttude.com">
package="h_mal.appttude.com.driver">
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:name="h_mal.appttude.com.application.DriverApplication"
android:name="h_mal.appttude.com.driver.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="h_mal.appttude.com.driver.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.driver.ui.MainActivity"
android:configChanges="orientation|screenSize"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="h_mal.appttude.com.driver.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,4 +0,0 @@
package h_mal.appttude.com.data
const val DRIVER = "driver"
const val ADMIN = "super_user"

View File

@@ -1,11 +1,11 @@
package h_mal.appttude.com.application
package h_mal.appttude.com.driver.application
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
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.*
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.*
class ApplicationViewModelFactory(
private val auth: FirebaseAuthSource,

View File

@@ -1,9 +1,9 @@
package h_mal.appttude.com.application
package h_mal.appttude.com.driver.application
import android.app.Application
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.driver.data.FirebaseAuthSource
import h_mal.appttude.com.driver.data.FirebaseDatabaseSource
import h_mal.appttude.com.driver.data.FirebaseStorageSource
import org.kodein.di.Kodein
import org.kodein.di.KodeinAware
import org.kodein.di.android.x.androidXModule

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.Archive
package h_mal.appttude.com.driver.archive
import android.os.Bundle
import android.view.LayoutInflater
@@ -7,7 +7,7 @@ import android.view.ViewGroup
import android.widget.ListView
import androidx.fragment.app.Fragment
import com.google.firebase.database.DatabaseReference
import h_mal.appttude.com.R
import h_mal.appttude.com.driver.R
class ArchiveFragment : Fragment() {
// var archive: ArchiveObject? = null

View File

@@ -1,14 +1,14 @@
package h_mal.appttude.com.Archive
package h_mal.appttude.com.driver.archive
//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.driver.Global.FirebaseClass
//import h_mal.appttude.com.driver.Global.ImageSwiperClass
//import h_mal.appttude.com.driver.Objects.ArchiveObject
import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.TextView
import h_mal.appttude.com.utils.DateUtils.convertDateStringDatePattern
import h_mal.appttude.com.driver.utils.DateUtils.convertDateStringDatePattern
import java.text.ParseException
class ArchiveObjectListAdapter(

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.base
package h_mal.appttude.com.driver.base
import android.content.Intent
import android.os.Bundle
@@ -12,10 +12,10 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelLazy
import androidx.test.espresso.IdlingResource
import androidx.viewbinding.ViewBinding
import h_mal.appttude.com.R
import h_mal.appttude.com.application.ApplicationViewModelFactory
import h_mal.appttude.com.data.ViewState
import h_mal.appttude.com.utils.*
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.*
import org.kodein.di.KodeinAware
import org.kodein.di.android.kodein
import org.kodein.di.generic.instance
@@ -29,16 +29,18 @@ abstract class BaseActivity<V : BaseViewModel, VB : ViewBinding> : AppCompatActi
private lateinit var loadingView: View
private var _binding: VB? = null
private val binding: VB
val binding: VB
get() = _binding ?: error("Must only access binding while fragment is attached.")
val viewModel: V by createLazyViewModel()
override val kodein by kodein()
val factory by instance<ApplicationViewModelFactory>()
private val factory by instance<ApplicationViewModelFactory>()
fun createLazyViewModel(): Lazy<V> = ViewModelLazy(
/**
* Create a lazy viewmodel based on the generic view model [V].
*/
private fun createLazyViewModel(): Lazy<V> = ViewModelLazy(
getGenericClassAt(0),
{ viewModelStore },
{ factory },
@@ -52,7 +54,10 @@ abstract class BaseActivity<V : BaseViewModel, VB : ViewBinding> : AppCompatActi
?.kotlin
?: throw IllegalStateException("Can not find class from generic argument")
fun inflateBindingByType(
/**
* Create a view binding out of the the generic [VB]
*/
private fun inflateBindingByType(
genericClassAt: KClass<VB>
): VB = try {
@Suppress("UNCHECKED_CAST")
@@ -74,8 +79,14 @@ abstract class BaseActivity<V : BaseViewModel, VB : ViewBinding> : AppCompatActi
setupView(binding)
}
open fun setupView(binding: VB) {}
/**
* Extension function which can be used in our child class for binding.
*
* @sample applyBinding { textView.text = "Hello" }
*/
fun applyBinding(block: VB.() -> Unit) {
block(binding)
}

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.base
package h_mal.appttude.com.driver.base
import android.app.Activity
import android.content.ClipData
@@ -11,9 +11,9 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.createViewModelLazy
import androidx.viewbinding.ViewBinding
import h_mal.appttude.com.application.ApplicationViewModelFactory
import h_mal.appttude.com.data.ViewState
import h_mal.appttude.com.utils.PermissionsUtils
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 org.kodein.di.KodeinAware
import org.kodein.di.android.x.kodein
import org.kodein.di.generic.instance

View File

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

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.base
package h_mal.appttude.com.driver.base
import android.Manifest
import android.content.Intent
@@ -8,10 +8,10 @@ import android.view.View
import android.widget.EditText
import androidx.core.widget.doAfterTextChanged
import androidx.viewbinding.ViewBinding
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
import h_mal.appttude.com.driver.data.UserAuthState
import h_mal.appttude.com.driver.ui.user.LoginActivity
import h_mal.appttude.com.driver.utils.PermissionsUtils.askForPermissions
import h_mal.appttude.com.driver.utils.TextValidationUtils.validateEditText
private const val IMAGE_PERMISSION_RESULT = 402

View File

@@ -1,15 +1,15 @@
package h_mal.appttude.com.base
package h_mal.appttude.com.driver.base
import android.net.Uri
import com.google.firebase.database.DatabaseReference
import com.google.firebase.storage.StorageReference
import h_mal.appttude.com.data.FirebaseAuthentication
import h_mal.appttude.com.data.FirebaseCompletion
import h_mal.appttude.com.data.FirebaseDatabaseSource
import h_mal.appttude.com.data.FirebaseStorageSource
import h_mal.appttude.com.utils.Coroutines.io
import h_mal.appttude.com.utils.DateUtils.getDateTimeStamp
import h_mal.appttude.com.utils.getDataFromDatabaseRef
import h_mal.appttude.com.driver.data.FirebaseAuthentication
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 kotlinx.coroutines.Job
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope

View File

@@ -1,43 +1,54 @@
package h_mal.appttude.com.ui
package h_mal.appttude.com.driver.base
import android.os.Bundle
import android.view.MenuItem
import androidx.appcompat.widget.Toolbar
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
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 androidx.viewbinding.ViewBinding
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.databinding.ActivityMainBinding
import h_mal.appttude.com.databinding.NavHeaderMainBinding
import h_mal.appttude.com.dialogs.ExitDialog.displayExitDialog
import h_mal.appttude.com.utils.isTrue
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.MainViewModel
import h_mal.appttude.com.driver.databinding.NavHeaderMainBinding
import h_mal.appttude.com.driver.dialogs.ExitDialog.displayExitDialog
import h_mal.appttude.com.driver.utils.isTrue
import h_mal.appttude.com.driver.utils.setGlideImage
class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(),
abstract class DrawerActivity<V : BaseViewModel, VB : ViewBinding> : BaseActivity<V, VB>(),
NavigationView.OnNavigationItemSelectedListener {
abstract val containerId: Int
abstract val drawerLayoutId: Int
abstract val toolbarId: Int
abstract val navViewId:Int
lateinit var navController: NavController
lateinit var appBarConfiguration: AppBarConfiguration
override fun setupView(binding: ActivityMainBinding) = binding.run {
setSupportActionBar(appBarLayout.toolbar)
lateinit var toolbar: Toolbar
lateinit var drawerLayout: DrawerLayout
lateinit var navView: NavigationView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
toolbar = findViewById(toolbarId)
drawerLayout = findViewById(drawerLayoutId)
navView = findViewById(navViewId)
setSupportActionBar(toolbar)
supportActionBar?.setDisplayShowTitleEnabled(false)
navController = findNavController(R.id.container)
navController = findNavController(containerId)
appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
navView.setupWithNavController(navController)
setupActionBarWithNavController(navController, appBarConfiguration)
viewModel.getUserDetails()
setupLogoutInDrawer()
}
override fun onSupportNavigateUp(): Boolean {
@@ -45,10 +56,7 @@ class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(),
}
override fun setTitle(title: CharSequence) {
applyBinding {
appBarLayout.toolbar.title = title
}
toolbar.title = title
}
override fun onBackPressed() {
@@ -56,9 +64,9 @@ class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(),
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START)
} else {
val navHostFragment = supportFragmentManager.findFragmentById(R.id.container)
navHostFragment?.childFragmentManager?.backStackEntryCount?.let { it >= 1 }?.isTrue {
navController.backQueue.size.let { it >= 1 }.isTrue {
super.onBackPressed()
return@applyBinding
}
displayExitDialog()
}
@@ -84,23 +92,8 @@ class MainActivity : BaseActivity<MainViewModel, ActivityMainBinding>(),
}
}
private fun setupLogoutInDrawer() {
applyBinding {
logout.setOnClickListener {
viewModel.logOut()
}
}
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
// Handle navigation view item clicks here.
when (item.itemId) {
R.id.nav_user_settings -> {}
}
applyBinding {
drawerLayout.closeDrawer(GravityCompat.START)
}
drawerLayout.closeDrawer(GravityCompat.START)
return true
}
}

View File

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

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.data
package h_mal.appttude.com.driver.data
import android.net.Uri
import com.google.android.gms.tasks.Task

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.data
package h_mal.appttude.com.driver.data
import androidx.lifecycle.LiveData
import com.google.firebase.auth.FirebaseAuth

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.data
package h_mal.appttude.com.driver.data
import android.net.Uri
import com.google.android.gms.tasks.Task

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.data
package h_mal.appttude.com.driver.data
import com.google.firebase.auth.FirebaseUser

View File

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

View File

@@ -1,12 +1,12 @@
package h_mal.appttude.com.dialogs
package h_mal.appttude.com.driver.dialogs
import android.app.DatePickerDialog
import android.app.DatePickerDialog.OnDateSetListener
import android.icu.util.Calendar
import android.widget.EditText
import h_mal.appttude.com.R
import h_mal.appttude.com.utils.DateUtils
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.utils.DateUtils
private const val DATE_FORMAT = "dd/MM/yyyy"

View File

@@ -1,8 +1,8 @@
package h_mal.appttude.com.dialogs
package h_mal.appttude.com.driver.dialogs
import android.app.Activity
import android.app.AlertDialog
import h_mal.appttude.com.R
import h_mal.appttude.com.driver.R
import kotlin.system.exitProcess
object ExitDialog {

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.model
package h_mal.appttude.com.driver.model
data class DriverProfile(
var driverPic: String? = null,

View File

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

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.model
package h_mal.appttude.com.driver.model
data class Insurance(
var photoStrings: MutableList<String?>? = null,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectDictionaryState">
<dictionary name="h_mal" />
</component>
</project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Kotlin2JsCompilerArguments">
<option name="sourceMapEmbedSources" />
</component>
</project>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CMakeSettings">
<configurations>
<configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" />
</configurations>
</component>
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/ui.iml" filepath="$PROJECT_DIR$/ui.iml" />
</modules>
</component>
</project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../../../../../../../.." vcs="Git" />
</component>
</project>

View File

@@ -1,10 +1,10 @@
package h_mal.appttude.com.ui.update
package h_mal.appttude.com.driver.ui.update
import h_mal.appttude.com.base.BaseFragment
import h_mal.appttude.com.databinding.FragmentDeleteProfileBinding
import h_mal.appttude.com.utils.TextValidationUtils.validatePasswordEditText
import h_mal.appttude.com.utils.setEnterPressedListener
import h_mal.appttude.com.viewmodels.UpdateUserViewModel
import h_mal.appttude.com.driver.base.BaseFragment
import h_mal.appttude.com.driver.databinding.FragmentDeleteProfileBinding
import h_mal.appttude.com.driver.utils.TextValidationUtils.validatePasswordEditText
import h_mal.appttude.com.driver.utils.setEnterPressedListener
import h_mal.appttude.com.driver.viewmodels.UpdateUserViewModel
class DeleteProfileFragment :

View File

@@ -0,0 +1,17 @@
package h_mal.appttude.com.driver.ui.update
import h_mal.appttude.com.driver.base.BaseActivity
import h_mal.appttude.com.driver.data.FirebaseCompletion
import h_mal.appttude.com.driver.databinding.UpdateActivityBinding
import h_mal.appttude.com.driver.utils.displayToast
import h_mal.appttude.com.driver.viewmodels.UpdateUserViewModel
class UpdateActivity : BaseActivity<UpdateUserViewModel, UpdateActivityBinding>() {
override fun onSuccess(data: Any?) {
super.onSuccess(data)
when (data) {
is FirebaseCompletion.Changed -> displayToast(data.message)
}
}
}

View File

@@ -1,11 +1,11 @@
package h_mal.appttude.com.ui.update
package h_mal.appttude.com.driver.ui.update
import h_mal.appttude.com.base.BaseFragment
import h_mal.appttude.com.databinding.FragmentUpdateEmailBinding
import h_mal.appttude.com.utils.TextValidationUtils.validateEmailEditText
import h_mal.appttude.com.utils.TextValidationUtils.validatePasswordEditText
import h_mal.appttude.com.utils.setEnterPressedListener
import h_mal.appttude.com.viewmodels.UpdateUserViewModel
import h_mal.appttude.com.driver.base.BaseFragment
import h_mal.appttude.com.driver.databinding.FragmentUpdateEmailBinding
import h_mal.appttude.com.driver.utils.TextValidationUtils.validateEmailEditText
import h_mal.appttude.com.driver.utils.TextValidationUtils.validatePasswordEditText
import h_mal.appttude.com.driver.utils.setEnterPressedListener
import h_mal.appttude.com.driver.viewmodels.UpdateUserViewModel
class UpdateEmailFragment : BaseFragment<UpdateUserViewModel, FragmentUpdateEmailBinding>() {

View File

@@ -1,11 +1,11 @@
package h_mal.appttude.com.ui.update
package h_mal.appttude.com.driver.ui.update
import android.view.View
import h_mal.appttude.com.R
import h_mal.appttude.com.base.BaseFragment
import h_mal.appttude.com.databinding.UpdateOverviewFragmentBinding
import h_mal.appttude.com.utils.navigateTo
import h_mal.appttude.com.viewmodels.UpdateUserViewModel
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.BaseFragment
import h_mal.appttude.com.driver.databinding.UpdateOverviewFragmentBinding
import h_mal.appttude.com.driver.utils.navigateTo
import h_mal.appttude.com.driver.viewmodels.UpdateUserViewModel
class UpdateOverviewFragment : BaseFragment<UpdateUserViewModel, UpdateOverviewFragmentBinding>(),
View.OnClickListener {

View File

@@ -1,11 +1,11 @@
package h_mal.appttude.com.ui.update
package h_mal.appttude.com.driver.ui.update
import h_mal.appttude.com.base.BaseFragment
import h_mal.appttude.com.databinding.FragmentUpdatePasswordBinding
import h_mal.appttude.com.utils.TextValidationUtils.validateEmailEditText
import h_mal.appttude.com.utils.TextValidationUtils.validatePasswordEditText
import h_mal.appttude.com.utils.setEnterPressedListener
import h_mal.appttude.com.viewmodels.UpdateUserViewModel
import h_mal.appttude.com.driver.base.BaseFragment
import h_mal.appttude.com.driver.databinding.FragmentUpdatePasswordBinding
import h_mal.appttude.com.driver.utils.TextValidationUtils.validateEmailEditText
import h_mal.appttude.com.driver.utils.TextValidationUtils.validatePasswordEditText
import h_mal.appttude.com.driver.utils.setEnterPressedListener
import h_mal.appttude.com.driver.viewmodels.UpdateUserViewModel
class UpdatePasswordFragment : BaseFragment<UpdateUserViewModel, FragmentUpdatePasswordBinding>() {

View File

@@ -1,15 +1,15 @@
package h_mal.appttude.com.ui.update
package h_mal.appttude.com.driver.ui.update
import android.Manifest.permission.READ_EXTERNAL_STORAGE
import android.net.Uri
import androidx.core.widget.doAfterTextChanged
import com.google.firebase.auth.FirebaseUser
import h_mal.appttude.com.base.BaseFragment
import h_mal.appttude.com.databinding.FragmentUpdateProfileBinding
import h_mal.appttude.com.utils.PermissionsUtils.askForPermissions
import h_mal.appttude.com.utils.setEnterPressedListener
import h_mal.appttude.com.utils.setGlideImage
import h_mal.appttude.com.viewmodels.UpdateUserViewModel
import h_mal.appttude.com.driver.base.BaseFragment
import h_mal.appttude.com.driver.databinding.FragmentUpdateProfileBinding
import h_mal.appttude.com.driver.utils.PermissionsUtils.askForPermissions
import h_mal.appttude.com.driver.utils.setEnterPressedListener
import h_mal.appttude.com.driver.utils.setGlideImage
import h_mal.appttude.com.driver.viewmodels.UpdateUserViewModel
const val TAG_CONST = "non-user"
private const val IMAGE_PERMISSION_RESULT = 402

View File

@@ -1,9 +1,9 @@
package h_mal.appttude.com.ui.user
package h_mal.appttude.com.driver.ui.user
import h_mal.appttude.com.base.BaseFragment
import h_mal.appttude.com.databinding.FragmentForgotPasswordBinding
import h_mal.appttude.com.utils.TextValidationUtils.validateEmailEditText
import h_mal.appttude.com.viewmodels.UserViewModel
import h_mal.appttude.com.driver.base.BaseFragment
import h_mal.appttude.com.driver.databinding.FragmentForgotPasswordBinding
import h_mal.appttude.com.driver.utils.TextValidationUtils.validateEmailEditText
import h_mal.appttude.com.driver.viewmodels.UserViewModel
class ForgotPasswordFragment : BaseFragment<UserViewModel, FragmentForgotPasswordBinding>() {

View File

@@ -1,13 +1,13 @@
package h_mal.appttude.com.ui.user
package h_mal.appttude.com.driver.ui.user
import android.content.Intent
import com.google.firebase.auth.AuthResult
import com.google.firebase.auth.FirebaseUser
import h_mal.appttude.com.base.BaseActivity
import h_mal.appttude.com.databinding.ActivityLoginBinding
import h_mal.appttude.com.ui.MainActivity
import h_mal.appttude.com.viewmodels.UserViewModel
import h_mal.appttude.com.driver.base.BaseActivity
import h_mal.appttude.com.driver.databinding.ActivityLoginBinding
import h_mal.appttude.com.driver.ui.MainActivity
import h_mal.appttude.com.driver.viewmodels.UserViewModel
/**

View File

@@ -1,13 +1,13 @@
package h_mal.appttude.com.ui.user
package h_mal.appttude.com.driver.ui.user
import h_mal.appttude.com.R
import h_mal.appttude.com.base.BaseFragment
import h_mal.appttude.com.databinding.FragmentLoginBinding
import h_mal.appttude.com.utils.TextValidationUtils.validateEmailEditText
import h_mal.appttude.com.utils.TextValidationUtils.validatePasswordEditText
import h_mal.appttude.com.utils.navigateTo
import h_mal.appttude.com.utils.setEnterPressedListener
import h_mal.appttude.com.viewmodels.UserViewModel
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.BaseFragment
import h_mal.appttude.com.driver.databinding.FragmentLoginBinding
import h_mal.appttude.com.driver.utils.TextValidationUtils.validateEmailEditText
import h_mal.appttude.com.driver.utils.TextValidationUtils.validatePasswordEditText
import h_mal.appttude.com.driver.utils.navigateTo
import h_mal.appttude.com.driver.utils.setEnterPressedListener
import h_mal.appttude.com.driver.viewmodels.UserViewModel
class LoginFragment : BaseFragment<UserViewModel, FragmentLoginBinding>() {

View File

@@ -1,12 +1,12 @@
package h_mal.appttude.com.ui.user
package h_mal.appttude.com.driver.ui.user
import h_mal.appttude.com.R
import h_mal.appttude.com.base.BaseFragment
import h_mal.appttude.com.databinding.FragmentRegisterBinding
import h_mal.appttude.com.utils.TextValidationUtils.validateEmailEditText
import h_mal.appttude.com.utils.TextValidationUtils.validatePasswordEditText
import h_mal.appttude.com.utils.setEnterPressedListener
import h_mal.appttude.com.viewmodels.UserViewModel
import h_mal.appttude.com.driver.R
import h_mal.appttude.com.driver.base.BaseFragment
import h_mal.appttude.com.driver.databinding.FragmentRegisterBinding
import h_mal.appttude.com.driver.utils.TextValidationUtils.validateEmailEditText
import h_mal.appttude.com.driver.utils.TextValidationUtils.validatePasswordEditText
import h_mal.appttude.com.driver.utils.setEnterPressedListener
import h_mal.appttude.com.driver.viewmodels.UserViewModel
class RegisterFragment :
BaseFragment<UserViewModel, FragmentRegisterBinding>() {

View File

@@ -1,13 +1,13 @@
package h_mal.appttude.com.ui.user
package h_mal.appttude.com.driver.ui.user
import android.os.Bundle
import android.view.View
import h_mal.appttude.com.R
import h_mal.appttude.com.base.BaseFragment
import h_mal.appttude.com.data.FirebaseCompletion
import h_mal.appttude.com.databinding.SplashScreenBinding
import h_mal.appttude.com.utils.navigateTo
import h_mal.appttude.com.viewmodels.UserViewModel
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.databinding.SplashScreenBinding
import h_mal.appttude.com.driver.utils.navigateTo
import h_mal.appttude.com.driver.viewmodels.UserViewModel
class SplashScreenFragment : BaseFragment<UserViewModel, SplashScreenBinding>() {

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.utils
package h_mal.appttude.com.driver.utils
import android.content.Context
import android.content.Intent

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.utils
package h_mal.appttude.com.driver.utils
import android.view.View
import android.view.animation.Animation

View File

@@ -1,4 +1,4 @@
package h_mal.appttude.com.utils
package h_mal.appttude.com.driver.utils
import androidx.test.espresso.IdlingResource
import androidx.test.espresso.IdlingResource.ResourceCallback

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