Browse Source

POB API

ManojBranch
Manoj 2 years ago
parent
commit
8dd2952201
78 changed files with 3535 additions and 374 deletions
  1. +3
    -2
      app/build.gradle
  2. +1
    -0
      app/src/main/AndroidManifest.xml
  3. +8
    -7
      app/src/main/java/com/nivesh/production/partnerOnBoarding/adapters/NewDistributorSignStepOneAdapter.kt
  4. +14
    -9
      app/src/main/java/com/nivesh/production/partnerOnBoarding/api/ApiClient.kt
  5. +9
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/db/PreferenceManager.kt
  6. +45
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/ApiInterface.kt
  7. +3
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/IPreferenceHelper.kt
  8. +18
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Data.kt
  9. +19
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/DataX.kt
  10. +6
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Error.kt
  11. +6
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ErrorX.kt
  12. +8
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ImageSelectedModel.kt
  13. +6
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Result.kt
  14. +6
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ResultX.kt
  15. +5
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ResultXX.kt
  16. +6
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/GetAMFIDetailRequest.kt
  17. +24
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/PartnerRequest.kt
  18. +8
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SaveEAgreementRequest.kt
  19. +8
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SaveEAgreementRequestX.kt
  20. +13
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SendOTPRequest.kt
  21. +5
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/ValidatePartnerRequest.kt
  22. +10
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/Data.kt
  23. +6
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DataX.kt
  24. +7
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DocumentTypeResponse.kt
  25. +9
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DocumentUploadResponse.kt
  26. +7
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/GetAMFIDetailResponse.kt
  27. +7
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/GetAllProductResponse.kt
  28. +9
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/PANResponse.kt
  29. +9
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/PartnerResponse.kt
  30. +8
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/Result.kt
  31. +7
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultX.kt
  32. +5
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultXX.kt
  33. +5
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultXXX.kt
  34. +7
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/SaveEAgreementResponse.kt
  35. +8
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/SendOTPResponse.kt
  36. +7
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ValidateOTPResponse.kt
  37. +9
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ValidatePartnerResponse.kt
  38. +4
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/DataRepository.kt
  39. +41
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/MainRepository.kt
  40. +4
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/RegisterActivity.kt
  41. +24
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/SignUpActivity.kt
  42. +223
    -53
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/AlmostThereFragment.kt
  43. +630
    -140
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/GetStartedFragment.kt
  44. +74
    -11
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/NewDistributorSignStepOne.kt
  45. +91
    -16
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/OTPFragment.kt
  46. +38
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/QuestionsFragment.kt
  47. +372
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SaveEAgreementFragment.kt
  48. +127
    -12
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SignUpFragment.kt
  49. +62
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Common.kt
  50. +6
    -3
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Constants.kt
  51. +134
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ImageFilePath.kt
  52. +0
    -35
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/MaskWatcher.kt
  53. +79
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/IFormattedString.kt
  54. +60
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/Mask.kt
  55. +93
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskCharacter.kt
  56. +29
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskCharacterFabric.kt
  57. +50
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedEditText.kt
  58. +27
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedFormatter.kt
  59. +79
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedWatcher.kt
  60. +169
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/viewModels/OnBoardingViewModel.kt
  61. +2
    -2
      app/src/main/res/drawable/google_icon.xml
  62. +11
    -0
      app/src/main/res/drawable/svg_back.xml
  63. +12
    -0
      app/src/main/res/drawable/svg_cal.xml
  64. +17
    -0
      app/src/main/res/drawable/svg_pan_verified.xml
  65. +11
    -0
      app/src/main/res/drawable/svg_phone.xml
  66. +2
    -1
      app/src/main/res/layout/activity_register.xml
  67. +290
    -0
      app/src/main/res/layout/agreement_otp.xml
  68. +65
    -67
      app/src/main/res/layout/fragment_almost_there.xml
  69. +214
    -11
      app/src/main/res/layout/fragment_get_started.xml
  70. +18
    -0
      app/src/main/res/layout/fragment_question.xml
  71. +32
    -0
      app/src/main/res/layout/fragment_save_e_agreement.xml
  72. +46
    -0
      app/src/main/res/layout/header_eaggrement.xml
  73. +24
    -2
      app/src/main/res/values-hi-rIN/strings.xml
  74. +2
    -0
      app/src/main/res/values-night/strings.xml
  75. +4
    -0
      app/src/main/res/values/attr_themes.xml
  76. +2
    -0
      app/src/main/res/values/colors.xml
  77. +25
    -2
      app/src/main/res/values/strings.xml
  78. +1
    -1
      app/src/main/res/values/themes.xml

+ 3
- 2
app/build.gradle View File

