diff --git a/app/build.gradle b/app/build.gradle index 3ff9eed..daf16a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,11 +39,12 @@ android { ext{ roomVersion="2.4.3" glideVersion="4.11.0" + composeVersion="1.6.4" } dependencies { - implementation 'androidx.core:core-ktx:1.8.0' + implementation 'androidx.core:core-ktx:1.10.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' 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 - var isPosInsurer: Boolean? = false + private var isPosInsurer: Boolean? = false override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { context = parent.context @@ -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) @@ -88,7 +89,7 @@ class NewDistributorSignStepOneAdapter(private var listData: MutableList } holder.radioGroup.setOnCheckedChangeListener { group, checkedId -> - var rb: RadioButton = group.findViewById(checkedId) + val rb: RadioButton = group.findViewById(checkedId) if(rb.text.equals("Yes")) holder.llPOS.visibility = View.VISIBLE else holder.llPOS.visibility = View.GONE diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/adapters/SectionsPagerAdapter1.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/adapters/SectionsPagerAdapter1.kt index 519ff68..c2490a1 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/adapters/SectionsPagerAdapter1.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/adapters/SectionsPagerAdapter1.kt @@ -7,12 +7,8 @@ import androidx.fragment.app.FragmentPagerAdapter class SectionsPagerAdapter1(manager: FragmentManager, private val fragments: Array) : FragmentPagerAdapter(manager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { - private val titles = ArrayList() - override fun getItem(position: Int): Fragment = fragments[position] override fun getCount(): Int = fragments.size - // override fun getPageTitle(position: Int): CharSequence = titles[position] - } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/api/ApiCallback.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/api/ApiCallback.kt deleted file mode 100644 index 026d457..0000000 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/api/ApiCallback.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.nivesh.production.partnerOnBoarding.api - -import com.nivesh.production.partnerOnBoarding.util.Resource -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response - -abstract class ApiCallback : Callback> { - - abstract fun onSuccess(response: Resource) - - abstract fun onFailure(response: Resource) - - override fun onResponse(call: Call>, response: Response>) { - if (response.isSuccessful && response.body() != null && response.code() == 200) { - onSuccess(response.body()!!) - } else if (response.code() == 650){ - // handle 4xx & 5xx error codes here -// val resp = Resource() -// resp.status = false -// resp.message = response.message() -// onFailure(resp) - } - } - - override fun onFailure(call: Call>, t: Throwable) { -// val response = Resource() -// response.status = false -// response.message = t.message.toString() -// onFailure(response) - } -} \ No newline at end of file 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..9c8e0c5 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 @@ -8,30 +8,22 @@ import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import java.security.KeyStore -import java.util.* import java.util.concurrent.TimeUnit import javax.net.ssl.* class ApiClient { val context = NiveshFdApplication.appContext - companion object { - private val client by lazy { - //lazy means we only initialize this here once + + private val clientOne by lazy { val logging = HttpLoggingInterceptor() - //loggingInterceptor use for see making request and for see what responses are logging.setLevel(HttpLoggingInterceptor.Level.BODY) - //see the body of response - //create client for retrofit - val trustManagerFactory: TrustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) trustManagerFactory.init(null as KeyStore?) - val trustManagers: Array = trustManagerFactory.getTrustManagers() + val trustManagers: Array = trustManagerFactory.trustManagers check(!(trustManagers.size != 1 || trustManagers[0] !is X509TrustManager)) { - "Unexpected default trust managers:" + Arrays.toString( - trustManagers - ) + "Unexpected default trust managers:" + trustManagers.contentToString() } val trustManager: X509TrustManager = trustManagers[0] as X509TrustManager val sslContext = SSLContext.getInstance("SSL") @@ -54,13 +46,9 @@ class ApiClient { .client(client) .build() } - val getApiClient: ApiInterface by lazy { - client.create(ApiInterface::class.java) + + 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..60be7f4 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 @@ -9,60 +9,12 @@ open class PreferenceManager(context: Context) : IPreferenceHelper { private var preferences: SharedPreferences = context.getSharedPreferences(preferenceName, Context.MODE_PRIVATE) companion object { - const val KEY_USER_UID = "UserUid" - const val KEY_LOGIN_ROLE = "LoginRole" - const val KEY_SUB_BROKER_CODE = "SubBrokerCode" - 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" - const val IS_FIRST_TIME = "IS FIRST TIME" - const val APP_ID = "AppId" - } - - - override fun getLoginPasswordHash(): String { - return preferences[KEY_LOGIN_PASSWORD] ?: "" - } - - override fun setLoginPasswordHash(appName: String) { - preferences[KEY_LOGIN_PASSWORD] = appName - } - - override fun setUserUid(appName: Int) { - preferences[KEY_USER_UID] = appName } - override fun getUserUid(): Int { - return preferences[KEY_USER_UID] ?: -1 - } - - override fun setLoginRole(appName: Int) { - preferences[KEY_LOGIN_ROLE] = appName - } - - override fun getLoginRole(): Int { - return preferences[KEY_LOGIN_ROLE] ?: -1 - } - - - override fun setSubBrokerID(appName: String) { - preferences[KEY_SUB_BROKER_CODE] = appName - } - - override fun getSubBrokerID(): String { - return preferences[KEY_SUB_BROKER_CODE] ?: "" - } - - override fun setClientUmsID(appName: String) { - preferences[KEY_CLIENT_UMS_ID] = appName - } - - override fun getClientUmsID(): String { - return preferences[KEY_CLIENT_UMS_ID] ?: "" - } override fun setClientCode(appName: String) { preferences[KEY_CLIENT_CODE] = appName @@ -72,20 +24,20 @@ open class PreferenceManager(context: Context) : IPreferenceHelper { return preferences[KEY_CLIENT_CODE] ?: "" } - override fun setToken(appName: String) { - preferences[KEY_GET_TOKEN] = appName + override fun setPartnerCode(partnerCode: String) { + preferences[KEY_PARTNER_CODE] = partnerCode } - override fun getToken(): String { - return preferences[KEY_GET_TOKEN] ?: "" + override fun getPartnerCode(): String { + return preferences[KEY_PARTNER_CODE] ?: "" } - override fun setLanguage(appName: String) { - preferences[CLIENT_LANGUAGE] = appName + override fun setToken(appName: String) { + preferences[KEY_GET_TOKEN] = appName } - override fun getLanguage(): String { - return preferences[CLIENT_LANGUAGE] ?: "" + override fun getToken(): String { + return preferences[KEY_GET_TOKEN] ?: "" } @@ -97,9 +49,6 @@ open class PreferenceManager(context: Context) : IPreferenceHelper { return preferences[IS_FIRST_TIME] ?: false } - override fun getAppId(): String { - return preferences[APP_ID] ?: "" - } override fun clearPrefs() { preferences.edit().clear().apply() 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..b5b4459 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,12 @@ 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.SendOTPRequest +import com.nivesh.production.partnerOnBoarding.model.request.ValidatePartnerRequest +import okhttp3.MultipartBody +import okhttp3.RequestBody import retrofit2.Response import retrofit2.http.* @@ -19,4 +25,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..0709c50 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 @@ -2,33 +2,17 @@ package com.nivesh.production.partnerOnBoarding.interfaces interface IPreferenceHelper { - fun getLoginPasswordHash(): String - fun setLoginPasswordHash(appName: String) - - fun getUserUid(): Int - fun setUserUid(appName: Int) - - fun getLoginRole(): Int - fun setLoginRole(appName: Int) - - fun getSubBrokerID(): String - fun setSubBrokerID(appName: String) - - fun getClientUmsID(): String - fun setClientUmsID(appName: String) - fun getClientCode(): String fun setClientCode(appName: String) fun setToken(appName: String) fun getToken(): String - fun setLanguage(appName: String) - fun getLanguage(): String - fun setIsFirstTime(appName: Boolean) fun getFirstTime(): Boolean + fun setPartnerCode(partnerCode: String) + fun getPartnerCode(): String + fun clearPrefs() - fun getAppId(): 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/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..37b1598 --- /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/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/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/MainRepository.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/MainRepository.kt index c00a18f..ece77a7 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,15 +1,44 @@ 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.SendOTPRequest +import com.nivesh.production.partnerOnBoarding.model.request.ValidatePartnerRequest +import okhttp3.MultipartBody +import okhttp3.RequestBody class MainRepository constructor(private val apiInterface: ApiInterface) { + suspend fun getPartnerCreationResponse(requestBody: PartnerRequest, token: String) = + apiInterface.postPartnerCreation(requestBody) - // MainActivity -// suspend fun getStepsCountResponse(requestBody: FDStepsCountRequest, token: String) = -// apiInterface.getFDStepsCount(requestBody, token) -// -// suspend fun getClientDetailsResponse(getClientDetails: getClientDetailsRequest, token: String) = -// apiInterface.getClientDetails(getClientDetails, token) -// + 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..fe09d21 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 @@ -24,7 +24,6 @@ class RegisterActivity : BaseActivity() { setContentView(this.root) } - binding.imgInfo.setOnClickListener { } @@ -33,28 +32,15 @@ class RegisterActivity : BaseActivity() { intent = Intent(this@RegisterActivity, RegisterActivity::class.java) startActivity(intent) } + binding.btnDistributor.setOnClickListener { - if (!PreferenceManager(this@RegisterActivity).getFirstTime()){ - intent = Intent(this@RegisterActivity, ViewPagerActivity::class.java) - intent.putExtra("type", 4) - startActivity(intent) - }else{ - intent = Intent(this@RegisterActivity, SignUpActivity::class.java) - intent.putExtra("type", 4) - startActivity(intent) - } + commonMethod(4, "advisory") } + binding.btnReferrer.setOnClickListener { - if (!PreferenceManager(this@RegisterActivity).getFirstTime()){ - intent = Intent(this@RegisterActivity, ViewPagerActivity::class.java) - intent.putExtra("type", 3) - startActivity(intent) - }else{ - intent = Intent(this@RegisterActivity, SignUpActivity::class.java) - intent.putExtra("type", 3) - startActivity(intent) - } + commonMethod(3, "Associate") } + binding.imgInfo.setOnClickListener { showWebViewDialogBottom( this@RegisterActivity, @@ -64,10 +50,20 @@ class RegisterActivity : BaseActivity() { } } + private fun commonMethod(type: Int, brokerType: String) { + intent = if (!PreferenceManager(this@RegisterActivity).getFirstTime()){ + Intent(this@RegisterActivity, ViewPagerActivity::class.java) + }else{ + Intent(this@RegisterActivity, SignUpActivity::class.java) + } + intent.putExtra("type", type) + intent.putExtra("arnType",brokerType) + startActivity(intent) + } + private fun getScreenHeight(): Int { val height: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - val defaultDisplay = - DisplayManagerCompat.getInstance(this).getDisplay(Display.DEFAULT_DISPLAY) + val defaultDisplay = DisplayManagerCompat.getInstance(this@RegisterActivity).getDisplay(Display.DEFAULT_DISPLAY) val displayContext = createDisplayContext(defaultDisplay!!) displayContext.resources.displayMetrics.heightPixels } else { 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..c7333db 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,18 @@ 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 var type: Int? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -15,6 +21,11 @@ class SignUpActivity : BaseActivity() { } private fun init() { + viewModelOne = ViewModelProvider( + this@SignUpActivity, + OnBoardingModelProviderFactory(MainRepository(ApiClient.getApiClientOne)) + )[OnBoardingViewModel::class.java] + type = intent.getIntExtra("type", 0) binding = ActivitySignupBinding.inflate(layoutInflater) @@ -23,29 +34,11 @@ class SignUpActivity : BaseActivity() { } val bundle = Bundle() bundle.putInt("type", type!!) + bundle.putString("arnType",intent.getStringExtra("arnType")) val fragment = SignUpFragment() fragment.arguments = bundle supportFragmentManager.beginTransaction().add(R.id.signUpContainer, fragment).commit() } - -// override fun onBackPressed() { -// val fm: FragmentManager = supportFragmentManager -// if (fm.backStackEntryCount > 0) { -// Log.i("MainActivity", "popping backstack") -// fm.popBackStack() -// } else { -// Log.i("MainActivity", "nothing on backstack, calling super") -// super.onBackPressed() -// } -// } - - private fun exitOnBackPressed() { - if (isTaskRoot) { - finish() - } else { - - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/ViewPagerActivity.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/ViewPagerActivity.kt index 2f2a453..6401d75 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/ViewPagerActivity.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/ViewPagerActivity.kt @@ -36,14 +36,14 @@ class ViewPagerActivity : BaseActivity() { private fun setViewPager() { PreferenceManager(this@ViewPagerActivity).setIsFirstTime(true) - type = intent.getIntExtra("type", 0); + type = intent.getIntExtra("type", 0) fragments = arrayOf( stepOnePagerFragment, stepTwoPagerFragment, stepThreePagerFragment ) - // set viewPager + sectionsPagerAdapter = SectionsPagerAdapter1(supportFragmentManager, fragments) val viewPager: DisableAdapter1 = binding.viewPager1 viewPager.adapter = sectionsPagerAdapter @@ -77,7 +77,6 @@ class ViewPagerActivity : BaseActivity() { } }) - binding.tvSkip.setOnClickListener{ stepFourApi() } 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..e2d1be8 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,19 +1,36 @@ package com.nivesh.production.partnerOnBoarding.ui.fragments +import android.os.Build import android.os.Bundle import android.text.Editable 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.util.Common +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.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.ui.activities.SignUpActivity +import com.nivesh.production.partnerOnBoarding.util.Common +import com.nivesh.production.partnerOnBoarding.util.Common.Companion.isValidPinCode +import com.nivesh.production.partnerOnBoarding.viewModels.OnBoardingViewModel class AlmostThereFragment : BaseFragment() { private var _binding: FragmentAlmostThereBinding? = null private val binding get() = _binding!! - + private lateinit var viewModel: OnBoardingViewModel override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { @@ -27,27 +44,88 @@ 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) + + 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("") + } + + 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("") + } + + 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("") + } + + 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("") + } + + 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.edtFullName.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable?) {} @@ -84,7 +162,6 @@ class AlmostThereFragment : BaseFragment() { binding.spCity.setOnClickListener { } - binding.spState.setOnClickListener { } @@ -103,89 +180,125 @@ class AlmostThereFragment : BaseFragment() { } binding.btnBack.setOnClickListener { -// (activity as SignUpActivity).onBackPressedDispatcher (activity as SignUpActivity).onBackPressedDispatcher.onBackPressed() } binding.btnNext.setOnClickListener { if (validate()) { - // submit + 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) + } + } + } + + 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() + + val 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 + ) } } } 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 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 + } else if (isValidPinCode(binding.edtPinCode.text.toString())) { // EditText Common.commonErrorMethod( binding.edtPinCode, binding.tlPinCode, - "" + getString(R.string.validPinCode) ) } 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 Common.commonSpinnerErrorMethod( binding.spState, binding.tlState, - "" + getString(R.string.emptyState) + ) + } else if (!binding.cbCheck.isChecked) { + Common.showDialogValidation( + (activity as SignUpActivity), + getString(R.string.termsConditionText) ) - } else if (!binding.cbCheck.isChecked) { // EditText 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..698cb11 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,58 @@ 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.isValidIndividualPan +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.util.Constants.Companion.maxFileSize +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.* class GetStartedFragment : BaseFragment() { private var _binding: FragmentGetStartedBinding? = null @@ -45,26 +73,23 @@ 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 secondDocUpload: Int = 4 + private val mainARNPhotoUpload: Int = 2 + private val mainEUINPhotoUpload: Int = 3 private var actionType: Int = -1 private var panString: String = "" - private var photoString: String = "" - private var docString: String = "" - private var docString2: String = "" private var panFileExt: String? = "" - private var photoFileExt: String? = "" - private var doc1FileExt: String? = "" - private var doc2fileExt: String? = "" private var docValue: String = "" - private var uploadPosition = 0 - private var isFront: Boolean = false + private 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 val listArray = ArrayList() private val permissions = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE @@ -86,18 +111,8 @@ class GetStartedFragment : BaseFragment() { private val requestGalleryPermission = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() - ) { permission -> -// if (!permission.containsValue(false)) { + ) { selectImageIntent?.launch("image/*") -// } else { -// showDialogWithTwoButtons( -// (activity as SignUpActivity), -// getString(R.string.galleryPermission), -// getString( -// R.string.permissionsRequired -// ) -// ) -// } } override fun onCreateView( @@ -105,7 +120,6 @@ class GetStartedFragment : BaseFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - // Inflate the layout for this fragment _binding = FragmentGetStartedBinding.inflate(inflater, container, false) return binding.root } @@ -129,105 +143,77 @@ class GetStartedFragment : BaseFragment() { return null } - 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]) - } + @SuppressLint("SuspiciousIndentation") + private fun init() { + viewModel = ViewModelProvider( + (activity as SignUpActivity), + OnBoardingModelProviderFactory(MainRepository(ApiClient.getApiClientOne)) + )[OnBoardingViewModel::class.java] + + var docType = "I" + if (arguments?.getString("arnType").equals("Associate", true)) { + commonMethodForVisibility(View.GONE) + docType = "N" + } else if (arguments?.getString("arnType").equals("advisory", true)) { + commonMethodForVisibility(View.VISIBLE) + docType = "I" } - return isCorrect - } - private fun init() { + documentTypeAPI(docType) - 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 = '-' + binding.edtPassingAMFI.setOnClickListener { + Common.datePicker(activity as SignUpActivity, binding.edtPassingAMFI) + } - 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.edtExpiryAMFI.setOnClickListener { + Common.datePicker(activity as SignUpActivity, binding.edtExpiryAMFI) + } - 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 + selectImageIntent = registerForActivityResult(ActivityResultContracts.GetContent()) + { uri: Uri? -> + if (uri != null) { + bitmap = uriToBitmap(uri) + uploadDocument(uri, "g") } + } - 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.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) { - 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++ + if (s?.length!! == 7) { + apiAMFIDetail("ARN", s.toString()) } - return digits } + override fun afterTextChanged(s: Editable?) {} }) -// 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.ivInfo.setOnClickListener { + replaceFragment( + activity as BaseActivity, + R.id.signUpContainer, + QuestionsFragment(), + "GET STARTED", + true + ) + } + binding.edtArnNumber.setOnItemClickListener { _, _, position, _ -> + if (arnList != null && arnList.size > 0) { + arnData = arnList[position] + if (arnData.EUIN != null) + binding.edtEUINNumber.setText(arnData.EUIN) - selectImageIntent = registerForActivityResult(ActivityResultContracts.GetContent()) - { uri: Uri? -> - if (uri != null) { - bitmap = uriToBitmap(uri) - uploadDocument(uri, "g") + if (arnData.ARNValidFrom != null) + binding.edtPassingAMFI.setText(arnData.ARNValidFrom) + + if (arnData.ARNValidTill != null) + binding.edtExpiryAMFI.setText(arnData.ARNValidTill) + } else { + binding.edtEUINNumber.setText("") + binding.edtPassingAMFI.setText("") + binding.edtExpiryAMFI.setText("") } } @@ -241,58 +227,398 @@ class GetStartedFragment : BaseFragment() { } binding.btnNext.setOnClickListener { - replaceFragment( - activity as BaseActivity, - R.id.signUpContainer, - AlmostThereFragment(), - "GET STARTED", - true - ) - } - - listArray.add("Aadhaar") - listArray.add("Passport") - listArray.add("Driving Licenses") - listArray.add("Voter Id") - - val arrayAdapter = ArrayAdapter( - activity as SignUpActivity, - androidx.appcompat.R.layout.support_simple_spinner_dropdown_item, - listArray - ) - binding.spDocType.setAdapter(arrayAdapter) + 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 + ) - binding.spDocType.setOnItemClickListener { _, _, position, _ -> - setVisibility(listArray[position]) + } 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 (isValidIndividualPan(s.toString().trim())) { + binding.rlEUINUpload.visibility = View.GONE + } else { + binding.rlEUINUpload.visibility = View.VISIBLE + if (!TextUtils.isEmpty(binding.edtEUINNumber.text)) { + binding.edtEUINNumberNF.setText(binding.edtEUINNumber.text.toString()) + binding.edtEUINNumber.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 commonMethodForVisibility(visibility: Int) { + binding.edtArnNumber.visibility = visibility + binding.tlArnNumber.visibility = visibility + binding.edtEUINNumber.visibility = visibility + binding.tlArnNumber.visibility = visibility + binding.edtPassingAMFI.visibility = visibility + binding.tlPassingAMFI.visibility = visibility + binding.edtExpiryAMFI.visibility = visibility + binding.tlExpiryAMFI.visibility = visibility + } + + 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 == getString(R.string.successText)) { + 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) + } + } + apiAMFIDetail("Mobile", arguments?.getString("mobile")) + } + + } catch (e: Exception) { + Log.e("checkPANError", e.message.toString()) + } + } + + 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 setUploadOption(checked: Boolean) { - isFront = checked + private fun apiAMFIDetail(type: String, value: String?) { + val jsonObject = JSONObject() + val mediaType = "application/json; charset=utf-8".toMediaType() + val 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 + ) + if (res != null && res.Result.data != null) { + arnList.clear() + arnList = res.Result.data as ArrayList + + if (res.Status == getString(R.string.successText)) { + 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) + } + + setArnUploadVisibility(View.GONE) + } else { + val 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) { + setArnUploadVisibility(View.VISIBLE) + } + } + } + + } catch (e: Exception) { + Log.e("check_error", e.message.toString() + "\n" + type + "\n" + value) + } + } + + private fun setArnUploadVisibility(visibility: Int) { + binding.rlARNUpload.visibility = visibility + } + + 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 selectImage() { @@ -376,7 +702,8 @@ class GetStartedFragment : BaseFragment() { } private fun setVisibility(s: String) { - if (s.contains("Aadhaar")) { + binding.llDoc.visibility = View.VISIBLE + if (s.contains(getString(R.string.aadhaarText))) { binding.txtFront.visibility = View.VISIBLE binding.uploadFront.visibility = View.VISIBLE binding.txtBack.visibility = View.VISIBLE @@ -475,61 +802,159 @@ 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() + + 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) -// 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 = "" -// } -// } + 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)) + } + } } } + private fun apiUploadDocument() { + + if (imageSelectedList != null && imageSelectedList.size != 0) { + + val 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 == getString(R.string.successText)) { + Toast.makeText(activity as SignUpActivity, res.Message, Toast.LENGTH_LONG) + .show() + } + } + } + } + + private fun prepareImagePart(file: File, partName: String): MultipartBody.Part { + val requestBody: RequestBody = + file.asRequestBody("application/octet-stream".toMediaTypeOrNull()) + return MultipartBody.Part.createFormData( + "Files", + partName, + requestBody + ) + } + private fun setFrontHideVisible(uri: Uri) { if (isFront) { binding.uploadFront.visibility = View.GONE 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..46f8c82 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,28 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +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!! + private lateinit var viewModel: OnBoardingViewModel - companion object{ + companion object { var listMapData: MutableMap? = null } @@ -23,8 +34,8 @@ class NewDistributorSignStepOne : BaseFragment(){ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - _binding = NewDistributorSignStepOneBinding.inflate(inflater,container,false) + ): View { + _binding = NewDistributorSignStepOneBinding.inflate(inflater, container, false) return binding.root } @@ -34,17 +45,57 @@ class NewDistributorSignStepOne : BaseFragment(){ } private fun init() { + viewModel = ViewModelProvider( + (activity as SignUpActivity), + OnBoardingModelProviderFactory(MainRepository(ApiClient.getApiClientOne)) + )[OnBoardingViewModel::class.java] - 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") + (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 == getString(R.string.successText))) { + binding.rvList.layoutManager = LinearLayoutManager(activity as SignUpActivity) + val adapter = NewDistributorSignStepOneAdapter(res.Result.Data) + binding.rvList.adapter = adapter + } + } - 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") + val 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..162920e 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,6 +4,7 @@ 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 @@ -12,13 +13,20 @@ import android.widget.EditText import androidx.fragment.app.Fragment import com.nivesh.production.partnerOnBoarding.R import com.nivesh.production.partnerOnBoarding.databinding.FragmentOtpBinding +import com.nivesh.production.partnerOnBoarding.model.request.SendOTPRequest import com.nivesh.production.partnerOnBoarding.ui.activities.BaseActivity +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 OTPFragment : BaseFragment() { private var _binding: FragmentOtpBinding? = null private val binding get() = _binding!! private var type: Int? = null + private var mobile: String? = null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -30,11 +38,14 @@ 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() { + smsAPI() + binding.edtOTP1.filters = arrayOf(InputFilter.LengthFilter(1)) binding.edtOTP2.filters = arrayOf(InputFilter.LengthFilter(1)) binding.edtOTP3.filters = arrayOf(InputFilter.LengthFilter(1)) @@ -58,31 +69,84 @@ 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() { + val 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() + val 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 { return if (binding.edtOTP1.text.toString().isEmpty()) { // EditText Common.commonErrorMethod( @@ -131,7 +195,6 @@ class OTPFragment : BaseFragment() { ) : 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 @@ -144,7 +207,7 @@ class OTPFragment : BaseFragment() { private val currentView: View, private val nextView: View? ) : TextWatcher { - override fun afterTextChanged(editable: Editable) { // TODO Auto-generated method stub + override fun afterTextChanged(editable: Editable) { val text = editable.toString() when (currentView.id) { R.id.edtOTP1 -> if (text.length == 1) nextView!!.requestFocus() @@ -152,7 +215,6 @@ class OTPFragment : BaseFragment() { 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 } } @@ -171,6 +233,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..ec3f98a --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/QuestionsFragment.kt @@ -0,0 +1,37 @@ +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 { + _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..017fb40 --- /dev/null +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SaveEAgreementFragment.kt @@ -0,0 +1,361 @@ +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!! + 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() { + + 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.Status == getString(R.string.successText)) { + 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) { + val 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() + val 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" + (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 ==getString(R.string.successText)) { + 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..02106f1 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,34 @@ 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.R +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.util.Common.Companion.isValidMobileNumber +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 = "" + private lateinit var viewModel: OnBoardingViewModel override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -27,10 +43,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?) {} @@ -42,20 +64,86 @@ 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 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 == (activity as SignUpActivity).getString(R.string.successText)) { + 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 == (activity as SignUpActivity).getString(R.string.successText)) { + 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, + R.id.signUpContainer, + fragment, + "OTP", + true + ) } @@ -64,22 +152,23 @@ class SignUpFragment : BaseFragment() { Common.commonErrorMethod( binding.edtMobileNumber, binding.tlMobileNumber, - getString(com.nivesh.production.partnerOnBoarding.R.string.emptyMobileNumber) + getString(R.string.emptyMobileNumber) ) - } else if (binding.edtMobileNumber.text?.length != 10) { // EditText + } else if (!isValidMobileNumber(binding.edtMobileNumber.text.toString())) { // EditText Common.commonErrorMethod( binding.edtMobileNumber, binding.tlMobileNumber, - getString(com.nivesh.production.partnerOnBoarding.R.string.inValidMobileNumber) + getString(R.string.inValidMobileNumber) ) } else if (!Common.isIndianMobileNo(binding.edtMobileNumber.text.toString())) { // EditText Common.commonErrorMethod( binding.edtMobileNumber, binding.tlMobileNumber, - getString(com.nivesh.production.partnerOnBoarding.R.string.inValidIndianMobileNumber) + getString(R.string.inValidIndianMobileNumber) ) } else { return true } } + } \ 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..8a723c2 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 @@ -2,20 +2,19 @@ package com.nivesh.production.partnerOnBoarding.util import android.app.Activity import android.app.AlertDialog +import android.app.DatePickerDialog import android.app.Dialog import android.content.Context import android.content.Intent -import android.graphics.Color -import android.graphics.drawable.GradientDrawable import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.net.Uri import android.os.Build import android.provider.Settings -import android.text.format.DateFormat -import android.util.Log +import android.text.TextUtils import android.util.Patterns import android.view.Gravity +import android.view.View import android.view.Window import android.webkit.WebView import android.widget.ImageView @@ -25,8 +24,8 @@ 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.ui.activities.SignUpActivity import kotlinx.coroutines.CoroutineExceptionHandler -import org.json.JSONObject import retrofit2.HttpException import retrofit2.Response import java.io.IOException @@ -39,12 +38,6 @@ import java.util.regex.Pattern class Common { companion object { - /** - *Before use this method write following code in model class - app:Application(in activity and model) - changes in hasInternetConnection - val connectivityManager = getApplication().getSystemService(.... - **/ //internet check fun isNetworkAvailable(activity: Activity): Boolean { val connectivityManager = activity.getSystemService( @@ -81,24 +74,19 @@ class Common { return Patterns.EMAIL_ADDRESS.matcher(target.toString()).matches() } - //valid Name Check - fun isValidName(nameText: String?): Boolean { - val pattern = Pattern.compile(("^[a-zA-Z\\s]{2,70}$")) - val matcher = pattern.matcher(nameText.toString()) - return matcher.matches() - } //validPanCard fun isValidPan(pan: String?): Boolean { - val mPattern = Pattern.compile("[A-Z]{5}[0-9]{4}[A-Z]") + val mPattern = Pattern.compile("[A-Z]{5}\\d{4}[A-Z]") val mMatcher = mPattern.matcher(pan.toString()) return mMatcher.matches() } - fun isValidIndividualPan(pan: String?): Boolean { - val mPattern = Pattern.compile("[A-Z]{3}[P][A-Z][0-9]{4}[A-Z]") - val mMatcher = mPattern.matcher(pan.toString()) - return mMatcher.matches() + fun isValidIndividualPan(pan: String): Boolean { +// val mPattern = Pattern.compile("[A-Z]{3}P[A-Z]\\d{4}[A-Z]") +// val mMatcher = mPattern.matcher(pan.toString()) +// return mMatcher.matches() + return pan.length == 4 && pan[3] != 'P' } //is Indian mobile Number @@ -113,6 +101,10 @@ class Common { return match.matches() } + fun isValidMobileNumber(mobileNumber : String) : Boolean{ + return mobileNumber.length == 10 + } + fun removeError(textInputLayout: TextInputLayout) { if (textInputLayout.error != null) { textInputLayout.error = null @@ -182,24 +174,6 @@ class Common { builder.show() } - // set Default Step - fun defaultShape(): GradientDrawable { - val shape = GradientDrawable() - shape.shape = GradientDrawable.OVAL - shape.setColor(Color.WHITE) - shape.setStroke(6, Color.parseColor(Colors.colorDefault)) - return shape - } - - // set Selected Step - fun selectedShape(): GradientDrawable { - val shape = GradientDrawable() - shape.shape = GradientDrawable.OVAL - shape.setColor(Color.parseColor(Colors.colorDefault)) - shape.setStroke(6, Color.parseColor(Colors.colorDefault)) - return shape - } - fun commonErrorMethod( inputText: TextInputEditText, inputError: TextInputLayout, @@ -210,16 +184,6 @@ class Common { return false } - fun commonErrorAutoCompleteMethod( - inputText: MaterialAutoCompleteTextView, - inputError: TextInputLayout, - strMessage: String - ): Boolean { - inputText.requestFocus() - inputError.error = strMessage - return false - } - fun commonSpinnerErrorMethod( inputText: MaterialAutoCompleteTextView, inputError: TextInputLayout, @@ -230,13 +194,6 @@ class Common { return false } - fun getDate(string: String): String { - val input = SimpleDateFormat("dd/MM/yyyy", Locale.US) - val mDate: Date? = input.parse(string) - val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US) - return simpleDateFormat.format(mDate as Date) - } - fun handleResponse(response: Response): Resource { if (response.isSuccessful && response.body() != null) { response.body()?.let { resultResponse -> @@ -246,23 +203,6 @@ class Common { return Resource.Error(response.message()) } - fun handleResponse1(response: Response): Resource { - if (response.isSuccessful && response.body() != null) { - return if (response.body().toString().isNotEmpty()) { - Log.e("response", "-->$response") - val str: String = response.body().toString().replace("\r\n", "") - Log.e("str", "-->$str") - val jsonObject = JSONObject(str) - Log.e("jsonObject", "-->$jsonObject") - Resource.Success(jsonObject.toString()) - } else { - Resource.Error(response.message()) - } - } - return Resource.Error(response.message()) - - } - fun handleError(activity: Activity): CoroutineExceptionHandler { val handler = CoroutineExceptionHandler { _, exception -> if (exception is IOException || exception is HttpException) { @@ -280,18 +220,6 @@ class Common { return handler } - fun isMinor(date: String): Boolean { - val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US) - val dt1: Date = simpleDateFormat.parse(date) as Date - val year: Int = DateFormat.format("yyyy", dt1).toString().toInt() - val month: Int = DateFormat.format("mm", dt1).toString().toInt() - val day = DateFormat.format("dd", dt1).toString().toInt() - val userAge: Calendar = GregorianCalendar(year, month, day) - val minAdultAge: Calendar = GregorianCalendar() - minAdultAge.add(Calendar.YEAR, -18) - return minAdultAge.before(userAge) - } - /* this function is used for file size in readable format(End)*/ fun getFileSizeInMB(length: Long): Double { // Get length of file in bytes val fileSizeInBytes = @@ -309,5 +237,57 @@ class Common { "" } } + + fun datePicker(activity: Activity, edtDOB: TextInputEditText): String { + val cal = Calendar.getInstance() + var preSelectedDate = "" + val year: Int + val month: Int + val 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", Locale.US) + val resultDate = Date(long) + return sdf.format((resultDate)) + } + + //valid email check + fun isValidPinCode(target: String): Boolean { + return target.length != 6 + } } } \ 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..b524b4c 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 @@ -1,10 +1,14 @@ package com.nivesh.production.partnerOnBoarding.util -class Constants() { +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 maxFileSize : Double = 5.0 + } } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ImageUtil.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ImageUtil.kt deleted file mode 100644 index cfad66b..0000000 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ImageUtil.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.nivesh.production.partnerOnBoarding.util - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.util.Base64; -import java.io.ByteArrayOutputStream; - - -class ImageUtil { - - @Throws(IllegalArgumentException::class) - fun convert(base64Str: String): Bitmap? { - val decodedBytes: ByteArray = Base64.decode( - base64Str.substring(base64Str.indexOf(",") + 1), - Base64.DEFAULT - ) - return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size) - } - - companion object { - fun convert(bitmap: Bitmap): String? { - val outputStream = ByteArrayOutputStream() - bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) - return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT) - } - } -} \ 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/ProgressUtil.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ProgressUtil.kt index c97d876..e84b869 100644 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ProgressUtil.kt +++ b/app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ProgressUtil.kt @@ -22,22 +22,14 @@ object ProgressUtil{ fun showLoading(ctx: Context){ - // instantiating the lateInit objects hideLoading() dialogBuilder= AlertDialog.Builder(ctx) pDialog= ProgressBar(ctx) - - // setting up the dialog dialogBuilder.setCancelable(false) dialogBuilder.setView(pDialog) alertDialog=dialogBuilder.create() - - // magic of transparent background goes here alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE) - // setting the alertDialog's BackgroundDrawable as the color resource of any color with 1% opacity alertDialog.window?.setBackgroundDrawable(ColorDrawable(Color.parseColor("#00141414"))) - - // finally displaying the Alertdialog containing the ProgressBar alertDialog.show() } 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/MyObservable.kt b/app/src/main/java/com/nivesh/production/partnerOnBoarding/viewModels/MyObservable.kt deleted file mode 100644 index 562e7ce..0000000 --- a/app/src/main/java/com/nivesh/production/partnerOnBoarding/viewModels/MyObservable.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.nivesh.production.partnerOnBoarding.viewModels - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel - -open class MyObservable : ViewModel() -{ - val data = MutableLiveData() - fun data(item: String) { - data.value = item - } -} 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..e69c7f4 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,32 +1,154 @@ 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.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 getStepsCountMutableData: MutableLiveData> = MutableLiveData() -// fun getStepsCount( -// requestBody: FDStepsCountRequest, -// token: String, -// activity: Activity -// ) = viewModelScope.launch(handleError(activity)) { -// if (Common.isNetworkAvailable(activity)) { -// getStepsCountMutableData.postValue(Resource.Loading()) -// val response = mainRepository.getStepsCountResponse(requestBody, token) -// getStepsCountMutableData.postValue(handleResponse(response)) -// } -// } -// -// val getClientDetailsMutableData: MutableLiveData> = MutableLiveData() -// fun getClientDetails(getClientDetailsRequest: getClientDetailsRequest, token: String, activity: Activity) = -// viewModelScope.launch(handleError(activity)) { -// if (Common.isNetworkAvailable(activity)) { -// getClientDetailsMutableData.postValue(Resource.Loading()) -// val response = -// mainRepository.getClientDetailsResponse(getClientDetailsRequest, token) -// getClientDetailsMutableData.postValue(handleResponse(response)) -// } -// } + val getPartnerCreationMutableData: MutableLiveData?> = MutableLiveData() + fun getPartnerCreateData( + requestBody: PartnerRequest, + token: String, + activity: Activity + ) = viewModelScope.launch(handleError(activity)) { + if (Common.isNetworkAvailable(activity)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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)) { + 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..9e386d5 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,28 @@ 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) + success + Aadhaar + \ 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..5538b84 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,27 @@ 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) + success + Aadhaar
\ 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 @@