diff --git a/app/build.gradle b/app/build.gradle index 01106c4..13557a8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c330fde..2008589 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,6 +29,7 @@ android:supportsRtl="true" android:requestLegacyExternalStorage="true" android:theme="@style/Theme.NiveshFDSDK" + android:usesCleartextTraffic="true" tools:targetApi="31"> ) : +class NewDistributorSignStepOneAdapter(private var listData: List) : RecyclerView.Adapter() { private var context: Context? = null private var isPosBroker: Boolean? = false @@ -30,19 +31,19 @@ class NewDistributorSignStepOneAdapter(private var listData: MutableList } 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) diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/api/ApiClient.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/api/ApiClient.kt index 1ec7f32..029cee7 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/api/ApiClient.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/api/ApiClient.kt @@ -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) } } - -} - - - - +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/db/PreferenceManager.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/db/PreferenceManager.kt index 52a3a02..388c051 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/db/PreferenceManager.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/db/PreferenceManager.kt @@ -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 } diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/ApiInterface.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/ApiInterface.kt index 0e6a702..47c01ee 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/ApiInterface.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/ApiInterface.kt @@ -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 + @POST("Partner/CreatePartner") + suspend fun postPartnerCreation(@Body partnerRequest: PartnerRequest): Response + + @POST("Partner/ValidatePartner") + suspend fun postPartnerValidate(@Body validatePartnerRequest: ValidatePartnerRequest): Response + + @POST("Partner/SendOTP") + suspend fun postOTP(@Body sendOTPRequest: SendOTPRequest): Response + + @POST("Partner/SendOTP") + suspend fun postSaveEagreementOTP(@Body sendOTPRequest: SendOTPRequest): Response + + @POST("Partner/VerifyOTP") + suspend fun postVerifyOTP(@Body requestBody: RequestBody): Response + + @POST("Partner/GetAMFIDetail") + suspend fun postAMFIDetail(@Body requestBody: RequestBody): Response + + @GET//"User/GetPANDetail" + suspend fun getPANDetail(@Url url: String,@Query("PAN") value: String): Response + + @GET//"User/GetDocumentType" + suspend fun getDocumentType(@Url url: String,@Query("Role") value: String, @Query("Type") type: String): Response + + @Multipart + @POST("Partner/DocumentsUpload") + suspend fun getUploadDocument( + @Part multiPartBody: List, + @Part("PartnerCode") partnerCode: Int, + @Part("PartnerRole") partnerRole: Int, + @Part("DocumentId") documentId: Int + ): Response + + @POST("Partner/SaveEAgreement") + suspend fun postSaveEAgreement(@Body requestBody: RequestBody): Response + + @GET + suspend fun getAllProduct(@Url url: String): Response } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/IPreferenceHelper.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/IPreferenceHelper.kt index cbe4700..5cacf5b 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/IPreferenceHelper.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/IPreferenceHelper.kt @@ -31,4 +31,7 @@ interface IPreferenceHelper { fun clearPrefs() fun getAppId(): String + + fun setPartnerCode(partnerCode: String) + fun getPartnerCode(): String } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Data.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Data.kt new file mode 100644 index 0000000..7ad7875 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Data.kt @@ -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 +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/DataX.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/DataX.kt new file mode 100644 index 0000000..2effa30 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/DataX.kt @@ -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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Error.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Error.kt new file mode 100644 index 0000000..b39ed98 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Error.kt @@ -0,0 +1,6 @@ +package com.nivesh.production.partnerOnBoarding.model + +data class Error( + val ErrorCode: Int, + val ErrorMessage: String +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ErrorX.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ErrorX.kt new file mode 100644 index 0000000..2de43e4 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ErrorX.kt @@ -0,0 +1,6 @@ +package com.nivesh.production.partnerOnBoarding.model + +data class ErrorX( + val ErrorCode: Int, + val ErrorMessage: String +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ImageSelectedModel.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ImageSelectedModel.kt new file mode 100644 index 0000000..a3388b3 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ImageSelectedModel.kt @@ -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 +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Result.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Result.kt new file mode 100644 index 0000000..7997315 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Result.kt @@ -0,0 +1,6 @@ +package com.nivesh.production.partnerOnBoarding.model + +data class Result( + val Errors: List, + val PartnerCode: String +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ResultX.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ResultX.kt new file mode 100644 index 0000000..2122f35 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ResultX.kt @@ -0,0 +1,6 @@ +package com.nivesh.production.partnerOnBoarding.model + +data class ResultX( + val IsPartialRegistered: Boolean, + val PartnerCode: String +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ResultXX.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ResultXX.kt new file mode 100644 index 0000000..af1edb0 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ResultXX.kt @@ -0,0 +1,5 @@ +package com.nivesh.production.partnerOnBoarding.model + +data class ResultXX( + val Errors: List +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/GetAMFIDetailRequest.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/GetAMFIDetailRequest.kt new file mode 100644 index 0000000..8c6912e --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/GetAMFIDetailRequest.kt @@ -0,0 +1,6 @@ +package com.nivesh.production.partnerOnBoarding.model.request + +data class GetAMFIDetailRequest( + var Mobile: String = "", + var ARN: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/PartnerRequest.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/PartnerRequest.kt new file mode 100644 index 0000000..2a085ed --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/PartnerRequest.kt @@ -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 = 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 \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SaveEAgreementRequest.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SaveEAgreementRequest.kt new file mode 100644 index 0000000..498a68b --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SaveEAgreementRequest.kt @@ -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 = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SaveEAgreementRequestX.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SaveEAgreementRequestX.kt new file mode 100644 index 0000000..a13b7b4 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SaveEAgreementRequestX.kt @@ -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 +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SendOTPRequest.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SendOTPRequest.kt new file mode 100644 index 0000000..e43d0e7 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SendOTPRequest.kt @@ -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 +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/ValidatePartnerRequest.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/ValidatePartnerRequest.kt new file mode 100644 index 0000000..12a9e61 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/ValidatePartnerRequest.kt @@ -0,0 +1,5 @@ +package com.nivesh.production.partnerOnBoarding.model.request + +data class ValidatePartnerRequest( + var Mobile: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/Data.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/Data.kt new file mode 100644 index 0000000..859ff1c --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/Data.kt @@ -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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DataX.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DataX.kt new file mode 100644 index 0000000..aa66a5a --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DataX.kt @@ -0,0 +1,6 @@ +package com.nivesh.production.partnerOnBoarding.model.response + +data class DataX( + val ProductId: Int, + val ProductName: String +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DocumentTypeResponse.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DocumentTypeResponse.kt new file mode 100644 index 0000000..387e385 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DocumentTypeResponse.kt @@ -0,0 +1,7 @@ +package com.nivesh.production.partnerOnBoarding.model.response + +data class DocumentTypeResponse( + val Message: String, + val Result: ResultXX, + val Status: String +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DocumentUploadResponse.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DocumentUploadResponse.kt new file mode 100644 index 0000000..17084c0 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DocumentUploadResponse.kt @@ -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 +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/GetAMFIDetailResponse.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/GetAMFIDetailResponse.kt new file mode 100644 index 0000000..3884979 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/GetAMFIDetailResponse.kt @@ -0,0 +1,7 @@ +package com.nivesh.production.partnerOnBoarding.model.response + +data class GetAMFIDetailResponse( + val Message: String, + val Result: ResultX, + val Status: String +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/GetAllProductResponse.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/GetAllProductResponse.kt new file mode 100644 index 0000000..981a67f --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/GetAllProductResponse.kt @@ -0,0 +1,7 @@ +package com.nivesh.production.partnerOnBoarding.model.response + +data class GetAllProductResponse( + val Message: String, + val Result: ResultXXX, + val Status: String +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/PANResponse.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/PANResponse.kt new file mode 100644 index 0000000..3e24268 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/PANResponse.kt @@ -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 \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/PartnerResponse.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/PartnerResponse.kt new file mode 100644 index 0000000..0c41836 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/PartnerResponse.kt @@ -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 +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/Result.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/Result.kt new file mode 100644 index 0000000..e04a9e0 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/Result.kt @@ -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 +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultX.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultX.kt new file mode 100644 index 0000000..d8a1ab4 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultX.kt @@ -0,0 +1,7 @@ +package com.nivesh.production.partnerOnBoarding.model.response + +import com.nivesh.production.partnerOnBoarding.model.DataX + +data class ResultX( + val `data`: List +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultXX.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultXX.kt new file mode 100644 index 0000000..3592464 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultXX.kt @@ -0,0 +1,5 @@ +package com.nivesh.production.partnerOnBoarding.model.response + +data class ResultXX( + val Data: List +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultXXX.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultXXX.kt new file mode 100644 index 0000000..d413db2 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultXXX.kt @@ -0,0 +1,5 @@ +package com.nivesh.production.partnerOnBoarding.model.response + +data class ResultXXX( + val Data: List +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/SaveEAgreementResponse.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/SaveEAgreementResponse.kt new file mode 100644 index 0000000..9a86e89 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/SaveEAgreementResponse.kt @@ -0,0 +1,7 @@ +package com.nivesh.production.partnerOnBoarding.model.response + +data class SaveEAgreementResponse( + val Message: String, + val Result: String, + val Status: String +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/SendOTPResponse.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/SendOTPResponse.kt new file mode 100644 index 0000000..d75a7c9 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/SendOTPResponse.kt @@ -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 +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ValidateOTPResponse.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ValidateOTPResponse.kt new file mode 100644 index 0000000..b71cedb --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ValidateOTPResponse.kt @@ -0,0 +1,7 @@ +package com.nivesh.production.partnerOnBoarding.model.response + +data class ValidateOTPResponse( + val Message: String, + val Result: Any, + val Status: String +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ValidatePartnerResponse.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ValidatePartnerResponse.kt new file mode 100644 index 0000000..76d5eff --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ValidatePartnerResponse.kt @@ -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 +) \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/DataRepository.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/DataRepository.kt new file mode 100644 index 0000000..43e3e03 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/DataRepository.kt @@ -0,0 +1,4 @@ +package com.nivesh.production.partnerOnBoarding.repositories + +class DataRepository { +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/MainRepository.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/MainRepository.kt index c00a18f..57483c4 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/MainRepository.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/MainRepository.kt @@ -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,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) } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/RegisterActivity.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/RegisterActivity.kt index 948b8ba..79c515a 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/RegisterActivity.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/RegisterActivity.kt @@ -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) } } diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/SignUpActivity.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/SignUpActivity.kt index bec5935..1e5baa6 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/SignUpActivity.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/SignUpActivity.kt @@ -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 diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/AlmostThereFragment.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/AlmostThereFragment.kt index 6bedfaa..da89386 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/AlmostThereFragment.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/AlmostThereFragment.kt @@ -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 } } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/GetStartedFragment.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/GetStartedFragment.kt index e402ec9..0be8071 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/GetStartedFragment.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/GetStartedFragment.kt @@ -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? = null private var selectImageIntent: ActivityResultLauncher? = 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 + private var imageSelectedList = ArrayList() + private var arnList = ArrayList() + private lateinit var arnData: DataX + private lateinit var panRes: PANResponse + private var isCharacterTotalCountReach = false + private val MaxFileSize = 5 - private val listArray = ArrayList() 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() + + 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 + + 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)) + } + } } } diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/NewDistributorSignStepOne.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/NewDistributorSignStepOne.kt index 39cffa7..a45fe89 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/NewDistributorSignStepOne.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/NewDistributorSignStepOne.kt @@ -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 - companion object{ + companion object { var listMapData: MutableMap? = 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() + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/OTPFragment.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/OTPFragment.kt index f12383e..4ee272f 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/OTPFragment.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/OTPFragment.kt @@ -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.LengthFilter(1)) binding.edtOTP2.filters = arrayOf(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 ) { } - } } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/QuestionsFragment.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/QuestionsFragment.kt new file mode 100644 index 0000000..b1d7ccc --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/QuestionsFragment.kt @@ -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() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SaveEAgreementFragment.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SaveEAgreementFragment.kt new file mode 100644 index 0000000..a4da0c8 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SaveEAgreementFragment.kt @@ -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.LengthFilter(1)) + edtOTP2.filters = arrayOf(InputFilter.LengthFilter(1)) + edtOTP3.filters = arrayOf(InputFilter.LengthFilter(1)) + edtOTP4.filters = arrayOf(InputFilter.LengthFilter(1)) + edtOTP5.filters = arrayOf(InputFilter.LengthFilter(1)) + edtOTP6.filters = arrayOf(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 + ) { + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SignUpFragment.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SignUpFragment.kt index da97994..cbe43f3 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SignUpFragment.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SignUpFragment.kt @@ -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.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") + } } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Common.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Common.kt index f16fdd4..14939ab 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Common.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Common.kt @@ -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): Resource? { + 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 = 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)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Constants.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Constants.kt index a192f54..73873ed 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Constants.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Constants.kt @@ -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" } } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ImageFilePath.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ImageFilePath.kt new file mode 100644 index 0000000..3f528be --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ImageFilePath.kt @@ -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 { + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/MaskWatcher.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/MaskWatcher.kt deleted file mode 100644 index bc15ce5..0000000 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/MaskWatcher.kt +++ /dev/null @@ -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("###.###.###-##") - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/IFormattedString.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/IFormattedString.kt new file mode 100644 index 0000000..35afd4c --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/IFormattedString.kt @@ -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() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/Mask.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/Mask.kt new file mode 100644 index 0000000..893e946 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/Mask.kt @@ -0,0 +1,60 @@ +package com.nivesh.production.partnerOnBoarding.util.maskedEditText + +class Mask() { + lateinit var formatString: String + private lateinit var mMask: List + private val mFabric: MaskCharacterFabric = MaskCharacterFabric() + private var mPrepopulateCharacter: MutableList? = 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 { + val result = ArrayList() + 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) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskCharacter.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskCharacter.kt new file mode 100644 index 0000000..e539a14 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskCharacter.kt @@ -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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskCharacterFabric.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskCharacterFabric.kt new file mode 100644 index 0000000..3a0fa36 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskCharacterFabric.kt @@ -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' + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedEditText.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedEditText.kt new file mode 100644 index 0000000..63d4df6 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedEditText.kt @@ -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) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedFormatter.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedFormatter.kt new file mode 100644 index 0000000..73d024b --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedFormatter.kt @@ -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) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedWatcher.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedWatcher.kt new file mode 100644 index 0000000..618cf18 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedWatcher.kt @@ -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 = WeakReference(maskedFormatter) + private val mEditText: WeakReference = 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) {} +} \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/viewModels/OnBoardingViewModel.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/viewModels/OnBoardingViewModel.kt index abfb055..5b502ff 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/viewModels/OnBoardingViewModel.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/viewModels/OnBoardingViewModel.kt @@ -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> = 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> = MutableLiveData() // fun getStepsCount( // requestBody: FDStepsCountRequest, @@ -29,4 +57,145 @@ open class OnBoardingViewModel(private val mainRepository: MainRepository) : Vie // } // } + val getPartnerCreationMutableData: MutableLiveData?> = 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?> = 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?> = 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?> = 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?> = 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?> = 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?> = 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?> = 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?> = MutableLiveData() + fun getDocumentUpload( + multipartBody: List, + 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?> = 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?> = 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)) + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/google_icon.xml b/app/src/main/res/drawable/google_icon.xml index b9742f8..3e4fc9a 100644 --- a/app/src/main/res/drawable/google_icon.xml +++ b/app/src/main/res/drawable/google_icon.xml @@ -1,8 +1,8 @@ diff --git a/app/src/main/res/drawable/svg_back.xml b/app/src/main/res/drawable/svg_back.xml new file mode 100644 index 0000000..29e4a65 --- /dev/null +++ b/app/src/main/res/drawable/svg_back.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/svg_cal.xml b/app/src/main/res/drawable/svg_cal.xml new file mode 100644 index 0000000..fd2af52 --- /dev/null +++ b/app/src/main/res/drawable/svg_cal.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/svg_pan_verified.xml b/app/src/main/res/drawable/svg_pan_verified.xml new file mode 100644 index 0000000..523702e --- /dev/null +++ b/app/src/main/res/drawable/svg_pan_verified.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/svg_phone.xml b/app/src/main/res/drawable/svg_phone.xml new file mode 100644 index 0000000..c54efd7 --- /dev/null +++ b/app/src/main/res/drawable/svg_phone.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_register.xml b/app/src/main/res/layout/activity_register.xml index b550705..ed62148 100644 --- a/app/src/main/res/layout/activity_register.xml +++ b/app/src/main/res/layout/activity_register.xml @@ -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"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_almost_there.xml b/app/src/main/res/layout/fragment_almost_there.xml index 036b9d2..cbfb7bc 100644 --- a/app/src/main/res/layout/fragment_almost_there.xml +++ b/app/src/main/res/layout/fragment_almost_there.xml @@ -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" /> @@ -86,56 +85,56 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -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" /> + app:layout_constraintTop_toBottomOf="@id/tvTermsAndCondition" /> @@ -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" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_get_started.xml b/app/src/main/res/layout/fragment_get_started.xml index c9e5059..70ac3fb 100644 --- a/app/src/main/res/layout/fragment_get_started.xml +++ b/app/src/main/res/layout/fragment_get_started.xml @@ -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"> - + + + + + + + + + + + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/tlEUINNumber"> + + + + + + @@ -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"> @@ -148,6 +254,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/rlEUINUpload" /> + app:layout_constraintTop_toBottomOf="@+id/rlEUINUpload" /> + app:layout_constraintTop_toBottomOf="@+id/rlEUINUpload" /> diff --git a/app/src/main/res/layout/fragment_question.xml b/app/src/main/res/layout/fragment_question.xml new file mode 100644 index 0000000..79678e8 --- /dev/null +++ b/app/src/main/res/layout/fragment_question.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_save_e_agreement.xml b/app/src/main/res/layout/fragment_save_e_agreement.xml new file mode 100644 index 0000000..98f94a5 --- /dev/null +++ b/app/src/main/res/layout/fragment_save_e_agreement.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/header_eaggrement.xml b/app/src/main/res/layout/header_eaggrement.xml new file mode 100644 index 0000000..93ebca4 --- /dev/null +++ b/app/src/main/res/layout/header_eaggrement.xml @@ -0,0 +1,46 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index badc2c8..d289f40 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -1,4 +1,4 @@ - + NiveshFDSDK Bajaj App @@ -304,7 +304,7 @@ Code Skip Enter PAN Card Number - Full name as on Pan card + Full name as on PAN card Enter your ARN number Let’s get started SAVE DRAFT @@ -326,4 +326,26 @@ Change Up Next: Address + 12345/67890 + EUIN Number + + Please Enter Your ARN Number + Please Enter EUIN Number + Please Passing AMFI Certificate + Please Enter Expiry AMFI Certificate + Date of Birth (DD/MM/YYYY) + ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 + Select Address Proof Type + Invalid Email + Terms & Conditions + Agree + Date of Passing AMFI Certificate + Date of Expiry AMFI Certificate + What is ARN Code? + Questions + Upload ARN Card + Upload EUIN Card + File Size Can\'t Greater Than 5 MB + EUIN Name (Employee) + \ No newline at end of file diff --git a/app/src/main/res/values-night/strings.xml b/app/src/main/res/values-night/strings.xml index 67f71fe..40e559d 100644 --- a/app/src/main/res/values-night/strings.xml +++ b/app/src/main/res/values-night/strings.xml @@ -2,4 +2,6 @@ Add New Account Aadhar + EUIN Number + Passing AMFI Certificate \ No newline at end of file diff --git a/app/src/main/res/values/attr_themes.xml b/app/src/main/res/values/attr_themes.xml index 33bc24b..0148cc0 100644 --- a/app/src/main/res/values/attr_themes.xml +++ b/app/src/main/res/values/attr_themes.xml @@ -5,4 +5,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 8c8b3af..f4f08bc 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -14,6 +14,8 @@ #00000000 #5077FF #006BFF + #1FAEFF + #0050A1 #E92629 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dc1776b..f1d1635 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,4 +1,4 @@ - + NiveshFDSDK Bajaj App @@ -191,6 +191,9 @@ Please select payment mode + Please Enter Your ARN Number + + Upload KYC Documents @@ -312,7 +315,7 @@ Hello blank fragment Enter PAN Card Number - Full name as on Pan card + Full name as on PAN card Enter your ARN number Let’s get started SAVE DRAFT @@ -337,5 +340,25 @@ Driving Licenses Voter Id + + 12345/67890 + EUIN Number + Date of Passing AMFI Certificate + Date of Expiry AMFI Certificate + Please Enter EUIN Number + Please Enter Passing AMFI Certificate + Please Enter Expiry AMFI Certificate + Date of Birth (DD/MM/YYYY) + ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 + Select Address Proof Type + Invalid Email + Terms & Conditions + Agree +

What is ARN Code?

\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.
+ Questions + Upload ARN Card + Upload EUIN Card + File Size Can\'t Greater Than 5 MB + EUIN Name (Employee)
\ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 0a2f37e..bf2c2ce 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -17,7 +17,7 @@