@ -39,6 +39,7 @@ android {
ext{
roomVersion="2.4.3"
glideVersion="4.11.0"
composeVersion="1.6.4"
}
dependencies {
@ -57,8 +58,8 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1"
// Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:composeVersion'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:composeVersion'
// Coroutine Lifecycle Scopes
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1"


+ 1
- 0
app/src/main/AndroidManifest.xml View File

@ -29,6 +29,7 @@
android:supportsRtl="true"
android:requestLegacyExternalStorage="true"
android:theme="@style/Theme.NiveshFDSDK"
android:usesCleartextTraffic="true"
tools:targetApi="31">
<activity


+ 8
- 7
app/src/main/java/com/nivesh/production/partnerOnBoarding/adapters/NewDistributorSignStepOneAdapter.kt View File

@ -13,9 +13,10 @@ import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.textfield.TextInputLayout
import com.nivesh.production.partnerOnBoarding.R
import com.nivesh.production.partnerOnBoarding.model.response.DataX
import com.nivesh.production.partnerOnBoarding.ui.fragments.NewDistributorSignStepOne
class NewDistributorSignStepOneAdapter(private var listData: MutableList<String>) :
class NewDistributorSignStepOneAdapter(private var listData: List<DataX>) :
RecyclerView.Adapter<NewDistributorSignStepOneAdapter.ViewHolder>() {
private var context: Context? = null
private var isPosBroker: Boolean? = false
@ -30,19 +31,19 @@ class NewDistributorSignStepOneAdapter(private var listData: MutableList<String>
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.checkBox.text = listData[position]
holder.checkBox.text = listData[position].ProductName
holder.checkBox.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
if (listData[position] == "Insurance") holder.rlInsurance.visibility = View.VISIBLE
if (listData[position].ProductName == "Insurance") holder.rlInsurance.visibility = View.VISIBLE
else holder.rlInsurance.visibility = View.GONE
if (listData[position] == "Other") holder.tlOtherName.visibility = View.VISIBLE
if (listData[position].ProductName == "Other") holder.tlOtherName.visibility = View.VISIBLE
else holder.tlOtherName.visibility = View.GONE
NewDistributorSignStepOne.listMapData = mutableMapOf(position to listData[position])
NewDistributorSignStepOne.listMapData = mutableMapOf(position to listData[position].ProductName)
} else {
if (listData[position] == "Insurance")
if (listData[position].ProductName == "Insurance")
holder.rlInsurance.visibility = View.GONE
if (listData[position] == "Other")
if (listData[position].ProductName == "Other")
holder.tlOtherName.visibility = View.GONE
NewDistributorSignStepOne.listMapData?.remove(position)


+ 14
- 9
app/src/main/java/com/nivesh/production/partnerOnBoarding/api/ApiClient.kt View File

@ -2,7 +2,9 @@ package com.nivesh.production.partnerOnBoarding.api
import com.nivesh.production.partnerOnBoarding.NiveshFdApplication
import com.nivesh.production.partnerOnBoarding.util.Constants
import com.nivesh.production.partnerOnBoarding.util.Constants.Companion.BASE_URL
import com.nivesh.production.partnerOnBoarding.util.Constants.Companion.BASE_URL_COMMON
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
@ -15,8 +17,10 @@ import javax.net.ssl.*
class ApiClient {
val context = NiveshFdApplication.appContext
//For First BaseURL
companion object {
private val client by lazy {
private val clientOne by lazy {
//lazy means we only initialize this here once
val logging = HttpLoggingInterceptor()
//loggingInterceptor use for see making request and for see what responses are
@ -46,6 +50,10 @@ class ApiClient {
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
// .callTimeout(2, TimeUnit.MINUTES)
// .connectTimeout(200, TimeUnit.SECONDS)
// .readTimeout(300, TimeUnit.SECONDS)
// .writeTimeout(300, TimeUnit.SECONDS)
.build()
Retrofit.Builder()
@ -54,13 +62,10 @@ class ApiClient {
.client(client)
.build()
}
val getApiClient: ApiInterface by lazy {
client.create(ApiInterface::class.java)
//Common Method for All Client (BASE_URL)
val getApiClientOne: ApiInterface by lazy{
clientOne.create(ApiInterface::class.java)
}
}
}
}

+ 9
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/db/PreferenceManager.kt View File

@ -15,6 +15,7 @@ open class PreferenceManager(context: Context) : IPreferenceHelper {
const val KEY_LOGIN_PASSWORD = "LOGIN_PASSWORD"
const val KEY_CLIENT_UMS_ID = "UMS_Id"
const val KEY_CLIENT_CODE = "ClientCode"
const val KEY_PARTNER_CODE = "PartnerCode"
const val KEY_GET_TOKEN = "GetToken"
const val CLIENT_LANGUAGE = "LANGUAGE"
@ -72,6 +73,14 @@ open class PreferenceManager(context: Context) : IPreferenceHelper {
return preferences[KEY_CLIENT_CODE] ?: ""
}
override fun setPartnerCode(partnerCode: String) {
preferences[KEY_PARTNER_CODE] = partnerCode
}
override fun getPartnerCode(): String {
return preferences[KEY_PARTNER_CODE] ?: ""
}
override fun setToken(appName: String) {
preferences[KEY_GET_TOKEN] = appName
}


+ 45
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/ApiInterface.kt View File

@ -1,6 +1,13 @@
package com.nivesh.production.partnerOnBoarding.api
import com.google.gson.JsonObject
import com.nivesh.production.partnerOnBoarding.model.*
import com.nivesh.production.partnerOnBoarding.model.request.PartnerRequest
import com.nivesh.production.partnerOnBoarding.model.request.SaveEAgreementRequest
import com.nivesh.production.partnerOnBoarding.model.request.SendOTPRequest
import com.nivesh.production.partnerOnBoarding.model.request.ValidatePartnerRequest
import okhttp3.MultipartBody
import okhttp3.RequestBody
import retrofit2.Response
import retrofit2.http.*
@ -19,4 +26,42 @@ interface ApiInterface {
@GET("GetbankNames")
suspend fun getIFSCBankDetailsApi(@Query( "bankname") ifsc : String, @Header("token") token: String): Response<String>
@POST("Partner/CreatePartner")
suspend fun postPartnerCreation(@Body partnerRequest: PartnerRequest): Response<JsonObject>
@POST("Partner/ValidatePartner")
suspend fun postPartnerValidate(@Body validatePartnerRequest: ValidatePartnerRequest): Response<JsonObject>
@POST("Partner/SendOTP")
suspend fun postOTP(@Body sendOTPRequest: SendOTPRequest): Response<JsonObject>
@POST("Partner/SendOTP")
suspend fun postSaveEagreementOTP(@Body sendOTPRequest: SendOTPRequest): Response<JsonObject>
@POST("Partner/VerifyOTP")
suspend fun postVerifyOTP(@Body requestBody: RequestBody): Response<JsonObject>
@POST("Partner/GetAMFIDetail")
suspend fun postAMFIDetail(@Body requestBody: RequestBody): Response<JsonObject>
@GET//"User/GetPANDetail"
suspend fun getPANDetail(@Url url: String,@Query("PAN") value: String): Response<JsonObject>
@GET//"User/GetDocumentType"
suspend fun getDocumentType(@Url url: String,@Query("Role") value: String, @Query("Type") type: String): Response<JsonObject>
@Multipart
@POST("Partner/DocumentsUpload")
suspend fun getUploadDocument(
@Part multiPartBody: List<MultipartBody.Part>,
@Part("PartnerCode") partnerCode: Int,
@Part("PartnerRole") partnerRole: Int,
@Part("DocumentId") documentId: Int
): Response<JsonObject>
@POST("Partner/SaveEAgreement")
suspend fun postSaveEAgreement(@Body requestBody: RequestBody): Response<JsonObject>
@GET
suspend fun getAllProduct(@Url url: String): Response<JsonObject>
}

+ 3
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/IPreferenceHelper.kt View File

@ -31,4 +31,7 @@ interface IPreferenceHelper {
fun clearPrefs()
fun getAppId(): String
fun setPartnerCode(partnerCode: String)
fun getPartnerCode(): String
}

+ 18
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Data.kt View File

@ -0,0 +1,18 @@
package com.nivesh.production.partnerOnBoarding.model
data class Data(
val Address1: String,
val Address2: String,
val Address3: String,
val Category: String,
val City: String,
val DOB: String,
val FirstName: String,
val FullName: String,
val Gender: String,
val LastName: String,
val MiddleName: Any,
val Pincode: String,
val State: String,
val Street: String
)

+ 19
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/DataX.kt View File

@ -0,0 +1,19 @@
package com.nivesh.production.partnerOnBoarding.model
import java.io.Serializable
data class DataX(
val ARN: String = "",
val ARNValidFrom: String,
val ARNValidTill: String,
val Address: String,
val City: String,
val State: String,
val EUIN: String,
val FullName: String,
val Pincode: String
) : Serializable {
override fun toString(): String {
return ARN
}
}

+ 6
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Error.kt View File

@ -0,0 +1,6 @@
package com.nivesh.production.partnerOnBoarding.model
data class Error(
val ErrorCode: Int,
val ErrorMessage: String
)

+ 6
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ErrorX.kt View File

@ -0,0 +1,6 @@
package com.nivesh.production.partnerOnBoarding.model
data class ErrorX(
val ErrorCode: Int,
val ErrorMessage: String
)

+ 8
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ImageSelectedModel.kt View File

@ -0,0 +1,8 @@
package com.nivesh.production.partnerOnBoarding.model
import java.io.File
data class ImageSelectedModel(
var file1: File? = null,
var file2: File? = null
)

+ 6
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Result.kt View File

@ -0,0 +1,6 @@
package com.nivesh.production.partnerOnBoarding.model
data class Result(
val Errors: List<Error>,
val PartnerCode: String
)

+ 6
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ResultX.kt View File

@ -0,0 +1,6 @@
package com.nivesh.production.partnerOnBoarding.model
data class ResultX(
val IsPartialRegistered: Boolean,
val PartnerCode: String
)

+ 5
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ResultXX.kt View File

@ -0,0 +1,5 @@
package com.nivesh.production.partnerOnBoarding.model
data class ResultXX(
val Errors: List<ErrorX>
)

+ 6
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/GetAMFIDetailRequest.kt View File

@ -0,0 +1,6 @@
package com.nivesh.production.partnerOnBoarding.model.request
data class GetAMFIDetailRequest(
var Mobile: String = "",
var ARN: String = ""
)

+ 24
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/PartnerRequest.kt View File

@ -0,0 +1,24 @@
package com.nivesh.production.partnerOnBoarding.model.request
import java.io.Serializable
data class PartnerRequest(
var ARNNumber: String = "",
var Address1: String = "",
var Address2: String = "",
var City: String = "",
var DateOfExpiryAMFICertificate: Any? = null,
var DateOfIncorporation: String = "",
var DateOfPassingAMFICertificate: Any? = null,
var EUINNumber: String = "",
var Email: String = "",
var InterestedProductId: List<Any> = emptyList(),
var Mobile: String = "",
var Name: String = "",
var OtherProductName: String = "",
var PAN: String = "",
var PartnerCode: String = "",
var PartnerType: String = "",
var Pin: String = "",
var State: String = ""
) : Serializable

+ 8
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SaveEAgreementRequest.kt View File

@ -0,0 +1,8 @@
package com.nivesh.production.partnerOnBoarding.model.request
data class SaveEAgreementRequest(
var FinancialYear: String = "",
var OTP: Int = 0,
var OTPGenerationDate: String = "",
var SubBrokerCode: String = ""
)

+ 8
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SaveEAgreementRequestX.kt View File

@ -0,0 +1,8 @@
package com.nivesh.production.partnerOnBoarding.model.request
data class SaveEAgreementRequestX(
val FinancialYear: String,
val OTP: Int,
val OTPGenerationDate: String,
val SubBrokerCode: String
)

+ 13
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SendOTPRequest.kt View File

@ -0,0 +1,13 @@
package com.nivesh.production.partnerOnBoarding.model.request
data class SendOTPRequest(
var AMCID: String = "",
var CommunicationValue: String = "",
var ExpiryTime: Int = 0,
var Mode: String = "",
var MsgState: String = "",
var Name: String = "",
var ProductId: Int = 0,
var UserId: String = "",
var UserRole: Int = 0
)

+ 5
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/ValidatePartnerRequest.kt View File

@ -0,0 +1,5 @@
package com.nivesh.production.partnerOnBoarding.model.request
data class ValidatePartnerRequest(
var Mobile: String = ""
)

+ 10
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/Data.kt View File

@ -0,0 +1,10 @@
package com.nivesh.production.partnerOnBoarding.model.response
data class Data(
val DocumentId: Int,
val DocumentType: String
) {
override fun toString(): String {
return DocumentType
}
}

+ 6
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DataX.kt View File

@ -0,0 +1,6 @@
package com.nivesh.production.partnerOnBoarding.model.response
data class DataX(
val ProductId: Int,
val ProductName: String
)

+ 7
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DocumentTypeResponse.kt View File

@ -0,0 +1,7 @@
package com.nivesh.production.partnerOnBoarding.model.response
data class DocumentTypeResponse(
val Message: String,
val Result: ResultXX,
val Status: String
)

+ 9
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DocumentUploadResponse.kt View File

@ -0,0 +1,9 @@
package com.nivesh.production.partnerOnBoarding.model.response
import com.nivesh.production.partnerOnBoarding.model.ResultXX
data class DocumentUploadResponse(
val Message: String,
val Result: ResultXX,
val Status: String
)

+ 7
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/GetAMFIDetailResponse.kt View File

@ -0,0 +1,7 @@
package com.nivesh.production.partnerOnBoarding.model.response
data class GetAMFIDetailResponse(
val Message: String,
val Result: ResultX,
val Status: String
)

+ 7
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/GetAllProductResponse.kt View File

@ -0,0 +1,7 @@
package com.nivesh.production.partnerOnBoarding.model.response
data class GetAllProductResponse(
val Message: String,
val Result: ResultXXX,
val Status: String
)

+ 9
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/PANResponse.kt View File

@ -0,0 +1,9 @@
package com.nivesh.production.partnerOnBoarding.model.response
import java.io.Serializable
data class PANResponse(
val Message: String,
val Result: Result,
val Status: String
) : Serializable

+ 9
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/PartnerResponse.kt View File

@ -0,0 +1,9 @@
package com.nivesh.production.partnerOnBoarding.model.response
import com.nivesh.production.partnerOnBoarding.model.Result
data class PartnerResponse(
val Message: String,
val Result: Result,
val Status: String
)

+ 8
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/Result.kt View File

@ -0,0 +1,8 @@
package com.nivesh.production.partnerOnBoarding.model.response
import com.nivesh.production.partnerOnBoarding.model.Data
data class Result(
val Errors: Any,
val `data`: Data
)

+ 7
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultX.kt View File

@ -0,0 +1,7 @@
package com.nivesh.production.partnerOnBoarding.model.response
import com.nivesh.production.partnerOnBoarding.model.DataX
data class ResultX(
val `data`: List<DataX>
)

+ 5
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultXX.kt View File

@ -0,0 +1,5 @@
package com.nivesh.production.partnerOnBoarding.model.response
data class ResultXX(
val Data: List<Data>
)

+ 5
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultXXX.kt View File

@ -0,0 +1,5 @@
package com.nivesh.production.partnerOnBoarding.model.response
data class ResultXXX(
val Data: List<DataX>
)

+ 7
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/SaveEAgreementResponse.kt View File

@ -0,0 +1,7 @@
package com.nivesh.production.partnerOnBoarding.model.response
data class SaveEAgreementResponse(
val Message: String,
val Result: String,
val Status: String
)

+ 8
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/SendOTPResponse.kt View File

@ -0,0 +1,8 @@
package com.nivesh.production.partnerOnBoarding.model.response
data class SendOTPResponse(
val Message: String,
// val Result: com.nivesh.production.partnerOnBoarding.model.response.Result,
val Status: String
)

+ 7
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ValidateOTPResponse.kt View File

@ -0,0 +1,7 @@
package com.nivesh.production.partnerOnBoarding.model.response
data class ValidateOTPResponse(
val Message: String,
val Result: Any,
val Status: String
)

+ 9
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ValidatePartnerResponse.kt View File

@ -0,0 +1,9 @@
package com.nivesh.production.partnerOnBoarding.model.response
import com.nivesh.production.partnerOnBoarding.model.ResultX
data class ValidatePartnerResponse(
val Message: String,
val Result: ResultX,
val Status: String
)

+ 4
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/DataRepository.kt View File

@ -0,0 +1,4 @@
package com.nivesh.production.partnerOnBoarding.repositories
class DataRepository {
}

+ 41
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/MainRepository.kt View File

@ -1,6 +1,12 @@
package com.nivesh.production.partnerOnBoarding.repositories
import com.nivesh.production.partnerOnBoarding.api.ApiInterface
import com.nivesh.production.partnerOnBoarding.model.request.PartnerRequest
import com.nivesh.production.partnerOnBoarding.model.request.SaveEAgreementRequest
import com.nivesh.production.partnerOnBoarding.model.request.SendOTPRequest
import com.nivesh.production.partnerOnBoarding.model.request.ValidatePartnerRequest
import okhttp3.MultipartBody
import okhttp3.RequestBody
class MainRepository constructor(private val apiInterface: ApiInterface) {
@ -12,4 +18,39 @@ class MainRepository constructor(private val apiInterface: ApiInterface) {
// suspend fun getClientDetailsResponse(getClientDetails: getClientDetailsRequest, token: String) =
// apiInterface.getClientDetails(getClientDetails, token)
//
// suspend fun getPartnerResponse(partnerRequest: PartnerRequest) = apiInterface.postPartnerCreation(partnerRequest)
suspend fun getPartnerCreationResponse(requestBody: PartnerRequest, token: String) =
apiInterface.postPartnerCreation(requestBody)
suspend fun getValidatePartnerResponse(validatePartnerRequest: ValidatePartnerRequest) =
apiInterface.postPartnerValidate(validatePartnerRequest)
suspend fun getSendOTPResponse(sendOTPRequest: SendOTPRequest) =
apiInterface.postOTP(sendOTPRequest)
suspend fun getSendSaveEAgreementOTPResponse(sendOTPRequest: SendOTPRequest) =
apiInterface.postSaveEagreementOTP(sendOTPRequest)
suspend fun getVerifyOTP(requestBody: RequestBody) =
apiInterface.postVerifyOTP(requestBody)
suspend fun getAMFIDetailResponse(requestBody: RequestBody) =
apiInterface.postAMFIDetail(requestBody)
suspend fun getPANDetailResponse(url: String,value: String) =
apiInterface.getPANDetail(url,value)
suspend fun getDocumentTypeResponse(url: String,value: String,type: String) =
apiInterface.getDocumentType(url,value,type)
suspend fun getDocumentUploadResponse(multipartBody: List<MultipartBody.Part>,pc: Int,pr: Int,di: Int) =
apiInterface.getUploadDocument(multipartBody,pc,pr,di)
suspend fun getSaveEAgreement(requestBody: RequestBody, token: String) =
apiInterface.postSaveEAgreement(requestBody)
suspend fun getAllProduct(url: String) =
apiInterface.getAllProduct(url)
}

+ 4
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/RegisterActivity.kt View File

@ -37,10 +37,12 @@ class RegisterActivity : BaseActivity() {
if (!PreferenceManager(this@RegisterActivity).getFirstTime()){
intent = Intent(this@RegisterActivity, ViewPagerActivity::class.java)
intent.putExtra("type", 4)
intent.putExtra("arnType","advisory")
startActivity(intent)
}else{
intent = Intent(this@RegisterActivity, SignUpActivity::class.java)
intent.putExtra("type", 4)
intent.putExtra("arnType","advisory")
startActivity(intent)
}
}
@ -48,10 +50,12 @@ class RegisterActivity : BaseActivity() {
if (!PreferenceManager(this@RegisterActivity).getFirstTime()){
intent = Intent(this@RegisterActivity, ViewPagerActivity::class.java)
intent.putExtra("type", 3)
intent.putExtra("arnType","Associate")
startActivity(intent)
}else{
intent = Intent(this@RegisterActivity, SignUpActivity::class.java)
intent.putExtra("type", 3)
intent.putExtra("arnType","Associate")
startActivity(intent)
}
}


+ 24
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/SignUpActivity.kt View File

@ -1,12 +1,19 @@
package com.nivesh.production.partnerOnBoarding.ui.activities
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import com.nivesh.production.partnerOnBoarding.R
import com.nivesh.production.partnerOnBoarding.api.ApiClient
import com.nivesh.production.partnerOnBoarding.databinding.ActivitySignupBinding
import com.nivesh.production.partnerOnBoarding.providerfactory.OnBoardingModelProviderFactory
import com.nivesh.production.partnerOnBoarding.repositories.MainRepository
import com.nivesh.production.partnerOnBoarding.ui.fragments.SignUpFragment
import com.nivesh.production.partnerOnBoarding.viewModels.OnBoardingViewModel
class SignUpActivity : BaseActivity() {
lateinit var binding: ActivitySignupBinding
lateinit var viewModelOne: OnBoardingViewModel
// lateinit var viewModelTwo: OnBoardingViewModel
var type: Int? = null
override fun onCreate(savedInstanceState: Bundle?) {
@ -15,6 +22,22 @@ class SignUpActivity : BaseActivity() {
}
private fun init() {
// viewModel = ViewModelProvider(
// this@SignUpActivity,
// ViewModelProviderFactory(MainRepository(ApiClient.getApiClient))
// )[OnBoardingViewModel::class.java]
viewModelOne = ViewModelProvider(
this@SignUpActivity,
OnBoardingModelProviderFactory(MainRepository(ApiClient.getApiClientOne))
)[OnBoardingViewModel::class.java]
// viewModelTwo = ViewModelProvider(
// this@SignUpActivity,
// OnBoardingModelProviderFactory(MainRepository(ApiClient.getApiClientTwo))
// )[OnBoardingViewModel::class.java]
type = intent.getIntExtra("type", 0)
binding = ActivitySignupBinding.inflate(layoutInflater)
@ -23,6 +46,7 @@ class SignUpActivity : BaseActivity() {
}
val bundle = Bundle()
bundle.putInt("type", type!!)
bundle.putString("arnType",intent.getStringExtra("arnType"))
val fragment = SignUpFragment()
fragment.arguments = bundle


+ 223
- 53
app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/AlmostThereFragment.kt View File

@ -1,18 +1,40 @@
package com.nivesh.production.partnerOnBoarding.ui.fragments
import android.os.Build
import android.os.Bundle
import android.text.Editable
import android.text.TextUtils
import android.text.TextWatcher
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.lifecycle.ViewModelProvider
import com.google.gson.Gson
import com.nivesh.production.partnerOnBoarding.R
import com.nivesh.production.partnerOnBoarding.api.ApiClient
import com.nivesh.production.partnerOnBoarding.databinding.FragmentAlmostThereBinding
import com.nivesh.production.partnerOnBoarding.db.PreferenceManager
import com.nivesh.production.partnerOnBoarding.model.DataX
import com.nivesh.production.partnerOnBoarding.model.request.PartnerRequest
import com.nivesh.production.partnerOnBoarding.model.request.SaveEAgreementRequest
import com.nivesh.production.partnerOnBoarding.model.response.DocumentTypeResponse
import com.nivesh.production.partnerOnBoarding.model.response.PANResponse
import com.nivesh.production.partnerOnBoarding.model.response.PartnerResponse
import com.nivesh.production.partnerOnBoarding.providerfactory.OnBoardingModelProviderFactory
import com.nivesh.production.partnerOnBoarding.repositories.MainRepository
import com.nivesh.production.partnerOnBoarding.ui.activities.BaseActivity
import com.nivesh.production.partnerOnBoarding.util.Common
import com.nivesh.production.partnerOnBoarding.ui.activities.SignUpActivity
import com.nivesh.production.partnerOnBoarding.viewModels.OnBoardingViewModel
class AlmostThereFragment : BaseFragment() {
private var _binding: FragmentAlmostThereBinding? = null
private val binding get() = _binding!!
lateinit var viewModel: OnBoardingViewModel
// private lateinit var arnData: DataX
// private lateinit var panResponse: PANResponse
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
@ -27,27 +49,115 @@ class AlmostThereFragment : BaseFragment() {
}
private fun init() {
binding.edtDay.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
Common.removeError(binding.tlDay)
}
})
binding.edtMonth.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
Common.removeError(binding.tlMonth)
}
})
binding.edtYear.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
Common.removeError(binding.tlYear)
viewModel = ViewModelProvider(
(activity as SignUpActivity),
OnBoardingModelProviderFactory(MainRepository(ApiClient.getApiClientOne))
)[OnBoardingViewModel::class.java]
val partnerRequest: PartnerRequest =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
arguments?.getSerializable("Inputvalue", PartnerRequest::class.java)!!
} else {
(arguments?.getSerializable("Inputvalue") as? PartnerRequest)!!
}
})
val arnData: DataX? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
arguments?.getSerializable("arnData", DataX::class.java)
} else {
(arguments?.getSerializable("arnData") as? DataX)!!
}
val panResponse: PANResponse? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
arguments?.getSerializable("PANDATA", PANResponse::class.java)
} else {
(arguments?.getSerializable("PANDATA") as? PANResponse)!!
}
Log.e("check_arn_Data", arnData.toString() + "\n" + panResponse.toString())
if (panResponse != null)
binding.edtDate.setText(panResponse.Result.data.DOB)
//TODO: Set AMFI Data if Availabe else set PAN Data
if (arnData?.FullName != null) {
binding.edtFullName.setText(arnData.FullName)
} else if (panResponse?.Result?.data?.FullName != null) {
binding.edtFullName.setText(panResponse.Result.data.FullName)
} else {
binding.edtFullName.setText("")
}
//TODO: Set Address Line1 Data from AMFI if Available else from Pan
if (arnData?.Address != null) {
binding.edtAddressLine1.setText(arnData.Address)
} else if (panResponse?.Result?.data?.Address1 != null) {
binding.edtAddressLine1.setText(panResponse.Result.data.Address1)
} else {
binding.edtAddressLine1.setText("")
}
//TODO: Set Address Line2 Data from Pan
if (panResponse?.Result?.data?.Address2 != null) {
binding.edtAddressLine2.setText(panResponse.Result.data.Address2)
} else {
binding.edtAddressLine2.setText("")
}
//TODO: Set Pin Data from AMFI if Available else from Pan
if (arnData?.Pincode != null) {
binding.edtPinCode.setText(arnData.Pincode)
} else if (panResponse?.Result?.data?.Pincode != null) {
binding.edtPinCode.setText(panResponse.Result.data.Pincode)
} else {
binding.edtPinCode.setText("")
}
//TODO: Set City Data from AMFI if Available else from Pan
if (arnData?.City != null) {
binding.spCity.setText(arnData.City)
} else if (panResponse?.Result?.data?.City != null) {
binding.spCity.setText(panResponse.Result.data.City)
} else {
binding.spCity.setText("")
}
//TODO: Set State Data from AMFI if Available else from Pan
if (arnData?.State != null) {
binding.spState.setText(arnData.State)
} else if (panResponse?.Result?.data?.State != null) {
binding.spState.setText(panResponse.Result.data.State)
} else {
binding.spState.setText("")
}
binding.edtDate.setOnClickListener {
Common.datePicker(activity as SignUpActivity, binding.edtDate)
}
// binding.edtDate.addTextChangedListener(object : TextWatcher {
// override fun afterTextChanged(s: Editable?) {}
// override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
// override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
// Common.removeError(binding.tlDay)
// }
// })
// binding.edtMonth.addTextChangedListener(object : TextWatcher {
// override fun afterTextChanged(s: Editable?) {}
// override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
// override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
// Common.removeError(binding.tlMonth)
// }
// })
// binding.edtYear.addTextChangedListener(object : TextWatcher {
// override fun afterTextChanged(s: Editable?) {}
// override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
// override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
// Common.removeError(binding.tlYear)
// }
// })
binding.edtFullName.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {}
@ -103,89 +213,149 @@ class AlmostThereFragment : BaseFragment() {
}
binding.btnBack.setOnClickListener {
// (activity as SignUpActivity).onBackPressedDispatcher
(activity as SignUpActivity).onBackPressedDispatcher.onBackPressed()
}
binding.btnNext.setOnClickListener {
if (validate()) {
// submit
//TODO: ARN,EUIN,ECertificate,Name,Pan,PCertificate value getting from Previous Fragment
partnerRequest.Pin = binding.edtPinCode.text.toString()
partnerRequest.City = binding.spCity.text.toString()
partnerRequest.State = binding.spState.text.toString()
partnerRequest.Address1 = binding.edtAddressLine1.text.toString()
partnerRequest.Address2 = binding.edtAddressLine2.text.toString()
partnerRequest.Email = binding.edtEmail.text.toString()
partnerRequest.InterestedProductId = emptyList()
partnerRequest.Mobile = arguments?.getString("mobile")!!
partnerRequest.OtherProductName = ""
partnerRequest.PartnerCode = PreferenceManager((activity as SignUpActivity)).getPartnerCode()
partnerRequest.PartnerType = "advisory"
Log.e("check_partner",partnerRequest.toString())
apiPartnerCreation(partnerRequest)
// ApiClient.getApiClient.postPartnerCreation(partnerCreation)
}
}
}
private fun apiPartnerCreation(partnerRequest: PartnerRequest) {
(activity as SignUpActivity).viewModelOne.getPartnerCreateData(
partnerRequest,
"",
(activity as SignUpActivity)
)
(activity as SignUpActivity).viewModelOne.getPartnerCreationMutableData.observe(
viewLifecycleOwner
) { response ->
val res: PartnerResponse =
Gson().fromJson(
response?.data.toString(),
PartnerResponse::class.java
)
Log.e("check_res_partner", res.toString())
if(res.Status == "success") {
Toast.makeText(requireActivity(), res.Message, Toast.LENGTH_LONG).show()
var bundle = Bundle()
bundle.putSerializable("mobile",arguments?.getString("mobile")!!)
bundle.putSerializable("email",binding.edtEmail.text.toString())
val fragment = SaveEAgreementFragment()
fragment.arguments = bundle
replaceFragment(
activity as BaseActivity,
R.id.signUpContainer,
fragment,
"AlmostThereFragment",
true
)
}
}
// (activity as SignUpActivity).viewModel.getPartnerCreation(partnerRequest,"",activity as SignUpActivity)
// (activity as SignUpActivity).viewModel.postPartnerCreationViewModel.observe(viewLifecycleOwner){ resposne ->
// when (resposne){
// is Resource.Success ->{
// Log.e("check_res",resposne.toString())
// }
// is Resource.Error -> {
// Log.e("check_error",resposne.toString())
// }
// is Resource.DataError ->{
// Log.e("check_data_error",resposne.toString())
// }
// is Resource.Loading ->{
// Log.e("check_loading",resposne.toString())
// }
// }
// }
}
private fun validate(): Boolean {
return if (binding.edtDay.text.toString().isEmpty()) { // EditText
return if (binding.edtDate.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
binding.edtDay,
binding.edtDate,
binding.tlDay,
""
)
} else if (binding.edtMonth.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
binding.edtMonth,
binding.tlMonth,
""
)
} else if (binding.edtYear.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
binding.edtYear,
binding.tlYear,
""
getString(R.string.emptyDOB)
)
} else if (binding.edtFullName.text.toString().isEmpty()) { // EditText
}
else if (binding.edtFullName.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
binding.edtFullName,
binding.tlFullName,
""
getString(R.string.full_name_as_on_pan_card)
)
} else if (binding.edtEmail.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
binding.edtFullName,
binding.tlFullName,
""
binding.edtEmail,
binding.tlEmail,
getString(R.string.enterEmailAddress)
)
} else if (!Common.isValidEmail(binding.edtEmail.text.toString())) { // EditText
Common.commonErrorMethod(
binding.edtFullName,
binding.tlFullName,
""
getString(R.string.invalidEmail)
)
} else if (binding.edtAddressLine1.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
binding.edtAddressLine1,
binding.tlAddressLine1,
""
getString(R.string.emptyAddressLine1)
)
} else if (binding.edtPinCode.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
binding.edtPinCode,
binding.tlPinCode,
""
getString(R.string.emptyPinCode)
)
} else if (binding.edtPinCode.text.toString().length != 6) { // EditText
Common.commonErrorMethod(
binding.edtPinCode,
binding.tlPinCode,
""
getString(R.string.validPinCode)
)
} else if (binding.spCity.text.toString().isEmpty()) { // EditText
}
else if (binding.spCity.text.toString().isEmpty()) { // EditText
Common.commonSpinnerErrorMethod(
binding.spCity,
binding.tlCity,
""
getString(R.string.emptyCity)
)
} else if (binding.spState.text.toString().isEmpty()) { // EditText
}
else if (binding.spState.text.toString().isEmpty()) { // EditText
Common.commonSpinnerErrorMethod(
binding.spState,
binding.tlState,
""
getString(R.string.emptyState)
)
} else if (!binding.cbCheck.isChecked) { // EditText
}
else if(!binding.cbCheck.isChecked){
Common.showDialogValidation((activity as SignUpActivity),getString(R.string.termsConditionText))
return false
} else {
return true
}
else return binding.cbCheck.isChecked
}
}

+ 630
- 140
app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/GetStartedFragment.kt View File

@ -1,3 +1,5 @@
@file:Suppress("SENSELESS_COMPARISON")
package com.nivesh.production.partnerOnBoarding.ui.fragments
import android.Manifest
@ -11,32 +13,57 @@ import android.graphics.BitmapFactory
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.provider.OpenableColumns
import android.text.Editable
import android.text.TextUtils
import android.text.TextWatcher
import android.util.Base64
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.google.android.material.textfield.MaterialAutoCompleteTextView
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import com.google.gson.Gson
import com.nivesh.production.partnerOnBoarding.BuildConfig
import com.nivesh.production.partnerOnBoarding.R
import com.nivesh.production.partnerOnBoarding.api.ApiClient
import com.nivesh.production.partnerOnBoarding.databinding.FragmentGetStartedBinding
import com.nivesh.production.partnerOnBoarding.model.DataX
import com.nivesh.production.partnerOnBoarding.model.request.PartnerRequest
import com.nivesh.production.partnerOnBoarding.model.response.*
import com.nivesh.production.partnerOnBoarding.providerfactory.OnBoardingModelProviderFactory
import com.nivesh.production.partnerOnBoarding.repositories.MainRepository
import com.nivesh.production.partnerOnBoarding.ui.activities.BaseActivity
import com.nivesh.production.partnerOnBoarding.ui.activities.SignUpActivity
import com.nivesh.production.partnerOnBoarding.util.Common
import com.nivesh.production.partnerOnBoarding.util.*
import com.nivesh.production.partnerOnBoarding.util.Common.Companion.getFileExtension
import com.nivesh.production.partnerOnBoarding.util.Common.Companion.showDialogValidation
import com.nivesh.production.partnerOnBoarding.util.Common.Companion.showDialogWithTwoButtons
import com.nivesh.production.partnerOnBoarding.util.ImageUtil
import com.nivesh.production.partnerOnBoarding.viewModels.OnBoardingViewModel
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.MultipartBody
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.asRequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject
import java.io.*
import java.util.*
import kotlin.collections.ArrayList
class GetStartedFragment : BaseFragment() {
private var _binding: FragmentGetStartedBinding? = null
@ -45,9 +72,10 @@ class GetStartedFragment : BaseFragment() {
private var takeImageResult: ActivityResultLauncher<Uri>? = null
private var selectImageIntent: ActivityResultLauncher<String>? = null
private var bitmap: Bitmap? = null
private var isPanVerify: Boolean = false
private val mainPANUpload: Int = 1
private val mainPhotoUpload: Int = 2
private val firstDocUpload: Int = 3
private val mainARNPhotoUpload: Int = 2
private val mainEUINPhotoUpload: Int = 3
private val secondDocUpload: Int = 4
private var actionType: Int = -1
@ -63,8 +91,21 @@ class GetStartedFragment : BaseFragment() {
private var uploadPosition = 0
private var isFront: Boolean = false
private var preSelectedDate = ""
private var preSelectedDate2 = ""
var year = 0
var month = 0
var day = 0
private var cal = Calendar.getInstance()
lateinit var viewModel: OnBoardingViewModel
private lateinit var listOfDocType: List<Data>
private var imageSelectedList = ArrayList<File>()
private var arnList = ArrayList<DataX>()
private lateinit var arnData: DataX
private lateinit var panRes: PANResponse
private var isCharacterTotalCountReach = false
private val MaxFileSize = 5
private val listArray = ArrayList<String>()
private val permissions = arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
@ -146,82 +187,52 @@ class GetStartedFragment : BaseFragment() {
return isCorrect
}
@SuppressLint("SuspiciousIndentation")
private fun init() {
viewModel = ViewModelProvider(
(activity as SignUpActivity),
OnBoardingModelProviderFactory(MainRepository(ApiClient.getApiClientOne))
)[OnBoardingViewModel::class.java]
var total_SYMBOLS: Int = 14
var TOTAL_DIGITS: Int = 12 // max numbers of digits in pattern: 0000 x 4
var DIVIDER_MODULO: Int = 4 // means divider position is every 5th symbol beginning with 1
var DIVIDER_POSITION: Int = DIVIDER_MODULO - 1; // means divider position is every 4th symbol beginning with 0
var DIVIDER: Char = '-'
var docType = "I"
if (arguments?.getString("arnType").equals("Associate", true)) {
binding.edtArnNumber.visibility = View.GONE
binding.tlArnNumber.visibility = View.GONE
binding.edtEUINNumber.addTextChangedListener(object : TextWatcher{
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
if (!isInputCorrect(s, total_SYMBOLS, DIVIDER_MODULO, DIVIDER)) {
s.replace(0, s.length, buildCorrectString(getDigitArray(s, TOTAL_DIGITS), DIVIDER_POSITION, DIVIDER))
}
}
binding.edtEUINNumber.visibility = View.GONE
binding.tlArnNumber.visibility = View.GONE
private fun isInputCorrect(
s: Editable,
totalSymbols: Int,
dividerModulo: Int,
divider: Char
): Boolean {
var isCorrect = s.length <= totalSymbols // check size of entered string
for (i in s.indices) { // check that every element is right
isCorrect = if (i > 0 && (i + 1) % dividerModulo == 0) {
isCorrect and (divider == s[i])
} else {
isCorrect and Character.isDigit(s[i])
}
}
return isCorrect
}
binding.edtPassingAMFI.visibility = View.GONE
binding.tlPassingAMFI.visibility = View.GONE
private fun buildCorrectString(
digits: CharArray,
dividerPosition: Int,
divider: Char
): String {
val formatted = StringBuilder()
for (i in digits.indices) {
if (digits[i].code != 0) {
formatted.append(digits[i])
if (i > 0 && i < digits.size - 1 && (i + 1) % dividerPosition == 0) {
formatted.append(divider)
}
}
}
return formatted.toString()
}
binding.edtExpiryAMFI.visibility = View.GONE
binding.tlExpiryAMFI.visibility = View.GONE
docType = "N"
private fun getDigitArray(s: Editable, size: Int): CharArray {
val digits = CharArray(size)
var index = 0
var i = 0
while (i < s.length && index < size) {
val current = s[i]
if (Character.isDigit(current)) {
digits[index] = current
index++
}
i++
}
return digits
}
} else if (arguments?.getString("arnType").equals("advisory", true)) {
binding.edtArnNumber.visibility = View.VISIBLE
binding.tlArnNumber.visibility = View.VISIBLE
})
binding.edtEUINNumber.visibility = View.VISIBLE
binding.tlArnNumber.visibility = View.VISIBLE
// binding.edtEUINNumber.doAfterTextChanged {
// val formattedText = binding.edtEUINNumber.toString().replace(" ", "").chunked(4).joinToString("/")
// if (formattedText != binding.edtEUINNumber.toString()) {
// binding.edtEUINNumber.setText(formattedText)
// binding.edtEUINNumber.setSelection(binding.edtEUINNumber.length())
// }
// }
binding.edtPassingAMFI.visibility = View.VISIBLE
binding.tlPassingAMFI.visibility = View.VISIBLE
binding.edtExpiryAMFI.visibility = View.VISIBLE
binding.tlExpiryAMFI.visibility = View.VISIBLE
docType = "I"
}
documentTypeAPI(docType)
binding.edtPassingAMFI.setOnClickListener {
Common.datePicker(activity as SignUpActivity, binding.edtPassingAMFI)
}
binding.edtExpiryAMFI.setOnClickListener {
Common.datePicker(activity as SignUpActivity, binding.edtExpiryAMFI)
}
selectImageIntent = registerForActivityResult(ActivityResultContracts.GetContent())
{ uri: Uri? ->
@ -231,64 +242,495 @@ class GetStartedFragment : BaseFragment() {
}
}
takeImageResult =
registerForActivityResult(ActivityResultContracts.TakePicture()) { isSuccess ->
if (isSuccess) {
latestTmpUri?.let { uri ->
uploadDocument(uri, "c")
}
binding.edtArnNumber.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
if (s?.length!! == 7) {
apiAMFIDetail("ARN", s.toString())
}
}
binding.btnNext.setOnClickListener {
override fun afterTextChanged(s: Editable?) {}
})
binding.ivInfo.setOnClickListener {
replaceFragment(
activity as BaseActivity,
R.id.signUpContainer,
AlmostThereFragment(),
QuestionsFragment(),
"GET STARTED",
true
)
}
listArray.add("Aadhaar")
listArray.add("Passport")
listArray.add("Driving Licenses")
listArray.add("Voter Id")
binding.edtArnNumber.setOnItemClickListener { _, _, position, _ ->
if (arnList != null && arnList.size > 0) {
arnData = arnList[position]
if (arnData.EUIN != null)
binding.edtEUINNumber.setText(arnData.EUIN)
val arrayAdapter = ArrayAdapter(
activity as SignUpActivity,
androidx.appcompat.R.layout.support_simple_spinner_dropdown_item,
listArray
)
binding.spDocType.setAdapter(arrayAdapter)
if (arnData.ARNValidFrom != null)
binding.edtPassingAMFI.setText(arnData.ARNValidFrom)
binding.spDocType.setOnItemClickListener { _, _, position, _ ->
setVisibility(listArray[position])
if (arnData.ARNValidTill != null)
binding.edtExpiryAMFI.setText(arnData.ARNValidTill)
} else {
binding.edtEUINNumber.setText("")
binding.edtPassingAMFI.setText("")
binding.edtExpiryAMFI.setText("")
}
}
takeImageResult =
registerForActivityResult(ActivityResultContracts.TakePicture()) { isSuccess ->
if (isSuccess) {
latestTmpUri?.let { uri ->
uploadDocument(uri, "c")
}
}
}
binding.btnNext.setOnClickListener {
// apiUploadDocument()
if (arguments?.getString("arnType").equals("Associate", false)) {
val pt = PartnerRequest()
pt.Name = binding.edtFullNamePanCard.text.toString()
pt.PAN = binding.edtPanNumber.text.toString()
val fragment = AlmostThereFragment()
val bundle = Bundle()
bundle.putSerializable("Inputvalue", pt)
bundle.putSerializable("arnData", arnData)
bundle.putSerializable("PANDATA", panRes)
bundle.putString("mobile", arguments?.getString("mobile"))
fragment.arguments = bundle
replaceFragment(
activity as BaseActivity,
R.id.signUpContainer,
fragment,
"GET STARTED",
true
)
} else if (arguments?.getString("arnType").equals("advisory", false)) {
if (validation()) {
val pt = PartnerRequest()
pt.ARNNumber = binding.edtArnNumber.text.toString()
pt.EUINNumber = binding.edtEUINNumber.text.toString()
pt.DateOfExpiryAMFICertificate = binding.edtExpiryAMFI.text.toString()
pt.Name = binding.edtFullNamePanCard.text.toString()
pt.PAN = binding.edtPanNumber.text.toString()
pt.DateOfPassingAMFICertificate = binding.edtPassingAMFI.text.toString()
val fragment = AlmostThereFragment()
val bundle = Bundle()
bundle.putSerializable("Inputvalue", pt)
bundle.putSerializable("arnData", arnData)
bundle.putSerializable("PANDATA", panRes)
bundle.putString("mobile", arguments?.getString("mobile"))
fragment.arguments = bundle
replaceFragment(
activity as BaseActivity,
R.id.signUpContainer,
fragment,
"GET STARTED",
true
)
}
}
}
binding.uploadFront.setOnClickListener {
actionType = mainPANUpload
isFront = true
selectImage()
if (docValue.isNotBlank() && docValue.isNotEmpty()) {
selectImage()
} else {
showDialogValidation(
activity as SignUpActivity,
resources.getString(R.string.selectAddressProof)
)
}
}
binding.mbUploadChangeFront.setOnClickListener {
actionType = mainPANUpload
isFront = true
selectImage()
if (docValue.isNotBlank() && docValue.isNotEmpty()) {
selectImage()
} else {
showDialogValidation(
activity as SignUpActivity,
resources.getString(R.string.selectAddressProof)
)
}
}
binding.mbUploadChangeBack.setOnClickListener {
actionType = mainPANUpload
isFront = false
selectImage()
if (docValue.isNotBlank() && docValue.isNotEmpty()) {
selectImage()
} else {
showDialogValidation(
activity as SignUpActivity,
resources.getString(R.string.selectAddressProof)
)
}
}
binding.uploadBack.setOnClickListener {
actionType = mainPANUpload
isFront = false
if (docValue.isNotBlank() && docValue.isNotEmpty()) {
selectImage()
} else {
showDialogValidation(
activity as SignUpActivity,
resources.getString(R.string.selectAddressProof)
)
}
}
binding.rlARNUpload.setOnClickListener{
actionType = mainARNPhotoUpload
selectImage()
}
binding.rlEUINUpload.setOnClickListener{
actionType = mainEUINPhotoUpload
selectImage()
}
binding.edtPanNumber.addTextChangedListener(object : TextWatcher {
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
Common.removeError(binding.tlPanNumber)
if(s.toString().length > 3 && s.toString()[3] != 'P'){
binding.rlEUINUpload.visibility = View.VISIBLE
if(!TextUtils.isEmpty(binding.edtEUINNumber.text)){
binding.edtEUINNumberNF.setText(binding.edtEUINNumber.text.toString())
binding.edtEUINNumber.visibility = View.GONE
}
}else if(s.toString().length > 3 && s.toString()[3] == 'P'){
binding.rlEUINUpload.visibility = View.GONE
}
if (s.toString().trim().length >= 10 && !isPanVerify) {
apiPANVerify(s.toString().trim())
} else if (s.toString().trim().length < 10 && !isPanVerify) {
binding.edtPanNumber.setCompoundDrawablesWithIntrinsicBounds(
0,
0,
0,
0
)
binding.edtFullNamePanCard.setText("")
}else if(s.toString().length < 10){
isPanVerify = false
binding.edtPanNumber.setCompoundDrawablesWithIntrinsicBounds(
0,
0,
0,
0
)
}
else {
binding.edtPanNumber.setCompoundDrawablesWithIntrinsicBounds(
0,
0,
R.drawable.svg_pan_verified,
0
)
}
}
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
})
binding.spDocType.onItemClickListener =
AdapterView.OnItemClickListener { parent, _, position, _ ->
val getCodes: Data = parent.getItemAtPosition(position) as Data
imageSelectedList.clear()
docValue = getCodes.DocumentType
setVisibility(listOfDocType[position].DocumentType)
}
}
private fun documentTypeAPI(docType: String) {
try {
ProgressUtil.showLoading(activity as SignUpActivity)
(activity as SignUpActivity).viewModelOne.getDocumentType(
"3",//Currently it is static
docType,
Constants.BASE_URL_COMMON + "User/GetAllDocumentsType",
(activity as SignUpActivity)
)
ProgressUtil.hideLoading()
(activity as SignUpActivity).viewModelOne.getDocumentTypeMutableData.observe(
viewLifecycleOwner
) { response ->
val res: DocumentTypeResponse =
Gson().fromJson(
response?.data.toString(),
DocumentTypeResponse::class.java
)
Log.e("checkDocRes", res.toString())
if (res.Status == "success") {
listOfDocType = res.Result.Data
if (listOfDocType.isNotEmpty()) {
val adapter = ArrayAdapter(
activity as SignUpActivity,
android.R.layout.simple_list_item_1,
listOfDocType
)
binding.spDocType.setAdapter(adapter)
}
}
//TODO: Check AMFI Data Available or not
apiAMFIDetail("Mobile", arguments?.getString("mobile"))
// apiAMFIDetail("Mobile", "1722651388")
}
} catch (e: Exception) {
// ProgressUtil.hideLoading()
Log.e("checkPANError", e.message.toString())
}
}
private fun prepareImagePart(file: File, partName: String): MultipartBody.Part {
var requestBody: RequestBody =
file.asRequestBody("application/octet-stream".toMediaTypeOrNull())
return MultipartBody.Part.createFormData(
"Files",
partName,
requestBody
)
}
private fun apiUploadDocument() {
if (imageSelectedList != null && imageSelectedList.size != 0) {
var part = ArrayList<MultipartBody.Part>()
imageSelectedList.forEachIndexed { index, element ->
if (index == 0) {
part.add(prepareImagePart(element, "front"))
} else {
part.add(prepareImagePart(element, "back"))
}
}
(activity as SignUpActivity).viewModelOne.getDocumentUpload(
part,
3,
5,
8,
(activity as SignUpActivity)
)
(activity as SignUpActivity).viewModelOne.getDocumentUploadMutableData.observe(
viewLifecycleOwner
) { response ->
Log.e("check_upload_res", response.toString())
val res: DocumentUploadResponse =
Gson().fromJson(
response?.data.toString(),
DocumentUploadResponse::class.java
)
if (res.Status == "success") {
Toast.makeText(activity as SignUpActivity, res.Message, Toast.LENGTH_LONG)
.show()
}
}
}
}
private fun apiPANVerify(pan: String) {
try {
ProgressUtil.showLoading(activity as SignUpActivity)
(activity as SignUpActivity).viewModelOne.getPANDetail(
pan,
Constants.BASE_URL_COMMON + "User/GetPANDetail",
(activity as SignUpActivity)
)
(activity as SignUpActivity).viewModelOne.getPANDetailMutableData.observe(
viewLifecycleOwner
) { response ->
ProgressUtil.hideLoading()
val res: PANResponse =
Gson().fromJson(
response?.data.toString(),
PANResponse::class.java
)
panRes = res
isPanVerify = if (res.Status == "success") {
binding.edtPanNumber.setCompoundDrawablesWithIntrinsicBounds(
0,
0,
R.drawable.svg_pan_verified,
0
)
binding.edtFullNamePanCard.setText(res.Result.data.FullName)
true
} else {
commonErrorMethod(
binding.edtPanNumber,
binding.tlPanNumber,
getString(R.string.invalidPAN)
)
}
}
} catch (e: Exception) {
ProgressUtil.hideLoading()
Log.e("checkPANError", e.message.toString())
}
}
private fun apiAMFIDetail(type: String, value: String?) {
var jsonObject = JSONObject()
val mediaType = "application/json; charset=utf-8".toMediaType()
var body: RequestBody
try {
jsonObject.put(type, value)
body = jsonObject.toString().toRequestBody(mediaType)
(activity as SignUpActivity).viewModelOne.getAMFIDetail(
body,
"",
(activity as SignUpActivity)
)
(activity as SignUpActivity).viewModelOne.getAMFIDetailMutableData.observe(
viewLifecycleOwner
) { response ->
val res: GetAMFIDetailResponse =
Gson().fromJson(
response?.data.toString(),
GetAMFIDetailResponse::class.java
)
//TODO: Need to set up Data if not null
if (res != null && res.Result.data != null) {
arnList.clear()
arnList = res.Result.data as ArrayList<DataX>
if (res.Status == "success") {
if (type == "ARN") {
if (arnList.size > 0) {
arnData = arnList[0]
if (arnData.EUIN != null)
binding.edtEUINNumber.setText(arnData.EUIN)
if (arnData.ARNValidFrom != null)
binding.edtPassingAMFI.setText(arnData.ARNValidFrom)
if (arnData.ARNValidTill != null)
binding.edtExpiryAMFI.setText(arnData.ARNValidTill)
}
setARNEUIN(View.GONE)
} else {
var adapter = ArrayAdapter(
(activity as SignUpActivity),
androidx.appcompat.R.layout.support_simple_spinner_dropdown_item,
arnList
)
binding.edtArnNumber.setAdapter(adapter)
}
}else if(type == "ARN" && binding.edtArnNumber.text.length >= 7){
setARNEUIN(View.VISIBLE)
}
}
}
} catch (e: Exception) {
Log.e("check_error", e.message.toString() + "\n" + type + "\n" + value)
}
}
private fun setARNEUIN(visibility: Int) {
binding.rlARNUpload.visibility = visibility
// binding.rlEUINUpload.visibility = visibility
// if(visibility==View.VISIBLE) binding.tlEUINNumber.visibility = View.GONE
// else binding.tlEUINNumber.visibility = View.VISIBLE
}
private fun commonErrorMethod(
inputText: TextInputEditText,
inputError: TextInputLayout,
strMessage: String
): Boolean {
inputText.requestFocus()
inputError.error = strMessage
return false
}
private fun commonErrorMethodAutoComplete(
inputText: MaterialAutoCompleteTextView,
inputError: TextInputLayout,
strMessage: String
): Boolean {
inputText.requestFocus()
inputError.error = strMessage
return false
}
private fun validation(): Boolean {
return if (binding.edtArnNumber.text.toString().isEmpty()) {
commonErrorMethodAutoComplete(
binding.edtArnNumber,
binding.tlArnNumber,
getString(R.string.pleaseArnNum)
)
} else if (binding.edtEUINNumber.text.toString().isEmpty()) {
commonErrorMethod(
binding.edtEUINNumber,
binding.tlEUINNumber,
getString(R.string.pleaseEuinNum)
)
} else if (binding.edtPassingAMFI.text.toString().isEmpty()) {
commonErrorMethod(
binding.edtPassingAMFI,
binding.tlPassingAMFI,
getString(R.string.pleasePassingCertificate)
)
} else if (binding.edtExpiryAMFI.text.toString().isEmpty()) {
commonErrorMethod(
binding.edtExpiryAMFI,
binding.tlExpiryAMFI,
getString(R.string.pleaseExpirCertificate)
)
} else if (binding.edtPanNumber.text.toString().isEmpty()) {
commonErrorMethod(
binding.edtPanNumber,
binding.tlPanNumber,
getString(R.string.emptyPAN)
)
} else if (binding.edtFullNamePanCard.text.toString().isEmpty()) {
commonErrorMethod(
binding.edtFullNamePanCard,
binding.tlFullNamePanCard,
getString(R.string.full_name_as_on_pan_card)
)
} else if (imageSelectedList == null && imageSelectedList.size == 0) {
showDialogValidation(
(activity as SignUpActivity),
resources.getString(R.string.selectAddressProof)
)
false
} else {
true
}
}
private fun setUploadOption(checked: Boolean) {
@ -376,6 +818,7 @@ class GetStartedFragment : BaseFragment() {
}
private fun setVisibility(s: String) {
binding.llDoc.visibility = View.VISIBLE
if (s.contains("Aadhaar")) {
binding.txtFront.visibility = View.VISIBLE
binding.uploadFront.visibility = View.VISIBLE
@ -475,58 +918,105 @@ class GetStartedFragment : BaseFragment() {
val size: Double = Common.getFileSizeInMB(fileExtension.length())
setFrontHideVisible(uri)
if (size < 5) {
if (type == "c") encodedPANBase64(fileExtension)
else panString = bitmap?.let { ImageUtil.convert(it) }.toString()
if (size < MaxFileSize) {
if (type == "c") {
encodedPANBase64(fileExtension)
if (isFront) imageSelectedList.add(0, fileExtension)
else imageSelectedList.add(1, fileExtension)
} else {
val bitmap: Bitmap =
MediaStore.Images.Media.getBitmap(context?.contentResolver, uri)
val fileName: String = System.currentTimeMillis().toString()
val file = File(fileDir, fileName.plus(".png"))
val fOut = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut)
fOut.flush()
fOut.close()
if (file.exists()) encodedPANBase64(file)
if (isFront) imageSelectedList.add(0, file)
else imageSelectedList.add(1, file)
Log.e("check_panString", panString + "\n" + bitmap.toString())
}
} else {
panString = ""
panFileExt = ""
showDialogValidation(activity,getString(R.string.fileSizeCant))
}
}
mainARNPhotoUpload ->{
val fileDir: File = (activity as SignUpActivity).cacheDir
val fileExtension = File(fileDir.toString().plus("/").plus(getFileName(uri)))
panFileExt = getFileExtension(getFileName(uri))
val size: Double = Common.getFileSizeInMB(fileExtension.length())
binding.ivARNUpload.setImageURI(uri)
if (size < MaxFileSize) {
if (type == "c") {
encodedPANBase64(fileExtension)
imageSelectedList.add(2, fileExtension)
} else {
val bitmap: Bitmap =
MediaStore.Images.Media.getBitmap(context?.contentResolver, uri)
val fileName: String = System.currentTimeMillis().toString()
// mainPhotoUpload -> {
// binding.ivPhotograph.visibility = View.VISIBLE
// val fileDir: File = requireActivity().cacheDir
// val fileExtension = File(fileDir.toString().plus("/").plus(getFileName(uri)))
// photoFileExt = getFileExtension(getFileName(uri))
// val size: Double = Common.getFileSizeInMB(fileExtension.length())
// if (size < 5) {
// if (type == "c") encodedPhotoBase64(fileExtension)
// else photoString = bitmap?.let { ImageUtil.convert(it) }.toString()
// } else {
// photoString = ""
// photoFileExt = ""
// }
// }
// firstDocUpload -> {
// binding.ivAadharFront.visibility = View.VISIBLE
// val fileDir: File = requireActivity().cacheDir
// val fileExtension = File(fileDir.toString().plus("/").plus(getFileName(uri)))
// doc1FileExt = getFileExtension(getFileName(uri))
// val size: Double = Common.getFileSizeInMB(fileExtension.length())
// if (size < 5) {
// if (type == "c") encodedUpload1Base64(fileExtension)
// else docString = bitmap?.let { ImageUtil.convert(it) }.toString()
// } else {
// docString = ""
// doc1FileExt = ""
// }
// }
// else -> {
// binding.ivAadharBack.visibility = View.VISIBLE
// val fileDir: File = requireActivity().cacheDir
// val fileExtension = File(fileDir.toString().plus("/").plus(getFileName(uri)))
// doc2fileExt = getFileExtension(getFileName(uri))
// val size: Double = Common.getFileSizeInMB(fileExtension.length())
// if (size < 5) {
// if (type == "c") encodedFileToBase64(fileExtension)
// else docString2 = bitmap?.let { ImageUtil.convert(it) }.toString()
// } else {
// docString2 = ""
// doc2fileExt = ""
// }
// }
val file = File(fileDir, fileName.plus(".png"))
val fOut = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut)
fOut.flush()
fOut.close()
if (file.exists()) encodedPANBase64(file)
imageSelectedList.add(2, file)
Log.e("check_panString", panString + "\n" + bitmap.toString())
}
} else {
panString = ""
panFileExt = ""
showDialogValidation(activity,getString(R.string.fileSizeCant))
}
}
mainEUINPhotoUpload ->{
val fileDir: File = (activity as SignUpActivity).cacheDir
val fileExtension = File(fileDir.toString().plus("/").plus(getFileName(uri)))
panFileExt = getFileExtension(getFileName(uri))
val size: Double = Common.getFileSizeInMB(fileExtension.length())
binding.ivEUINUpload.setImageURI(uri)
if (size < MaxFileSize) {
if (type == "c") {
encodedPANBase64(fileExtension)
imageSelectedList.add(3, fileExtension)
} else {
val bitmap: Bitmap =
MediaStore.Images.Media.getBitmap(context?.contentResolver, uri)
val fileName: String = System.currentTimeMillis().toString()
val file = File(fileDir, fileName.plus(".png"))
val fOut = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut)
fOut.flush()
fOut.close()
if (file.exists()) encodedPANBase64(file)
imageSelectedList.add(3, file)
Log.e("check_panString", panString + "\n" + bitmap.toString())
}
} else {
panString = ""
panFileExt = ""
showDialogValidation(activity,getString(R.string.fileSizeCant))
}
}
}
}


+ 74
- 11
app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/NewDistributorSignStepOne.kt View File

@ -5,17 +5,30 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.nivesh.production.partnerOnBoarding.databinding.NewDistributorSignStepOneBinding
import com.google.gson.Gson
import com.nivesh.production.partnerOnBoarding.R
import com.nivesh.production.partnerOnBoarding.adapters.NewDistributorSignStepOneAdapter
import com.nivesh.production.partnerOnBoarding.api.ApiClient
import com.nivesh.production.partnerOnBoarding.databinding.NewDistributorSignStepOneBinding
import com.nivesh.production.partnerOnBoarding.model.response.GetAllProductResponse
import com.nivesh.production.partnerOnBoarding.providerfactory.OnBoardingModelProviderFactory
import com.nivesh.production.partnerOnBoarding.repositories.MainRepository
import com.nivesh.production.partnerOnBoarding.ui.activities.BaseActivity
import com.nivesh.production.partnerOnBoarding.ui.activities.SignUpActivity
import com.nivesh.production.partnerOnBoarding.util.Constants
import com.nivesh.production.partnerOnBoarding.viewModels.OnBoardingViewModel
class NewDistributorSignStepOne : BaseFragment(){
class NewDistributorSignStepOne : BaseFragment() {
private var _binding: NewDistributorSignStepOneBinding? = null
private val binding get() = _binding!!
lateinit var viewModel: OnBoardingViewModel
// val listData: List<DataX>
companion object{
companion object {
var listMapData: MutableMap<Int, String>? = null
}
@ -24,7 +37,7 @@ class NewDistributorSignStepOne : BaseFragment(){
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = NewDistributorSignStepOneBinding.inflate(inflater,container,false)
_binding = NewDistributorSignStepOneBinding.inflate(inflater, container, false)
return binding.root
}
@ -34,17 +47,67 @@ class NewDistributorSignStepOne : BaseFragment(){
}
private fun init() {
viewModel = ViewModelProvider(
(activity as SignUpActivity),
OnBoardingModelProviderFactory(MainRepository(ApiClient.getApiClientOne))
)[OnBoardingViewModel::class.java]
(activity as SignUpActivity).viewModelOne.getAllProduct(
Constants.BASE_URL_COMMON + "User/GetAllProduct",
(activity as SignUpActivity)
)
(activity as SignUpActivity).viewModelOne.getAllProductMutableData.observe(
viewLifecycleOwner
) { response ->
val res: GetAllProductResponse =
Gson().fromJson(
response?.data.toString(),
GetAllProductResponse::class.java
)
if ((res.Status == "success")) {
binding.rvList.layoutManager = LinearLayoutManager(activity as SignUpActivity)
val adapter = NewDistributorSignStepOneAdapter(res.Result.Data)
binding.rvList.adapter = adapter
}
}
// val listData = mutableListOf(
// "Mutual Fund",
// "Insurance",
// "Bond",
// "Capital Gain Bond (CGB)",
// "Non-Convertible Debentures(NCDs)",
// "Fixed Deposit (FD)",
// "National Pension System (NPS)",
// "Secondary Bond",
// "Other"
// )
val listData = mutableListOf("Mutual Fund","Insurance","Bond","Capital Gain Bond (CGB)",
"Non-Convertible Debentures(NCDs)","Fixed Deposit (FD)","National Pension System (NPS)",
"Secondary Bond","Other")
binding.rvList.layoutManager = LinearLayoutManager(activity as SignUpActivity)
val adapter = NewDistributorSignStepOneAdapter(listData)
binding.rvList.adapter = adapter
binding.btnNext.setOnClickListener {
Toast.makeText((activity as SignUpActivity), listMapData.toString(),Toast.LENGTH_SHORT).show()
if(listMapData?.isNotEmpty() == true){
val bundle = Bundle()
bundle.putString("mobile",arguments?.getString("mobile"))
bundle.putString("arnType","Associate")
var fragment = GetStartedFragment()
fragment.arguments = bundle
replaceFragment(
activity as BaseActivity,
R.id.signUpContainer,
fragment,
"GET STARTED",
true
)
}else{
Toast.makeText((activity as SignUpActivity), "Choose the business you are interested", Toast.LENGTH_SHORT)
.show()
}
}
}
}

+ 91
- 16
app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/OTPFragment.kt View File

@ -4,21 +4,36 @@ import android.os.Bundle
import android.text.Editable
import android.text.InputFilter
import android.text.TextWatcher
import android.util.Log
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import com.nivesh.production.partnerOnBoarding.R
import com.nivesh.production.partnerOnBoarding.api.ApiClient
import com.nivesh.production.partnerOnBoarding.databinding.FragmentOtpBinding
import com.nivesh.production.partnerOnBoarding.model.request.SendOTPRequest
import com.nivesh.production.partnerOnBoarding.providerfactory.OnBoardingModelProviderFactory
import com.nivesh.production.partnerOnBoarding.repositories.MainRepository
import com.nivesh.production.partnerOnBoarding.ui.activities.BaseActivity
import com.nivesh.production.partnerOnBoarding.ui.activities.SignUpActivity
import com.nivesh.production.partnerOnBoarding.util.Common
import com.nivesh.production.partnerOnBoarding.viewModels.OnBoardingViewModel
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject
class OTPFragment : BaseFragment() {
private var _binding: FragmentOtpBinding? = null
private val binding get() = _binding!!
private var type: Int? = null
private var mobile: String? = null
private var partnerCode: String? = null
// lateinit var viewModelOTP: OnBoardingViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
@ -30,10 +45,18 @@ class OTPFragment : BaseFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
type = arguments?.getInt("type")
mobile = arguments?.getString("mobile")
init()
}
private fun init() {
// viewModelOTP = ViewModelProvider(
// (activity as SignUpActivity),
// OnBoardingModelProviderFactory(MainRepository(ApiClient.getApiClientOne))
// )[OnBoardingViewModel::class.java]
smsAPI()
binding.edtOTP1.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
binding.edtOTP2.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
@ -58,29 +81,82 @@ class OTPFragment : BaseFragment() {
binding.txtDigit.text = getString(R.string.sixDigitOTP).plus(" ").plus("+91.00000.00000")
binding.txtResendOTP.setOnClickListener {
}
binding.btnSubmit.setOnClickListener {
if (validate()) {
var fragment = Fragment()
if(type == 4) {
fragment = GetStartedFragment()
} else if(type == 3){
fragment = NewDistributorSignStepOne()
}
replaceFragment(
activity as BaseActivity,
R.id.signUpContainer,
fragment,
"GET STARTED",
true
)
apiVerifyOTP()
}
}
(activity as SignUpActivity).viewModelOne.getSendOTPMutableData.observe(
viewLifecycleOwner
) { response ->
Log.e("check_res_login", response?.data.toString())
}
}
private fun apiVerifyOTP() {
var obj = JSONObject()
obj.put("OTP","1234")
obj.put("Mobile",mobile)
obj.put("Email","test@test.com")
obj.put("ExpiryTimeInMinute",0)
val mediaType = "application/json; charset=utf-8".toMediaType()
var body: RequestBody = obj.toString().toRequestBody(mediaType)
(activity as SignUpActivity).viewModelOne.getVerifyOTP(
body,
(activity as SignUpActivity)
)
(activity as SignUpActivity).viewModelOne.getVerifyOTPMutableData.observe(
viewLifecycleOwner
) { response ->
Log.e("check_otp_res", response?.data.toString())
val bundle = Bundle()
bundle.putString("mobile",mobile)
bundle.putString("arnType",arguments?.getString("arnType"))
var fragment = Fragment()
if(type == 4) {
fragment = GetStartedFragment()
} else if(type == 3){
fragment = NewDistributorSignStepOne()
}
fragment.arguments = bundle
replaceFragment(
activity as BaseActivity,
R.id.signUpContainer,
fragment,
"GET STARTED",
true
)
}
}
private fun smsAPI() {
val sendOTPRequest = SendOTPRequest()
sendOTPRequest.AMCID = ""
sendOTPRequest.CommunicationValue = arguments?.getString("mobile").toString()
sendOTPRequest.Mode = "sms"
sendOTPRequest.MsgState = "PartnerRegistrationOTP"
sendOTPRequest.Name = "Manoj Sigh"
sendOTPRequest.ProductId = 0
sendOTPRequest.UserRole = 3
sendOTPRequest.UserId = "4988"
(activity as SignUpActivity).viewModelOne.getSendOTP(
sendOTPRequest,
"",
(activity as SignUpActivity)
)
}
private fun validate(): Boolean {
@ -171,6 +247,5 @@ class OTPFragment : BaseFragment() {
arg3: Int
) {
}
}
}

+ 38
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/QuestionsFragment.kt View File

@ -0,0 +1,38 @@
package com.nivesh.production.partnerOnBoarding.ui.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.nivesh.production.partnerOnBoarding.R
import com.nivesh.production.partnerOnBoarding.databinding.FragmentQuestionBinding
import com.nivesh.production.partnerOnBoarding.ui.activities.SignUpActivity
class QuestionsFragment : BaseFragment() {
private var _binding: FragmentQuestionBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout for this fragment
_binding = FragmentQuestionBinding.inflate(inflater,container,false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
init()
}
private fun init() {
binding.header.tvHelpCall.visibility = View.VISIBLE
binding.header.tvTitle.text = getString(R.string.questions)
binding.tvMsg.text = getString(R.string.questionsContent)//questionsContent
binding.header.ivBack.setOnClickListener{
(activity as SignUpActivity).onBackPressedDispatcher.onBackPressed()
}
}
}

+ 372
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SaveEAgreementFragment.kt View File

@ -0,0 +1,372 @@
package com.nivesh.production.partnerOnBoarding.ui.fragments
import android.annotation.SuppressLint
import android.app.AlertDialog
import android.app.Dialog
import android.os.Bundle
import android.text.Editable
import android.text.InputFilter
import android.text.TextWatcher
import android.util.Log
import android.view.*
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.ActionBar
import com.google.android.material.button.MaterialButton
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import com.google.gson.Gson
import com.nivesh.production.partnerOnBoarding.R
import com.nivesh.production.partnerOnBoarding.databinding.FragmentSaveEAgreementBinding
import com.nivesh.production.partnerOnBoarding.db.PreferenceManager
import com.nivesh.production.partnerOnBoarding.model.request.SendOTPRequest
import com.nivesh.production.partnerOnBoarding.model.response.SendOTPResponse
import com.nivesh.production.partnerOnBoarding.model.response.ValidateOTPResponse
import com.nivesh.production.partnerOnBoarding.ui.activities.SignUpActivity
import com.nivesh.production.partnerOnBoarding.util.Common
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject
class SaveEAgreementFragment : BaseFragment() {
private var _binding: FragmentSaveEAgreementBinding? = null
private val binding get() = _binding!!
// lateinit var viewModel: OnBoardingViewModel
private lateinit var dialog: Dialog
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentSaveEAgreementBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
init()
}
@SuppressLint("SetTextI18n")
private fun init() {
// viewModel = ViewModelProvider(
// (activity as SignUpActivity),
// OnBoardingModelProviderFactory(MainRepository(ApiClient.getApiClientOne))
// )[OnBoardingViewModel::class.java]
binding.header.tvTitle.text = "AGREEMENT"
binding.btnAgree.setOnClickListener {
smsAPI()
}
(activity as SignUpActivity).viewModelOne.getSaveEAgreementMutableData.observe(
viewLifecycleOwner
) { response ->
}
(activity as SignUpActivity).viewModelOne.getSaveEAgreementMutableData.observe(
viewLifecycleOwner
) { response ->
val res: ValidateOTPResponse =
Gson().fromJson(
response?.data.toString(),
ValidateOTPResponse::class.java
)
if (res != null) {
if (res.Status == "success") {
if (dialog.isShowing) dialog.cancel()
showConfirmDialog(res.Message)
} else if (res.Status == "error") {
Common.showDialogValidation((activity as SignUpActivity), res.Message)
}
}
Log.e("check_otp_res", response?.data.toString())
}
}
private fun showConfirmDialog(message: String) {
val builder = AlertDialog.Builder(activity)
builder.setMessage(message)
builder.setCancelable(false)
if (activity != null) {
builder.setPositiveButton(getString(R.string.Ok)) { dialogInterface, _ ->
dialogInterface.dismiss()
}
}
builder.show()
}
@SuppressLint("SetTextI18n")
private fun dialogOTP() {
dialog = Dialog(activity as SignUpActivity)
dialog.setContentView(R.layout.agreement_otp)
val txtDigit: TextView = dialog.findViewById(R.id.txtDigit)
val btnSubmit: MaterialButton = dialog.findViewById(R.id.btnSubmit)
val edtOTP1: TextInputEditText = dialog.findViewById(R.id.edtOTP1)
val edtOTP2: TextInputEditText = dialog.findViewById(R.id.edtOTP2)
val edtOTP3: TextInputEditText = dialog.findViewById(R.id.edtOTP3)
val edtOTP4: TextInputEditText = dialog.findViewById(R.id.edtOTP4)
val edtOTP5: TextInputEditText = dialog.findViewById(R.id.edtOTP5)
val edtOTP6: TextInputEditText = dialog.findViewById(R.id.edtOTP6)
val tlOTP1: TextInputLayout = dialog.findViewById(R.id.tlOTP1)
val tlOTP2: TextInputLayout = dialog.findViewById(R.id.tlOTP2)
val tlOTP3: TextInputLayout = dialog.findViewById(R.id.tlOTP3)
val tlOTP4: TextInputLayout = dialog.findViewById(R.id.tlOTP4)
val tlOTP5: TextInputLayout = dialog.findViewById(R.id.tlOTP5)
val tlOTP6: TextInputLayout = dialog.findViewById(R.id.tlOTP6)
val txtResendOTP: TextView = dialog.findViewById(R.id.txtResendOTP)
edtOTP1.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
edtOTP2.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
edtOTP3.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
edtOTP4.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
edtOTP5.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
edtOTP6.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
edtOTP1.addTextChangedListener(
GenericTextWatcher(
edtOTP1,
edtOTP2
)
)
edtOTP2.addTextChangedListener(
GenericTextWatcher(
edtOTP2,
edtOTP3
)
)
edtOTP3.addTextChangedListener(
GenericTextWatcher(
edtOTP3,
edtOTP4
)
)
edtOTP4.addTextChangedListener(
GenericTextWatcher(
edtOTP4,
edtOTP5
)
)
edtOTP5.addTextChangedListener(
GenericTextWatcher(
edtOTP5,
edtOTP6
)
)
edtOTP6.addTextChangedListener(
GenericTextWatcher(
edtOTP6,
null
)
)
edtOTP1.setOnKeyListener(OTPFragment.GenericKeyEvent(edtOTP1, null))
edtOTP2.setOnKeyListener(
GenericKeyEvent(
edtOTP2,
edtOTP1
)
)
edtOTP3.setOnKeyListener(
GenericKeyEvent(
edtOTP3,
edtOTP2
)
)
edtOTP4.setOnKeyListener(
OTPFragment.GenericKeyEvent(
edtOTP4,
edtOTP3
)
)
edtOTP5.setOnKeyListener(
OTPFragment.GenericKeyEvent(
edtOTP5,
edtOTP4
)
)
edtOTP6.setOnKeyListener(
OTPFragment.GenericKeyEvent(
edtOTP6,
edtOTP5
)
)
txtDigit.text =
getString(R.string.sixDigitOTP) + " " + arguments?.getString("email").toString()
txtResendOTP.setOnClickListener{
if(dialog.isShowing) dialog.cancel()
}
btnSubmit.setOnClickListener {
if (edtOTP1.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
edtOTP1,
tlOTP1,
""
)
} else if (edtOTP2.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
edtOTP2,
tlOTP2,
""
)
} else if (edtOTP3.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
edtOTP3,
tlOTP3,
""
)
} else if (edtOTP4.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
edtOTP4,
tlOTP4,
""
)
} else if (edtOTP5.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
edtOTP5,
tlOTP5,
""
)
} else if (edtOTP6.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
edtOTP6,
tlOTP6,
""
)
} else {
apiVerifyOTP(
edtOTP1.text.toString().plus(
edtOTP2.text.toString().plus(
edtOTP3.text.toString().plus(
edtOTP4.text.toString().plus(
edtOTP5.text.toString().plus(
edtOTP6.text.toString()))
)
)
)
)
}
}
if(!dialog.isShowing) dialog.show()
val window: Window = dialog.window!!
window.setLayout(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT)
}
private fun apiVerifyOTP(otp: String) {
var obj = JSONObject()
obj.put("SubBrokerCode", PreferenceManager((activity as SignUpActivity)).getPartnerCode())
obj.put("OTP", otp)
obj.put("OTPGenerationDate", Common.getDateFromTimeMills(System.currentTimeMillis()))
obj.put("FinancialYear", "")
val mediaType = "application/json; charset=utf-8".toMediaType()
var body: RequestBody = obj.toString().toRequestBody(mediaType)
(activity as SignUpActivity).viewModelOne.getSaveEAgreement(
body,
"",
(activity as SignUpActivity)
)
}
private fun smsAPI() {
val sendOTPRequest = SendOTPRequest()
sendOTPRequest.AMCID = ""
sendOTPRequest.CommunicationValue = arguments?.getString("email").toString()
sendOTPRequest.Mode = "email"
sendOTPRequest.MsgState = "EagreementOTP"
sendOTPRequest.Name = "Manoj Singh"
sendOTPRequest.ProductId = 1
sendOTPRequest.UserRole = 3
sendOTPRequest.UserId = "4988"
// Gson().toJson(sendOTPRequest)
(activity as SignUpActivity).viewModelOne.getSaveEAgreementSendOTP(
sendOTPRequest,
"",
(activity as SignUpActivity)
)
(activity as SignUpActivity).viewModelOne.getSendOTPSaveEAgreementMutableData.observe(
viewLifecycleOwner
) { response ->
Log.e("check_res_otp", response?.data.toString())
if(response!=null) {
val res: SendOTPResponse =
Gson().fromJson(
response.data.toString(),
SendOTPResponse::class.java
)
if (res.Status == "success") {
dialogOTP()
}
}
}
}
class GenericKeyEvent internal constructor(
private val currentView: EditText,
private val previousView: EditText?
) : View.OnKeyListener {
override fun onKey(p0: View?, keyCode: Int, event: KeyEvent?): Boolean {
if (event!!.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_DEL && currentView.id != R.id.edtOTP1 && currentView.text.isEmpty()) {
//If current is empty then previous EditText's number will also be deleted
previousView!!.text = null
previousView.requestFocus()
return true
}
return false
}
}
class GenericTextWatcher internal constructor(
private val currentView: View,
private val nextView: View?
) : TextWatcher {
override fun afterTextChanged(editable: Editable) { // TODO Auto-generated method stub
val text = editable.toString()
when (currentView.id) {
R.id.edtOTP1 -> if (text.length == 1) nextView!!.requestFocus()
R.id.edtOTP2 -> if (text.length == 1) nextView!!.requestFocus()
R.id.edtOTP3 -> if (text.length == 1) nextView!!.requestFocus()
R.id.edtOTP4 -> if (text.length == 1) nextView!!.requestFocus()
R.id.edtOTP5 -> if (text.length == 1) nextView!!.requestFocus()
//You can use EditText4 same as above to hide the keyboard
}
}
override fun beforeTextChanged(
arg0: CharSequence,
arg1: Int,
arg2: Int,
arg3: Int
) {
}
override fun onTextChanged(
arg0: CharSequence,
arg1: Int,
arg2: Int,
arg3: Int
) {
}
}
}

+ 127
- 12
app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SignUpFragment.kt View File

@ -4,18 +4,32 @@ import android.os.Bundle
import android.text.Editable
import android.text.InputFilter
import android.text.TextWatcher
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import com.google.gson.Gson
import com.nivesh.production.partnerOnBoarding.api.ApiClient
import com.nivesh.production.partnerOnBoarding.databinding.FragmentSignupBinding
import com.nivesh.production.partnerOnBoarding.db.PreferenceManager
import com.nivesh.production.partnerOnBoarding.model.request.PartnerRequest
import com.nivesh.production.partnerOnBoarding.model.request.ValidatePartnerRequest
import com.nivesh.production.partnerOnBoarding.model.response.PartnerResponse
import com.nivesh.production.partnerOnBoarding.model.response.ValidatePartnerResponse
import com.nivesh.production.partnerOnBoarding.providerfactory.OnBoardingModelProviderFactory
import com.nivesh.production.partnerOnBoarding.repositories.MainRepository
import com.nivesh.production.partnerOnBoarding.ui.activities.BaseActivity
import com.nivesh.production.partnerOnBoarding.ui.activities.SignUpActivity
import com.nivesh.production.partnerOnBoarding.util.Common
import com.nivesh.production.partnerOnBoarding.viewModels.OnBoardingViewModel
class SignUpFragment : BaseFragment() {
private var _binding: FragmentSignupBinding? = null
private val binding get() = _binding!!
private var type: Int? = null
private var arnType: String = ""
lateinit var viewModel: OnBoardingViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
@ -27,10 +41,16 @@ class SignUpFragment : BaseFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
type = arguments?.getInt("type")
arnType = arguments?.getString("arnType")!!
init()
}
private fun init() {
viewModel = ViewModelProvider(
activity as SignUpActivity,
OnBoardingModelProviderFactory(MainRepository(ApiClient.getApiClientOne))
)[OnBoardingViewModel::class.java]
binding.edtMobileNumber.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(10))
binding.edtMobileNumber.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {}
@ -41,23 +61,103 @@ class SignUpFragment : BaseFragment() {
})
binding.btnSignUp.setOnClickListener {
if (validate()) {
val bundle = Bundle()
bundle.putInt("type", type!!)
val fragment = OTPFragment()
fragment.arguments = bundle
replaceFragment(
activity as BaseActivity,
com.nivesh.production.partnerOnBoarding.R.id.signUpContainer,
fragment,
"OTP",
true
// val partnerRequest = PartnerRequest()
// partnerRequest.Mobile = binding.edtMobileNumber.text.toString().trim()
// partnerRequest.PartnerType = arnType
// partnerRequest.DateOfIncorporation = Common.getDateFromTimeMills(System.currentTimeMillis())
// //GsonBuilder().create().toJson(this, PartnerRequest::class.java)
// (activity as SignUpActivity).viewModelOne.getPartnerCreateData(
// partnerRequest,
// "",
// (activity as SignUpActivity)
// )
val vpr = ValidatePartnerRequest()
vpr.Mobile = binding.edtMobileNumber.text.toString().trim()
(activity as SignUpActivity).viewModelOne.getPartnerValidate(
vpr,
"",
(activity as SignUpActivity)
)
}
}
(activity as SignUpActivity).viewModelOne.getPartnerCreationMutableData.observe(
viewLifecycleOwner
) { response ->
val cretePartnerResponse: PartnerResponse =
Gson().fromJson(
response?.data.toString(),
PartnerResponse::class.java
)
if (cretePartnerResponse.Status == "success") {
setUpOTPFragment(cretePartnerResponse.Result.PartnerCode)
} else {
Common.showDialogValidation(
(activity as SignUpActivity),
cretePartnerResponse.Message
)
}
}
(activity as SignUpActivity).viewModelOne.getValidatePartnerMutableData.observe(
viewLifecycleOwner
) { response ->
Log.e("check_res_login", response?.data.toString())
val validatePartnerResponse: ValidatePartnerResponse =
Gson().fromJson(
response?.data.toString(),
ValidatePartnerResponse::class.java
)
if (validatePartnerResponse.Status == "success") {
if (validatePartnerResponse.Result.IsPartialRegistered) {
PreferenceManager(activity as SignUpActivity).setPartnerCode(
validatePartnerResponse.Result.PartnerCode)
setUpOTPFragment(validatePartnerResponse.Result.PartnerCode)
} else {
val partnerRequest = PartnerRequest()
partnerRequest.Mobile = binding.edtMobileNumber.text.toString().trim()
partnerRequest.PartnerType = arnType
partnerRequest.DateOfIncorporation =
Common.getDateFromTimeMills(System.currentTimeMillis())
//GsonBuilder().create().toJson(this, PartnerRequest::class.java)
(activity as SignUpActivity).viewModelOne.getPartnerCreateData(
partnerRequest,
"",
(activity as SignUpActivity)
)
}
}else if(validatePartnerResponse.Status == "error") {
Common.showDialogValidation((activity as SignUpActivity),validatePartnerResponse.Message)
}
}
}
private fun setUpOTPFragment(partnerCode: String) {
val bundle = Bundle()
bundle.putInt("type", type!!)
bundle.putString("mobile", binding.edtMobileNumber.text.toString().trim())
bundle.putString("arnType", arguments?.getString("arnType")!!)
bundle.putString("partnerCode", partnerCode)
PreferenceManager(activity as SignUpActivity).setPartnerCode(partnerCode)
val fragment = OTPFragment()
fragment.arguments = bundle
replaceFragment(
activity as BaseActivity,
com.nivesh.production.partnerOnBoarding.R.id.signUpContainer,
fragment,
"OTP",
true
)
}
private fun validate(): Boolean {
return if (binding.edtMobileNumber.text.toString().isEmpty()) { // EditText
@ -82,4 +182,19 @@ class SignUpFragment : BaseFragment() {
return true
}
}
override fun onDestroy() {
super.onDestroy()
Log.e("check_sign_destroy", "Destroyed")
}
override fun onDestroyView() {
super.onDestroyView()
Log.e("check_sign_destroy", "DestroyeView")
}
override fun onDetach() {
super.onDetach()
Log.e("check_sign_destroy", "Detach")
}
}

+ 62
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Common.kt View File

@ -1,7 +1,9 @@
package com.nivesh.production.partnerOnBoarding.util
import android.R.attr.textColor
import android.app.Activity
import android.app.AlertDialog
import android.app.DatePickerDialog
import android.app.Dialog
import android.content.Context
import android.content.Intent
@ -16,15 +18,19 @@ import android.text.format.DateFormat
import android.util.Log
import android.util.Patterns
import android.view.Gravity
import android.view.View
import android.view.Window
import android.webkit.WebView
import android.widget.ImageView
import androidx.appcompat.app.ActionBar
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textfield.MaterialAutoCompleteTextView
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import com.google.gson.JsonObject
import com.nivesh.production.partnerOnBoarding.R
import com.nivesh.production.partnerOnBoarding.model.response.PartnerResponse
import com.nivesh.production.partnerOnBoarding.ui.activities.SignUpActivity
import kotlinx.coroutines.CoroutineExceptionHandler
import org.json.JSONObject
import retrofit2.HttpException
@ -263,6 +269,15 @@ class Common {
}
fun handleResponsePartner(response: Response<PartnerResponse>): Resource<PartnerResponse>? {
if (response.isSuccessful && response.body() != null) {
response.body()?.let { resultResponse ->
return Resource.Success(resultResponse)
}
}
return Resource.Error(response.message())
}
fun handleError(activity: Activity): CoroutineExceptionHandler {
val handler = CoroutineExceptionHandler { _, exception ->
if (exception is IOException || exception is HttpException) {
@ -309,5 +324,52 @@ class Common {
""
}
}
fun datePicker(activity: Activity,edtDOB: TextInputEditText): String {
var cal = Calendar.getInstance()
var preSelectedDate = ""
var year: Int
var month: Int
var day: Int
if (edtDOB.text.toString().isNotEmpty()) {
val formatter: java.text.DateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US)
val dateObject = formatter.parse(edtDOB.text.toString()) as Date
preSelectedDate = SimpleDateFormat("yyyy-MM-dd", Locale.US).format(dateObject)
val items1: Array<String> = preSelectedDate.split("-").toTypedArray()
year = items1[0].toInt()
month = items1[1].toInt() - 1
day = items1[2].toInt()
} else {
year = cal.get(Calendar.YEAR)
month = cal.get(Calendar.MONTH)
day = cal.get(Calendar.DAY_OF_MONTH)
}
val datePickerDialog = DatePickerDialog(
activity as SignUpActivity, { _, years, monthOfYear, dayOfMonth ->
if (monthOfYear.toString().length == 1) {
"0".plus(monthOfYear)
}
preSelectedDate = years.toString().plus("-").plus(monthOfYear + 1).plus("-")
.plus(dayOfMonth.toString())
edtDOB.setText(preSelectedDate)
edtDOB.setSelection(edtDOB.text.toString().length)
}, year, month, day
)
datePickerDialog.datePicker.maxDate = cal.timeInMillis
val c = Calendar.getInstance()
c.add(Calendar.YEAR, -140)
datePickerDialog.datePicker.minDate = c.timeInMillis
datePickerDialog.show()
return preSelectedDate
}
fun getDateFromTimeMills(long: Long) : String{
val sdf = SimpleDateFormat("yyyy-MM-dd")
val resultDate = Date(long)
return sdf.format((resultDate))
}
}
}

+ 6
- 3
app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Constants.kt View File

@ -3,8 +3,11 @@ package com.nivesh.production.partnerOnBoarding.util
class Constants() {
companion object {
const val BASE_URL = "https://providential.in/WebApi_Bajaj/api/"
// const val token = "636F8F63-06C4-4D95-8562-392B34025FB0"
const val paymentUrl = "https://uat.nivesh.com/bajajFD/OrderStatus"
const val BASE_URL = "http://3.109.121.6:5001/api/"
// const val BASE_URL = "http://3.109.121.6/partner/api/"
const val BASE_URL_COMMON = "http://3.109.121.6:5002/api/"
// const val token = "636F8F63-06C4-4D95-8562-392B34025FB0"
const val paymentUrl = "https://uat.nivesh.com/bajajFD/OrderStatus"
}
}

+ 134
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ImageFilePath.kt View File

@ -0,0 +1,134 @@
package com.nivesh.production.partnerOnBoarding.util
import android.annotation.SuppressLint
import android.annotation.TargetApi
import android.content.ContentUris
import android.content.Context
import android.database.Cursor
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.DocumentsContract
import android.provider.MediaStore
object ImageFilePath {
/**
* Method for return file path of Gallery image
*
* @param context
* @param uri
* @return path of the selected image file from gallery
*/
var nopath = "Select Video Only"
@TargetApi(Build.VERSION_CODES.KITKAT)
@SuppressLint("NewApi")
fun getPath(context: Context, uri: Uri): String? {
val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
if (isExternalStorageDocument(uri)) {
val docId = DocumentsContract.getDocumentId(uri)
val split = docId.split(":").toTypedArray()
val type = split[0]
if ("primary".equals(type, ignoreCase = true)) {
return (Environment.getExternalStorageDirectory().toString() + "/"
+ split[1])
}
} else if (isDownloadsDocument(uri)) {
val id = DocumentsContract.getDocumentId(uri)
val contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"),
java.lang.Long.valueOf(id)
)
return getDataColumn(context, contentUri, null, null)
} else if (isMediaDocument(uri)) {
val docId = DocumentsContract.getDocumentId(uri)
val split = docId.split(":").toTypedArray()
val type = split[0]
var contentUri: Uri? = null
if ("image" == type) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
} else if ("video" == type) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
} else if ("audio" == type) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
}
val selection = "_id=?"
val selectionArgs = arrayOf(split[1])
return getDataColumn(
context, contentUri, selection,
selectionArgs
)
}
} else if ("content".equals(uri.scheme, ignoreCase = true)) {
// Return the remote address
return if (isGooglePhotosUri(uri)) uri.lastPathSegment else getDataColumn(
context,
uri,
null,
null
)
} else if ("file".equals(uri.scheme, ignoreCase = true)) {
return uri.path
}
return nopath
}
private fun getDataColumn(
context: Context, uri: Uri?,
selection: String?, selectionArgs: Array<String>?
): String {
var cursor: Cursor? = null
val column = "_data"
val projection = arrayOf(column)
try {
cursor = context.contentResolver.query(
uri!!, projection,
selection, selectionArgs, null
)
if (cursor != null && cursor.moveToFirst()) {
val index = cursor.getColumnIndexOrThrow(column)
return cursor.getString(index)
}
} finally {
cursor?.close()
}
return nopath
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
private fun isExternalStorageDocument(uri: Uri): Boolean {
return "com.android.externalstorage.documents" == uri
.authority
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
private fun isDownloadsDocument(uri: Uri): Boolean {
return "com.android.providers.downloads.documents" == uri
.authority
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
private fun isMediaDocument(uri: Uri): Boolean {
return "com.android.providers.media.documents" == uri
.authority
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
private fun isGooglePhotosUri(uri: Uri): Boolean {
return "com.google.android.apps.photos.content" == uri
.authority
}
}

+ 0
- 35
app/src/main/java/com/nivesh/production/partnerOnBoarding/util/MaskWatcher.kt View File

@ -1,35 +0,0 @@
package com.nivesh.production.partnerOnBoarding.util
import android.text.Editable
import android.text.TextWatcher
class MaskWatcher(private val mask: String) : TextWatcher {
private var isRunning = false
private var isDeleting = false
override fun beforeTextChanged(charSequence: CharSequence, start: Int, count: Int, after: Int) {
isDeleting = count > after
}
override fun onTextChanged(charSequence: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(editable: Editable) {
if (isRunning || isDeleting) {
return
}
isRunning = true
val editableLength = editable.length
if (editableLength < mask.length) {
if (mask[editableLength] != '#') {
editable.append(mask[editableLength])
} else if (mask[editableLength - 1] != '#') {
editable.insert(editableLength - 1, mask, editableLength - 1, editableLength)
}
}
isRunning = false
}
companion object {
fun buildCpf(): MaskWatcher {
return MaskWatcher("###.###.###-##")
}
}
}

+ 79
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/IFormattedString.kt View File

@ -0,0 +1,79 @@
package com.nivesh.production.partnerOnBoarding.util.maskedEditText
interface IFormattedString : CharSequence {
val unMaskedString: String
}
internal abstract class AbstractFormattedString(val mMask: Mask, val inputString: String) : IFormattedString {
private var mFormattedString: String? = null
final override val unMaskedString: String
init {
unMaskedString = this.buildRawString(inputString)
}
internal abstract fun formatString(): String
internal abstract fun buildRawString(str: String): String
override val length: Int
get() = toString().length
override fun toString(): String {
return mFormattedString ?: formatString()
}
override fun subSequence(startIndex: Int, endIndex: Int): CharSequence {
return toString().subSequence(startIndex, endIndex)
}
override fun get(index: Int): Char {
return toString()[index]
}
}
internal class FormattedString(mask: Mask, rawString: String) : AbstractFormattedString(mask, rawString) {
override fun buildRawString(str: String): String {
val builder = StringBuilder()
val inputLen = mMask.size().coerceAtMost(str.length)
for (i in 0 until inputLen) {
val ch = str[i]
if (!mMask.isValidPrepopulateCharacter(ch, i))
builder.append(ch)
}
return builder.toString()
}
override fun formatString(): String {
val builder = StringBuilder()
var strIndex = 0
var maskCharIndex = 0
var stringCharacter: Char
while (strIndex < inputString.length && maskCharIndex < mMask.size()) {
val maskChar = mMask[maskCharIndex]
stringCharacter = inputString[strIndex]
when {
maskChar.isValidCharacter(stringCharacter) -> {
builder.append(maskChar.processCharacter(stringCharacter))
strIndex += 1
maskCharIndex += 1
}
maskChar.isPrepopulate -> {
builder.append(maskChar.processCharacter(stringCharacter))
maskCharIndex += 1
}
else -> strIndex += 1
}
}
return builder.toString()
}
}

+ 60
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/Mask.kt View File

@ -0,0 +1,60 @@
package com.nivesh.production.partnerOnBoarding.util.maskedEditText
class Mask() {
lateinit var formatString: String
private lateinit var mMask: List<MaskCharacter>
private val mFabric: MaskCharacterFabric = MaskCharacterFabric()
private var mPrepopulateCharacter: MutableList<MaskCharacter>? = null
constructor(fmtString: String) : this() {
formatString = fmtString
mMask = buildMask(formatString)
}
fun size(): Int {
return mMask.size
}
operator fun get(index: Int): MaskCharacter {
return mMask[index]
}
fun isValidPrepopulateCharacter(ch: Char, at: Int): Boolean {
return try {
val character = mMask[at]
character.isPrepopulate && character.isValidCharacter(ch)
} catch (e: IndexOutOfBoundsException) {
false
}
}
fun isValidPrepopulateCharacter(ch: Char): Boolean {
for (maskCharacter in mPrepopulateCharacter!!) {
if (maskCharacter.isValidCharacter(ch)) {
return true
}
}
return false
}
private fun buildMask(fmtString: String): List<MaskCharacter> {
val result = ArrayList<MaskCharacter>()
mPrepopulateCharacter = ArrayList()
for (ch in fmtString.toCharArray()) {
val maskCharacter = mFabric.buildCharacter(ch)
if (maskCharacter?.isPrepopulate == true) {
mPrepopulateCharacter?.add(maskCharacter)
}
maskCharacter?.let { result.add(it) }
}
return result
}
fun getFormattedString(value: String): IFormattedString {
return FormattedString(this, value)
}
}

+ 93
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskCharacter.kt View File

@ -0,0 +1,93 @@
package com.nivesh.production.partnerOnBoarding.util.maskedEditText
abstract class MaskCharacter {
open val isPrepopulate: Boolean
get() = false
abstract fun isValidCharacter(ch: Char): Boolean
open fun processCharacter(ch: Char): Char {
return ch
}
}
internal class DigitCharacter : MaskCharacter() {
override fun isValidCharacter(ch: Char): Boolean {
return Character.isDigit(ch)
}
}
internal class UpperCaseCharacter : MaskCharacter() {
override fun isValidCharacter(ch: Char): Boolean {
return Character.isUpperCase(ch)
}
override fun processCharacter(ch: Char): Char {
return Character.toUpperCase(ch)
}
}
internal class LowerCaseCharacter : MaskCharacter() {
override fun isValidCharacter(ch: Char): Boolean {
return Character.isLowerCase(ch)
}
override fun processCharacter(ch: Char): Char {
return Character.toLowerCase(ch)
}
}
internal class AlphaNumericCharacter : MaskCharacter() {
override fun isValidCharacter(ch: Char): Boolean {
return Character.isLetterOrDigit(ch)
}
}
internal class LetterCharacter : MaskCharacter() {
override fun isValidCharacter(ch: Char): Boolean {
return Character.isLetter(ch)
}
}
internal class HexCharacter : MaskCharacter() {
override fun isValidCharacter(ch: Char): Boolean {
return Character.isLetterOrDigit(ch) && HEX_CHARS.indexOf(Character.toUpperCase(ch)) != -1
}
override fun processCharacter(ch: Char): Char {
return Character.toUpperCase(ch)
}
companion object {
private val HEX_CHARS = "0123456789ABCDEF"
}
}
internal class LiteralCharacter : MaskCharacter {
private var character: Char? = null
override val isPrepopulate: Boolean
get() = character != null
constructor() {
character = null
}
constructor(ch: Char) {
character = ch
}
override fun isValidCharacter(ch: Char): Boolean {
return character == null || character == ch
}
override fun processCharacter(ch: Char): Char {
return if (character != null) character!! else ch
}
}

+ 29
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskCharacterFabric.kt View File

@ -0,0 +1,29 @@
package com.nivesh.production.partnerOnBoarding.util.maskedEditText
internal class MaskCharacterFabric {
fun buildCharacter(ch: Char): MaskCharacter? {
return when (ch) {
ANYTHING_KEY -> LiteralCharacter()
DIGIT_KEY -> DigitCharacter()
UPPERCASE_KEY -> UpperCaseCharacter()
LOWERCASE_KEY -> LowerCaseCharacter()
ALPHA_NUMERIC_KEY -> AlphaNumericCharacter()
CHARACTER_KEY -> LetterCharacter()
HEX_KEY -> HexCharacter()
else -> {
LiteralCharacter(ch)
}
}
}
companion object {
private const val ANYTHING_KEY = '*'
private const val DIGIT_KEY = '#'
private const val UPPERCASE_KEY = 'U'
private const val LOWERCASE_KEY = 'L'
private const val ALPHA_NUMERIC_KEY = 'A'
private const val CHARACTER_KEY = '?'
private const val HEX_KEY = 'H'
}
}

+ 50
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedEditText.kt View File

@ -0,0 +1,50 @@
package com.nivesh.production.partnerOnBoarding.util.maskedEditText
import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatEditText
import com.google.android.material.textfield.TextInputEditText
import com.nivesh.production.partnerOnBoarding.R
class MaskedEditText(context: Context, attrs: AttributeSet) : TextInputEditText(context, attrs) {
private var mMaskedFormatter: MaskedFormatter? = null
private var mMaskedWatcher: MaskedWatcher? = null
val maskString: String?
get() = mMaskedFormatter?.maskString
val unMaskedText: String?
get() {
val currentText = text?.toString()
val formattedString = currentText?.let { mMaskedFormatter?.formatString(it) }
return formattedString?.unMaskedString
}
init {
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.MaskedEditText)
if (typedArray.hasValue(R.styleable.MaskedEditText_mask)) {
val maskStr = typedArray.getString(R.styleable.MaskedEditText_mask)
if (maskStr != null && maskStr.isNotEmpty()) {
setMask(maskStr)
}
}
typedArray.recycle()
}
fun setMask(mMaskStr: String) {
mMaskedFormatter = MaskedFormatter(mMaskStr)
if (mMaskedWatcher != null) {
removeTextChangedListener(mMaskedWatcher)
}
mMaskedFormatter?.let { mMaskedWatcher = MaskedWatcher(it, this) }
addTextChangedListener(mMaskedWatcher)
}
}

+ 27
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedFormatter.kt View File

@ -0,0 +1,27 @@
package com.nivesh.production.partnerOnBoarding.util.maskedEditText
class MaskedFormatter internal constructor() {
internal var mMask: Mask? = null
val maskString: String?
get() = mMask?.formatString
val maskLength: Int?
get() = mMask?.size()
init {
mMask = null
}
constructor(fmtString: String) : this() {
this.setMask(fmtString)
}
fun setMask(fmtString: String) {
mMask = Mask(fmtString)
}
fun formatString(value: String): IFormattedString? {
return mMask?.getFormattedString(value)
}
}

+ 79
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedWatcher.kt View File

@ -0,0 +1,79 @@
package com.nivesh.production.partnerOnBoarding.util.maskedEditText
import android.text.Editable
import android.text.TextWatcher
import android.widget.EditText
import com.google.android.material.textfield.TextInputEditText
import java.lang.ref.WeakReference
class MaskedWatcher(maskedFormatter: MaskedFormatter, editText: TextInputEditText) : TextWatcher {
private val mMaskFormatter: WeakReference<MaskedFormatter> = WeakReference(maskedFormatter)
private val mEditText: WeakReference<TextInputEditText> = WeakReference(editText)
private var oldFormattedValue = ""
private var oldCursorPosition: Int = 0
// ===========================================================
// Listeners, methods for/from Interfaces
// ===========================================================
private fun setFormattedText(formattedString: IFormattedString) {
val editText = mEditText.get() ?: return
val deltaLength = formattedString.length - oldFormattedValue.length
editText.removeTextChangedListener(this)
editText.setText(formattedString)
editText.addTextChangedListener(this)
var newCursorPosition = oldCursorPosition
if (deltaLength > 0) {
newCursorPosition += deltaLength
} else if (deltaLength < 0) {
newCursorPosition -= 1
} else {
var mask: Mask? = null
mMaskFormatter.get()?.mMask?.let { mask = it }
var maskLength = 0
mMaskFormatter.get()?.maskLength?.let { maskLength = it}
newCursorPosition = 1.coerceAtLeast(newCursorPosition.coerceAtMost(maskLength))
var isPopulate = false
mask?.get(newCursorPosition - 1)?.isPrepopulate?.let { isPopulate = it }
if (isPopulate)
newCursorPosition -= 1
}
newCursorPosition = 0.coerceAtLeast(newCursorPosition.coerceAtMost(formattedString.length))
editText.setSelection(newCursorPosition)
}
override fun afterTextChanged(s: Editable?) {
if (s == null)
return
var value = s.toString()
var maskLength = 0
mMaskFormatter.get()?.maskLength?.let { maskLength = it}
if (value.length > oldFormattedValue.length && maskLength < value.length) {
value = oldFormattedValue
}
val formattedString = mMaskFormatter.get()?.formatString(value)
formattedString?.let { setFormattedText(it) }
oldFormattedValue = formattedString.toString()
}
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
mEditText.get()?.selectionStart?.let { this.oldCursorPosition = it }
}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
}

+ 169
- 0
app/src/main/java/com/nivesh/production/partnerOnBoarding/viewModels/OnBoardingViewModel.kt View File

@ -1,10 +1,38 @@
package com.nivesh.production.partnerOnBoarding.viewModels
import android.app.Activity
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.google.gson.JsonObject
import com.nivesh.production.partnerOnBoarding.model.request.PartnerRequest
import com.nivesh.production.partnerOnBoarding.model.request.SaveEAgreementRequest
import com.nivesh.production.partnerOnBoarding.model.request.SendOTPRequest
import com.nivesh.production.partnerOnBoarding.model.request.ValidatePartnerRequest
import com.nivesh.production.partnerOnBoarding.repositories.MainRepository
import com.nivesh.production.partnerOnBoarding.util.Common
import com.nivesh.production.partnerOnBoarding.util.Common.Companion.handleError
import com.nivesh.production.partnerOnBoarding.util.Common.Companion.handleResponse
import com.nivesh.production.partnerOnBoarding.util.Resource
import kotlinx.coroutines.launch
import okhttp3.MultipartBody
import okhttp3.RequestBody
open class OnBoardingViewModel(private val mainRepository: MainRepository) : ViewModel() {
// val postPartnerCreationViewModel: MutableLiveData<Resource<PartnerResponse>> = MutableLiveData()
// fun getPartnerCreation(
// requestBody: PartnerCreation,
// token: String,
// activity: Activity
// ) = viewModelScope.launch(handleError(activity)) {
// if (Common.isNetworkAvailable(activity)) {
// postPartnerCreationViewModel.postValue(Resource.Loading())
// val response = mainRepository.getPartnerResponse(requestBody)
// postPartnerCreationViewModel.postValue(handleResponse(response))
// }
// }
// val getStepsCountMutableData: MutableLiveData<Resource<JsonObject>> = MutableLiveData()
// fun getStepsCount(
// requestBody: FDStepsCountRequest,
@ -29,4 +57,145 @@ open class OnBoardingViewModel(private val mainRepository: MainRepository) : Vie
// }
// }
val getPartnerCreationMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getPartnerCreateData(
requestBody: PartnerRequest,
token: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
// getPartnerCreationMutableData.postValue(Resource.Loading())
val response = mainRepository.getPartnerCreationResponse(requestBody, token)
getPartnerCreationMutableData.postValue(handleResponse(response))
}
}
val getValidatePartnerMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getPartnerValidate(
validatePartnerRequest: ValidatePartnerRequest,
token: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
// getValidatePartnerMutableData.postValue(Resource.Loading())
val response = mainRepository.getValidatePartnerResponse(validatePartnerRequest)
getValidatePartnerMutableData.postValue(handleResponse(response))
}
}
val getSendOTPMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getSendOTP(
sendOTPRequest: SendOTPRequest,
token: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
val response = mainRepository.getSendOTPResponse(sendOTPRequest)
getSendOTPMutableData.postValue(handleResponse(response))
}
}
val getSendOTPSaveEAgreementMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getSaveEAgreementSendOTP(
sendOTPRequest: SendOTPRequest,
token: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
val response = mainRepository.getSendSaveEAgreementOTPResponse(sendOTPRequest)
getSendOTPSaveEAgreementMutableData.postValue(handleResponse(response))
}
}
val getVerifyOTPMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getVerifyOTP(
requestBody: RequestBody,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
// getValidatePartnerMutableData.postValue(Resource.Loading())
val response = mainRepository.getVerifyOTP(requestBody)
getVerifyOTPMutableData.postValue(handleResponse(response))
}
}
val getAMFIDetailMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getAMFIDetail(
requestBody: RequestBody,
token: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
// getValidatePartnerMutableData.postValue(Resource.Loading())
val response = mainRepository.getAMFIDetailResponse(requestBody)
getAMFIDetailMutableData.postValue(handleResponse(response))
}
}
val getPANDetailMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getPANDetail(
requestBody: String,
url: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
// getValidatePartnerMutableData.postValue(Resource.Loading())
val response = mainRepository.getPANDetailResponse(url,requestBody)
getPANDetailMutableData.postValue(handleResponse(response))
}
}
val getDocumentTypeMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getDocumentType(
value: String,
type: String,
url: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
// getValidatePartnerMutableData.postValue(Resource.Loading())
val response = mainRepository.getDocumentTypeResponse(url,value,type)
getDocumentTypeMutableData.postValue(handleResponse(response))
}
}
val getDocumentUploadMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getDocumentUpload(
multipartBody: List<MultipartBody.Part>,
pc: Int,
pr: Int,
di: Int,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
// getValidatePartnerMutableData.postValue(Resource.Loading())
val response = mainRepository.getDocumentUploadResponse(multipartBody,pc,pr,di)
getDocumentUploadMutableData.postValue(handleResponse(response))
}
}
val getSaveEAgreementMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getSaveEAgreement(
requestBody: RequestBody,
token: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
// getPartnerCreationMutableData.postValue(Resource.Loading())
val response = mainRepository.getSaveEAgreement(requestBody, token)
getSaveEAgreementMutableData.postValue(handleResponse(response))
}
}
val getAllProductMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getAllProduct(
url: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
// getValidatePartnerMutableData.postValue(Resource.Loading())
val response = mainRepository.getAllProduct(url)
getAllProductMutableData.postValue(handleResponse(response))
}
}
}

+ 2
- 2
app/src/main/res/drawable/google_icon.xml View File

@ -1,8 +1,8 @@
<vector android:alpha="0.9"
android:height="32dp"
android:height="24dp"
android:viewportHeight="262"
android:viewportWidth="256"
android:width="30dp"
android:width="24dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#4285F4" android:pathData="M255.878,133.451c0,-10.734 -0.871,-18.567 -2.756,-26.69H130.55v48.448h71.947c-1.45,12.04 -9.283,30.172 -26.69,42.356l-0.244,1.622 38.755,30.023 2.685,0.268c24.659,-22.774 38.875,-56.282 38.875,-96.027"/>
<path android:fillColor="#34A853" android:pathData="M130.55,261.1c35.248,0 64.839,-11.605 86.453,-31.622l-41.196,-31.913c-11.024,7.688 -25.82,13.055 -45.257,13.055 -34.523,0 -63.824,-22.773 -74.269,-54.25l-1.531,0.13 -40.298,31.187 -0.527,1.465C35.393,231.798 79.49,261.1 130.55,261.1"/>


+ 11
- 0
app/src/main/res/drawable/svg_back.xml View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="12dp"
android:viewportWidth="18"
android:viewportHeight="12">
<path
android:fillColor="#ffffff"
android:pathData="M18 5H3.83L7.41 1.41L6 0L0 6L6 12L7.41 10.59L3.83 7H18V5Z" />
</vector>

+ 12
- 0
app/src/main/res/drawable/svg_cal.xml View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="14dp"
android:viewportWidth="14"
android:viewportHeight="14">
<path
android:fillColor="#303030"
android:fillType="evenOdd"
android:pathData="M4 0.5V1H10V0.5C10 0.223858 10.2239 0 10.5 0C10.7761 0 11 0.223858 11 0.5V1H12C13.1046 1 14 1.89543 14 3V12C14 13.1046 13.1046 14 12 14H2C0.89543 14 0 13.1046 0 12V6V5V3C0 1.89543 0.895431 1 2 1H3V0.5C3 0.223858 3.22386 0 3.5 0C3.77614 0 4 0.223858 4 0.5ZM10 2V2.5C10 2.77614 10.2239 3 10.5 3C10.7761 3 11 2.77614 11 2.5V2H12C12.5523 2 13 2.44772 13 3V5H12H1V3C1 2.44772 1.44772 2 2 2H3V2.5C3 2.77614 3.22386 3 3.5 3C3.77614 3 4 2.77614 4 2.5V2H10ZM1 6V12C1 12.5523 1.44772 13 2 13H12C12.5523 13 13 12.5523 13 12V6H12H1Z" />
</vector>

+ 17
- 0
app/src/main/res/drawable/svg_pan_verified.xml
File diff suppressed because it is too large
View File


+ 11
- 0
app/src/main/res/drawable/svg_phone.xml View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="18dp"
android:viewportWidth="18"
android:viewportHeight="18">
<path
android:fillColor="#ffffff"
android:pathData="M3.54 2C3.6 2.89 3.75 3.76 3.99 4.59L2.79 5.79C2.38 4.59 2.12 3.32 2.03 2H3.54ZM13.4 14.02C14.25 14.26 15.12 14.41 16 14.47V15.96C14.68 15.87 13.41 15.61 12.2 15.21L13.4 14.02ZM4.5 0H1C0.45 0 0 0.45 0 1C0 10.39 7.61 18 17 18C17.55 18 18 17.55 18 17V13.51C18 12.96 17.55 12.51 17 12.51C15.76 12.51 14.55 12.31 13.43 11.94C13.33 11.9 13.22 11.89 13.12 11.89C12.86 11.89 12.61 11.99 12.41 12.18L10.21 14.38C7.38 12.93 5.06 10.62 3.62 7.79L5.82 5.59C6.1 5.31 6.18 4.92 6.07 4.57C5.7 3.45 5.5 2.25 5.5 1C5.5 0.45 5.05 0 4.5 0Z" />
</vector>

+ 2
- 1
app/src/main/res/layout/activity_register.xml View File

@ -3,7 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:orientation="vertical"
android:background="@color/white">
<ImageView
android:id="@+id/logo"


+ 290
- 0
app/src/main/res/layout/agreement_otp.xml View File

@ -0,0 +1,290 @@
<?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:tool="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/containerOTP"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_10"
android:layout_marginEnd="@dimen/margin_10"
android:paddingBottom="@dimen/margin_20"
android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/txtSignUp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/margin_5"
android:text="@string/mobNoText"
android:textColor="@color/black"
android:textSize="@dimen/text_size_20"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/txtDigit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_10"
android:layout_marginTop="@dimen/margin_5"
android:textColor="@color/black"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/txtSignUp" />
<TextView
android:id="@+id/txtChangeNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/margin_20"
android:layout_marginStart="@dimen/margin_10"
android:layout_marginTop="@dimen/margin_5"
android:gravity="end"
android:text="@string/txtChange"
android:textColor="@color/blue1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/txtDigit" />
<TextView
android:id="@+id/txtCode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_10"
android:layout_marginTop="@dimen/margin_5"
android:text="@string/code"
android:textColor="@color/black"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/txtChangeNumber" />
<LinearLayout
android:id="@+id/otpLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="6"
android:gravity="center"
android:orientation="horizontal"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtCode">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlOTP1"
android:layout_weight="1"
android:gravity="center"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="0dp"
android:layout_marginEnd="@dimen/margin_2"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtOTP1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:inputType="number"
android:textColor="@color/black"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14"
tool:ignore="TextContrastCheck,SpeakableTextPresentCheck" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlOTP2"
android:layout_weight="1"
android:layout_marginEnd="@dimen/margin_2"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="0dp"
android:gravity="center"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@+id/tlOTP1"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtOTP2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:inputType="number"
android:textColor="@color/black"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14"
tool:ignore="TextContrastCheck,SpeakableTextPresentCheck" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlOTP3"
android:layout_weight="1"
android:layout_marginEnd="@dimen/margin_2"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
app:layout_constraintStart_toEndOf="@+id/tlOTP2"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtOTP3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:inputType="number"
android:textColor="@color/black"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14"
tool:ignore="TextContrastCheck,SpeakableTextPresentCheck" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlOTP4"
android:layout_weight="1"
android:layout_marginEnd="@dimen/margin_2"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
app:layout_constraintStart_toEndOf="@+id/tlOTP3"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtOTP4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:inputType="number"
android:textColor="@color/black"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14"
tool:ignore="TextContrastCheck,SpeakableTextPresentCheck" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlOTP5"
android:layout_weight="1"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="0dp"
android:gravity="center"
android:layout_marginEnd="@dimen/margin_2"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@+id/tlOTP4"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtOTP5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:inputType="number"
android:textColor="@color/black"
android:textSize="@dimen/text_size_14"
tool:ignore="TextContrastCheck,SpeakableTextPresentCheck" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlOTP6"
android:layout_weight="1"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="0dp"
android:gravity="center"
android:layout_marginEnd="@dimen/margin_2"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@+id/tlOTP5"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtOTP6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:inputType="number"
android:textColor="@color/black"
android:textSize="@dimen/text_size_14"
tool:ignore="TextContrastCheck,SpeakableTextPresentCheck,TouchTargetSizeCheck" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<TextView
android:id="@+id/txtTimer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_5"
android:layout_marginEnd="@dimen/margin_20"
android:gravity="end"
android:text="(00:30)"
android:textColor="@color/black"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/otpLayout" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnSubmit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_30"
android:layout_marginTop="@dimen/margin_50"
android:layout_marginEnd="@dimen/margin_30"
android:text="@string/submit"
android:textColor="@color/white"
android:backgroundTint="@color/red"
app:cornerRadius="@dimen/margin_15"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/otpLayout" />
<TextView
android:id="@+id/txtTimerText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_10"
android:layout_marginTop="@dimen/margin_40"
android:gravity="center"
android:text="@string/secondsTimer"
android:textColor="@color/black"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btnSubmit" />
<TextView
android:id="@+id/txtDidNotGetOTP"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_50"
android:layout_marginTop="@dimen/margin_15"
android:text="@string/didNotGetOTP"
android:textColor="@color/black"
android:textSize="@dimen/text_size_16"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/txtTimerText" />
<TextView
android:id="@+id/txtResendOTP"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_15"
android:text="@string/resendOTP"
android:textColor="@color/lightBlue2"
android:textSize="@dimen/text_size_16"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/txtDidNotGetOTP"
app:layout_constraintTop_toBottomOf="@id/txtTimerText" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

+ 65
- 67
app/src/main/res/layout/fragment_almost_there.xml View File

@ -26,13 +26,13 @@
android:id="@+id/ivInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/next"
android:src="@drawable/svg_info"
app:layout_constraintBottom_toTopOf="@+id/btnReferrer"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/txtSignUp"
app:layout_constraintTop_toTopOf="parent"
android:contentDescription="@string/next"
app:layout_constraintVertical_bias="0.0" />
<TextView
@ -63,22 +63,21 @@
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlDay"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="@dimen/margin_100"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_15"
android:hint="@string/day"
android:hint="@string/date_of_birth_dd_mm_yyyy"
android:padding="@dimen/margin_3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnReferrer">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtDay"
android:id="@+id/edtDate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:digits="@string/number"
android:inputType="number"
android:focusable="false"
android:inputType="none"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14"
tool:ignore="TextContrastCheck" />
@ -86,56 +85,56 @@
</com.google.android.material.textfield.TextInputLayout>
<!-- Month -->
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlMonth"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="@dimen/margin_100"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_5"
android:layout_marginTop="@dimen/margin_15"
android:hint="@string/month"
android:padding="@dimen/margin_3"
app:layout_constraintStart_toEndOf="@+id/tlDay"
app:layout_constraintTop_toBottomOf="@+id/btnReferrer">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtMonth"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:digits="@string/number"
android:inputType="number"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14"
tool:ignore="TextContrastCheck" />
</com.google.android.material.textfield.TextInputLayout>
<!-- <com.google.android.material.textfield.TextInputLayout-->
<!-- android:id="@+id/tlMonth"-->
<!-- style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"-->
<!-- android:layout_width="@dimen/margin_100"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginStart="@dimen/margin_5"-->
<!-- android:layout_marginTop="@dimen/margin_15"-->
<!-- android:hint="@string/month"-->
<!-- android:padding="@dimen/margin_3"-->
<!-- app:layout_constraintStart_toEndOf="@+id/tlDay"-->
<!-- app:layout_constraintTop_toBottomOf="@+id/btnReferrer">-->
<!-- <com.google.android.material.textfield.TextInputEditText-->
<!-- android:id="@+id/edtMonth"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:gravity="center"-->
<!-- android:digits="@string/number"-->
<!-- android:inputType="number"-->
<!-- android:textColorHint="@color/greyColor2"-->
<!-- android:textSize="@dimen/text_size_14"-->
<!-- tool:ignore="TextContrastCheck" />-->
<!-- </com.google.android.material.textfield.TextInputLayout>-->
<!-- Year -->
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlYear"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="@dimen/margin_150"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_5"
android:layout_marginTop="@dimen/margin_15"
android:hint="@string/year"
android:padding="@dimen/margin_3"
app:layout_constraintStart_toEndOf="@+id/tlMonth"
app:layout_constraintTop_toBottomOf="@+id/btnReferrer">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtYear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:digits="@string/number"
android:inputType="number"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14"
tool:ignore="TextContrastCheck" />
</com.google.android.material.textfield.TextInputLayout>
<!-- <com.google.android.material.textfield.TextInputLayout-->
<!-- android:id="@+id/tlYear"-->
<!-- style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"-->
<!-- android:layout_width="@dimen/margin_150"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginStart="@dimen/margin_5"-->
<!-- android:layout_marginTop="@dimen/margin_15"-->
<!-- android:hint="@string/year"-->
<!-- android:padding="@dimen/margin_3"-->
<!-- app:layout_constraintStart_toEndOf="@+id/tlDay"-->
<!-- app:layout_constraintTop_toBottomOf="@+id/btnReferrer">-->
<!-- <com.google.android.material.textfield.TextInputEditText-->
<!-- android:id="@+id/edtYear"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:gravity="center"-->
<!-- android:digits="@string/number"-->
<!-- android:inputType="number"-->
<!-- android:textColorHint="@color/greyColor2"-->
<!-- android:textSize="@dimen/text_size_14"-->
<!-- tool:ignore="TextContrastCheck" />-->
<!-- </com.google.android.material.textfield.TextInputLayout>-->
<!--Full Name -->
<com.google.android.material.textfield.TextInputLayout
@ -152,8 +151,8 @@
android:id="@+id/edtFullName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:digits="@string/onlyAlphabets"
android:inputType="text"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14"
tool:ignore="TextContrastCheck" />
@ -241,8 +240,8 @@
android:id="@+id/edtPinCode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:digits="@string/number"
android:inputType="number"
android:maxLength="6"
android:maxLines="1"
android:textColorHint="@color/greyColor2"
@ -321,8 +320,8 @@
android:id="@+id/tvTermsAndCondition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_5"
android:layout_marginStart="@dimen/margin_45"
android:layout_marginTop="@dimen/margin_5"
android:text="@string/terms_and_conditions"
android:textColor="@color/blue1"
app:layout_constraintStart_toEndOf="@+id/tvPrivacyPolicy"
@ -334,8 +333,8 @@
android:id="@+id/tvPrivacyPolicy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_5"
android:layout_marginStart="@dimen/margin_5"
android:layout_marginTop="@dimen/margin_5"
android:text="@string/privacyPolicy"
android:textColor="@color/blue1"
app:layout_constraintStart_toEndOf="@+id/tvTermsAndCondition"
@ -349,18 +348,18 @@
android:layout_marginTop="@dimen/margin_5"
android:text="@string/and"
app:layout_constraintStart_toEndOf="@+id/tvPrivacyPolicy"
app:layout_constraintTop_toBottomOf="@id/byClicking"/>
app:layout_constraintTop_toBottomOf="@id/byClicking" />
<TextView
android:id="@+id/tvAgreement"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_5"
android:layout_marginStart="@dimen/margin_45"
android:layout_marginTop="@dimen/margin_5"
android:text="@string/agreement"
android:textColor="@color/blue1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvTermsAndCondition"/>
app:layout_constraintTop_toBottomOf="@id/tvTermsAndCondition" />
</androidx.constraintlayout.widget.ConstraintLayout>
@ -399,13 +398,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_150"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginBottom="@dimen/margin_20"
app:layout_constraintTop_toBottomOf="@+id/btnNext"
android:text="@string/upNextHome"
app:layout_constraintBottom_toBottomOf="parent"/>
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnNext" />
</androidx.constraintlayout.widget.ConstraintLayout>

+ 214
- 11
app/src/main/res/layout/fragment_get_started.xml View File

@ -11,7 +11,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:padding="@dimen/margin_15"
android:paddingStart="@dimen/margin_15"
android:paddingEnd="@dimen/margin_15"
android:paddingTop="@dimen/margin_15"
android:paddingBottom="@dimen/margin_120"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@ -73,32 +76,133 @@
android:padding="@dimen/margin_3"
app:layout_constraintTop_toBottomOf="@+id/subHeader">
<com.google.android.material.textfield.TextInputEditText
<com.google.android.material.textfield.MaterialAutoCompleteTextView
android:id="@+id/edtArnNumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14"
android:padding="@dimen/margin_15"
tool:ignore="TextContrastCheck" />
</com.google.android.material.textfield.TextInputLayout>
<RelativeLayout
android:id="@+id/rlARNUpload"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:layout_marginTop="@dimen/margin_10"
app:layout_constraintTop_toBottomOf="@+id/tlArnNumber">
<TextView
style="@style/semiBoldStyle"
android:id="@+id/tvUploadARN"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:text="@string/uploadArnCard" />
<TextView
android:id="@+id/tvUploadFormat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:text="@string/format_png_or_jpg" />
<RelativeLayout
android:id="@+id/rvARNUploadLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_5"
android:layout_below="@+id/tvUploadFormat"
android:background="@drawable/dot_rect">
<ImageView
android:id="@+id/ivARNUpload"
android:layout_width="@dimen/margin_130"
android:layout_height="@dimen/margin_90"
android:scaleType="fitXY" />
<TextView
android:id="@+id/tvUploadTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textColor="@color/lightBlue1"
android:text="@string/upload" />
</RelativeLayout>
</RelativeLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlEUINNumber"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_10"
android:hint="@string/euinNumberHint"
android:padding="@dimen/margin_3"
app:layout_constraintTop_toBottomOf="@+id/rlARNUpload">
<com.nivesh.production.partnerOnBoarding.util.maskedEditText.MaskedEditText
android:id="@+id/edtEUINNumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:maxEms="18"
android:gravity="top|start"
app:mask="#### / #### / ####"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlPassingAMFI"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_5"
android:hint="@string/enter_your_arn_number"
android:hint="@string/passing_amfi_certificate"
android:padding="@dimen/margin_3"
app:layout_constraintTop_toBottomOf="@+id/tlArnNumber">
app:layout_constraintTop_toBottomOf="@+id/tlEUINNumber">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtEUINNumber"
android:id="@+id/edtPassingAMFI"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:inputType="none"
android:focusable="false"
android:drawableStart="@drawable/svg_cal"
android:drawablePadding="@dimen/margin_10"
android:gravity="center_vertical"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlExpiryAMFI"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_5"
android:hint="@string/expiry_amfi_certificate"
android:padding="@dimen/margin_3"
app:layout_constraintTop_toBottomOf="@+id/tlPassingAMFI">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtExpiryAMFI"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"
android:focusable="false"
android:drawableStart="@drawable/svg_cal"
android:drawablePadding="@dimen/margin_10"
android:gravity="center_vertical"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14" />
@ -113,13 +217,15 @@
android:layout_marginTop="@dimen/margin_5"
android:hint="@string/enter_pan_card_number"
android:padding="@dimen/margin_3"
app:layout_constraintTop_toBottomOf="@+id/tlEUINNumber">
app:layout_constraintTop_toBottomOf="@+id/tlExpiryAMFI">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtPanNumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:digits="@string/panDigit"
android:maxLength="10"
android:inputType="textCapCharacters"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14"
tool:ignore="TextContrastCheck" />
@ -148,6 +254,101 @@
</com.google.android.material.textfield.TextInputLayout>
<RelativeLayout
android:id="@+id/rlEUINUpload"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="visible"
android:layout_marginTop="@dimen/margin_10"
app:layout_constraintTop_toBottomOf="@+id/tlFullNamePanCard">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlEUINName"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_5"
android:hint="@string/euinName"
android:padding="@dimen/margin_3">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edtEUINName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14"
tool:ignore="TextContrastCheck" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tlEUINNumberNF"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_10"
android:hint="@string/euinNumberHint"
android:padding="@dimen/margin_3"
android:layout_below="@+id/tlEUINName">
<com.nivesh.production.partnerOnBoarding.util.maskedEditText.MaskedEditText
android:id="@+id/edtEUINNumberNF"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:maxEms="18"
android:gravity="top|start"
app:mask="#### / #### / ####"
android:textColorHint="@color/greyColor2"
android:textSize="@dimen/text_size_14" />
</com.google.android.material.textfield.TextInputLayout>
<TextView
style="@style/semiBoldStyle"
android:id="@+id/tvUploadEUIN"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/uploadEUINCard"
android:textColor="@color/black"
android:layout_marginTop="@dimen/margin_10"
android:layout_below="@+id/tlEUINNumberNF"/>
<TextView
android:id="@+id/tvUploadEUINFormat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginTop="@dimen/margin_10"
android:text="@string/format_png_or_jpg"
android:layout_below="@+id/tlEUINNumberNF"/>
<RelativeLayout
android:id="@+id/rvEUINUploadLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tvUploadEUIN"
android:background="@drawable/dot_rect">
<ImageView
android:id="@+id/ivEUINUpload"
android:layout_width="@dimen/margin_130"
android:layout_height="@dimen/margin_90"
android:scaleType="fitXY" />
<TextView
android:id="@+id/tvUploadEUINTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textColor="@color/lightBlue1"
android:text="@string/upload" />
</RelativeLayout>
</RelativeLayout>
<View
android:id="@+id/viewHelper"
android:layout_width="match_parent"
@ -155,7 +356,7 @@
android:layout_marginTop="@dimen/margin_16"
android:layout_marginBottom="@dimen/margin_16"
android:background="@drawable/rounded_view"
app:layout_constraintTop_toBottomOf="@+id/tlFullNamePanCard" />
app:layout_constraintTop_toBottomOf="@+id/rlEUINUpload" />
<TextView
android:id="@+id/addAddressProof"
@ -171,7 +372,7 @@
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tlFullNamePanCard" />
app:layout_constraintTop_toBottomOf="@+id/rlEUINUpload" />
<TextView
android:id="@+id/format"
@ -183,7 +384,7 @@
android:textColor="#909090"
android:textSize="@dimen/text_size_14"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tlFullNamePanCard" />
app:layout_constraintTop_toBottomOf="@+id/rlEUINUpload" />
<TextView
android:id="@+id/docTypeHeader"
@ -226,10 +427,12 @@
</com.google.android.material.textfield.TextInputLayout>
<LinearLayout
android:id="@+id/llDoc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/margin_10"
android:orientation="horizontal"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/spAddressType">


+ 18
- 0
app/src/main/res/layout/fragment_question.xml View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/header"
layout="@layout/header_eaggrement"/>
<TextView
android:id="@+id/tvMsg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/margin_10"/>
</LinearLayout>

+ 32
- 0
app/src/main/res/layout/fragment_save_e_agreement.xml View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/header"
layout="@layout/header_eaggrement"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/margin_10"
android:layout_below="@+id/header"
android:layout_marginTop="@dimen/margin_10"
android:text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."/>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnAgree"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerInParent="true"
android:layout_marginStart="@dimen/margin_20"
android:layout_marginEnd="@dimen/margin_20"
android:layout_marginBottom="@dimen/margin_20"
android:backgroundTint="@color/red"
android:text="@string/agree"
android:textColor="@color/white" />
</RelativeLayout>

+ 46
- 0
app/src/main/res/layout/header_eaggrement.xml View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:orientation="horizontal"
android:gravity="center_vertical"
android:background="@color/colorPrimary"
android:padding="@dimen/margin_10">
<ImageView
android:id="@+id/ivBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:src="@drawable/svg_back"/>
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textAllCaps="true"
android:layout_marginStart="@dimen/margin_20"
android:layout_marginTop="@dimen/margin_10"
android:textSize="@dimen/text_size_18"
android:layout_toEndOf="@+id/ivBack"
android:layout_centerVertical="true"
android:textColor="@color/white"/>
<TextView
android:id="@+id/tvHelpCall"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textAllCaps="true"
android:gravity="center"
android:visibility="gone"
android:layout_marginTop="@dimen/margin_2"
android:layout_marginEnd="@dimen/margin_10"
android:textSize="@dimen/text_size_15"
android:text="Help"
android:layout_alignParentEnd="true"
android:textColor="@color/white"
android:drawablePadding="@dimen/margin_10"
app:drawableStartCompat="@drawable/svg_phone" />
</RelativeLayout>

+ 24
- 2
app/src/main/res/values-hi-rIN/strings.xml View File

@ -1,4 +1,4 @@
<resources>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="appName">NiveshFDSDK</string>
<string name="bajaj">Bajaj</string>
<string name="app">App</string>
@ -304,7 +304,7 @@
<string name="code">Code</string>
<string name="skip">Skip</string>
<string name="enter_pan_card_number">Enter PAN Card Number</string>
<string name="full_name_as_on_pan_card">Full name as on Pan card</string>
<string name="full_name_as_on_pan_card">Full name as on PAN card</string>
<string name="enter_your_arn_number">Enter your ARN number</string>
<string name="let_s_get_started">Let’s get started</string>
<string name="save_draft">SAVE DRAFT</string>
@ -326,4 +326,26 @@
<string name="change">Change</string>
<string name="up_next_address">Up Next: Address</string>
<string name="euinNum">12345/67890</string>
<string name="euinNumberHint">EUIN Number</string>
<string name="pleaseArnNum">Please Enter Your ARN Number</string>
<string name="pleaseEuinNum">Please Enter EUIN Number</string>
<string name="pleasePassingCertificate">Please Passing AMFI Certificate</string>
<string name="pleaseExpirCertificate">Please Enter Expiry AMFI Certificate</string>
<string name="date_of_birth_dd_mm_yyyy">Date of Birth (DD/MM/YYYY)</string>
<string name="panDigit">ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890</string>
<string name="selectAddressProof">Select Address Proof Type</string>
<string name="invalidEmail">Invalid Email</string>
<string name="termsConditionText"><font color='#5077FF'>Terms &amp; Conditions</font></string>
<string name="agree">Agree</string>
<string name="passing_amfi_certificate">Date of Passing AMFI Certificate</string>
<string name="expiry_amfi_certificate">Date of Expiry AMFI Certificate</string>
<string name="questionsContent">What is ARN Code?</string>
<string name="questions">Questions</string>
<string name="uploadArnCard">Upload ARN Card</string>
<string name="uploadEUINCard">Upload EUIN Card</string>
<string name="fileSizeCant">File Size Can\'t Greater Than 5 MB</string>
<string name="euinName">EUIN Name (Employee)</string>
</resources>

+ 2
- 0
app/src/main/res/values-night/strings.xml View File

@ -2,4 +2,6 @@
<resources>
<string name="add_new_account">Add New Account</string>
<string name="aadhar">Aadhar</string>
<string name="euinNumberHint">EUIN Number</string>
<string name="passing_amfi_certificate">Passing AMFI Certificate</string>
</resources>

+ 4
- 0
app/src/main/res/values/attr_themes.xml View File

@ -5,4 +5,8 @@
<attr name="theme_PrimaryDark" format="reference" />
<attr name="theme_Accent" format="reference" />
<declare-styleable name="MaskedEditText">
<attr name="mask" format="string" />
</declare-styleable>
</resources>

+ 2
- 0
app/src/main/res/values/colors.xml View File

@ -14,6 +14,8 @@
<color name="transparent">#00000000</color>
<color name="lightBlue">#5077FF</color>
<color name="blue1">#006BFF</color>
<color name="lightBlue2">#1FAEFF</color>
<color name="lightBlue1">#0050A1</color>
<color name="button_red">#E92629</color>


+ 25
- 2
app/src/main/res/values/strings.xml View File

@ -1,4 +1,4 @@
<resources>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="appName">NiveshFDSDK</string>
<string name="bajaj">Bajaj</string>
<string name="app">App</string>
@ -191,6 +191,9 @@
<string name="emptyPaymentMode">Please select payment mode</string>
<string name="pleaseArnNum">Please Enter Your ARN Number</string>
<!-- Step Three -->
<string name="uploadKycDocuments">Upload KYC Documents</string>
@ -312,7 +315,7 @@
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="enter_pan_card_number">Enter PAN Card Number</string>
<string name="full_name_as_on_pan_card">Full name as on Pan card</string>
<string name="full_name_as_on_pan_card">Full name as on PAN card</string>
<string name="enter_your_arn_number">Enter your ARN number</string>
<string name="let_s_get_started">Let’s get started</string>
<string name="save_draft">SAVE DRAFT</string>
@ -337,5 +340,25 @@
<item>Driving Licenses</item>
<item>Voter Id</item>
</array>
<string name="euinNum">12345/67890</string>
<string name="euinNumberHint">EUIN Number</string>
<string name="passing_amfi_certificate">Date of Passing AMFI Certificate</string>
<string name="expiry_amfi_certificate">Date of Expiry AMFI Certificate</string>
<string name="pleaseEuinNum">Please Enter EUIN Number</string>
<string name="pleasePassingCertificate">Please Enter Passing AMFI Certificate</string>
<string name="pleaseExpirCertificate">Please Enter Expiry AMFI Certificate</string>
<string name="date_of_birth_dd_mm_yyyy">Date of Birth (DD/MM/YYYY)</string>
<string name="panDigit">ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890</string>
<string name="selectAddressProof">Select Address Proof Type</string>
<string name="invalidEmail">Invalid Email</string>
<string name="termsConditionText"><font color='#5077FF'>Terms &amp; Conditions</font></string>
<string name="agree">Agree</string>
<string name="questionsContent"><h1>What is ARN Code?</h1>\n\nApplication Reference Number (Full form of ARN) Code is a unique number assigned to every qualified Mutual Fund expert or Mutual Fund distributor for trading in the schemes. This code is allocated by the Association of Mutual Funds in India (AMFI), required by the Asset Management Companies (AMC) to deal with Fund Managers in the selling and marketing of Funds.</string>
<string name="questions">Questions</string>
<string name="uploadArnCard">Upload ARN Card</string>
<string name="uploadEUINCard">Upload EUIN Card</string>
<string name="fileSizeCant">File Size Can\'t Greater Than 5 MB</string>
<string name="euinName">EUIN Name (Employee)</string>
</resources>

+ 1
- 1
app/src/main/res/values/themes.xml View File

@ -17,7 +17,7 @@
<style name="Theme.GoogleLogin" parent="Widget.MaterialComponents.Button.OutlinedButton">
<item name="colorPrimary">@color/white</item>
<item name="android:drawablePadding">@dimen/margin_10</item>
<item name="android:drawablePadding">@dimen/margin_15</item>
<item name="android:drawableLeft">@drawable/google_icon</item>
<item name="strokeWidth">1dp</item>
<item name="elevation">@dimen/margin_8</item>


Loading…
Cancel
Save

Powered by TurnKey Linux.