3 Commits

Author SHA1 Message Date
  Hemant Khadase 630b233ac7 added modification in code 2 years ago
  Manoj 8dd2952201 POB API 2 years ago
  Manoj ad19100c2b gradle changes 2 years ago
78 changed files with 3214 additions and 761 deletions
Split View
  1. +2
    -1
      app/build.gradle
  2. +1
    -0
      app/src/main/AndroidManifest.xml
  3. +10
    -9
      app/src/main/java/com/nivesh/production/partnerOnBoarding/adapters/NewDistributorSignStepOneAdapter.kt
  4. +0
    -4
      app/src/main/java/com/nivesh/production/partnerOnBoarding/adapters/SectionsPagerAdapter1.kt
  5. +0
    -32
      app/src/main/java/com/nivesh/production/partnerOnBoarding/api/ApiCallback.kt
  6. +8
    -20
      app/src/main/java/com/nivesh/production/partnerOnBoarding/api/ApiClient.kt
  7. +9
    -60
      app/src/main/java/com/nivesh/production/partnerOnBoarding/db/PreferenceManager.kt
  8. +44
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/ApiInterface.kt
  9. +3
    -19
      app/src/main/java/com/nivesh/production/partnerOnBoarding/interfaces/IPreferenceHelper.kt
  10. +18
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Data.kt
  11. +19
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/DataX.kt
  12. +6
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Error.kt
  13. +6
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/Result.kt
  14. +6
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ResultX.kt
  15. +5
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/ResultXX.kt
  16. +24
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/PartnerRequest.kt
  17. +8
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SaveEAgreementRequest.kt
  18. +13
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/SendOTPRequest.kt
  19. +5
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/request/ValidatePartnerRequest.kt
  20. +10
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/Data.kt
  21. +6
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DataX.kt
  22. +7
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DocumentTypeResponse.kt
  23. +9
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/DocumentUploadResponse.kt
  24. +7
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/GetAMFIDetailResponse.kt
  25. +7
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/GetAllProductResponse.kt
  26. +9
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/PANResponse.kt
  27. +9
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/PartnerResponse.kt
  28. +8
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/Result.kt
  29. +7
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultX.kt
  30. +5
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultXX.kt
  31. +5
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ResultXXX.kt
  32. +7
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/SaveEAgreementResponse.kt
  33. +8
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/SendOTPResponse.kt
  34. +7
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ValidateOTPResponse.kt
  35. +9
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/model/response/ValidatePartnerResponse.kt
  36. +36
    -7
      app/src/main/java/com/nivesh/production/partnerOnBoarding/repositories/MainRepository.kt
  37. +17
    -21
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/RegisterActivity.kt
  38. +12
    -19
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/SignUpActivity.kt
  39. +2
    -3
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/ViewPagerActivity.kt
  40. +168
    -55
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/AlmostThereFragment.kt
  41. +608
    -183
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/GetStartedFragment.kt
  42. +63
    -12
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/NewDistributorSignStepOne.kt
  43. +80
    -19
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/OTPFragment.kt
  44. +37
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/QuestionsFragment.kt
  45. +361
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SaveEAgreementFragment.kt
  46. +105
    -16
      app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/fragments/SignUpFragment.kt
  47. +66
    -86
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Common.kt
  48. +8
    -4
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/Constants.kt
  49. +0
    -27
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ImageUtil.kt
  50. +0
    -35
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/MaskWatcher.kt
  51. +0
    -8
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/ProgressUtil.kt
  52. +79
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/IFormattedString.kt
  53. +60
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/Mask.kt
  54. +93
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskCharacter.kt
  55. +29
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskCharacterFabric.kt
  56. +50
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedEditText.kt
  57. +27
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedFormatter.kt
  58. +79
    -0
      app/src/main/java/com/nivesh/production/partnerOnBoarding/util/maskedEditText/MaskedWatcher.kt
  59. +0
    -12
      app/src/main/java/com/nivesh/production/partnerOnBoarding/viewModels/MyObservable.kt
  60. +145
    -23
      app/src/main/java/com/nivesh/production/partnerOnBoarding/viewModels/OnBoardingViewModel.kt
  61. +2
    -2
      app/src/main/res/drawable/google_icon.xml
  62. +11
    -0
      app/src/main/res/drawable/svg_back.xml
  63. +12
    -0
      app/src/main/res/drawable/svg_cal.xml
  64. +17
    -0
      app/src/main/res/drawable/svg_pan_verified.xml
  65. +11
    -0
      app/src/main/res/drawable/svg_phone.xml
  66. +2
    -1
      app/src/main/res/layout/activity_register.xml
  67. +290
    -0
      app/src/main/res/layout/agreement_otp.xml
  68. +65
    -67
      app/src/main/res/layout/fragment_almost_there.xml
  69. +214
    -11
      app/src/main/res/layout/fragment_get_started.xml
  70. +18
    -0
      app/src/main/res/layout/fragment_question.xml
  71. +32
    -0
      app/src/main/res/layout/fragment_save_e_agreement.xml
  72. +46
    -0
      app/src/main/res/layout/header_eaggrement.xml
  73. +26
    -2
      app/src/main/res/values-hi-rIN/strings.xml
  74. +2
    -0
      app/src/main/res/values-night/strings.xml
  75. +4
    -0
      app/src/main/res/values/attr_themes.xml
  76. +2
    -0
      app/src/main/res/values/colors.xml
  77. +27
    -2
      app/src/main/res/values/strings.xml
  78. +1
    -1
      app/src/main/res/values/themes.xml

+ 2
- 1
app/build.gradle View File

@ -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'


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

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


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

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


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

@ -7,12 +7,8 @@ import androidx.fragment.app.FragmentPagerAdapter
class SectionsPagerAdapter1(manager: FragmentManager, private val fragments: Array<Fragment>) : FragmentPagerAdapter(manager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
private val titles = ArrayList<String>()
override fun getItem(position: Int): Fragment = fragments[position]
override fun getCount(): Int = fragments.size
// override fun getPageTitle(position: Int): CharSequence = titles[position]
}

+ 0
- 32
app/src/main/java/com/nivesh/production/partnerOnBoarding/api/ApiCallback.kt View File

@ -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<T : Any> : Callback<Resource<T>> {
abstract fun onSuccess(response: Resource<T>)
abstract fun onFailure(response: Resource<T>)
override fun onResponse(call: Call<Resource<T>>, response: Response<Resource<T>>) {
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<T>()
// resp.status = false
// resp.message = response.message()
// onFailure(resp)
}
}
override fun onFailure(call: Call<Resource<T>>, t: Throwable) {
// val response = Resource<T>()
// response.status = false
// response.message = t.message.toString()
// onFailure(response)
}
}

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

@ -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<TrustManager> = trustManagerFactory.getTrustManagers()
val trustManagers: Array<TrustManager> = 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)
}
}
}
}

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

@ -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()


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

@ -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<String>
@POST("Partner/CreatePartner")
suspend fun postPartnerCreation(@Body partnerRequest: PartnerRequest): Response<JsonObject>
@POST("Partner/ValidatePartner")
suspend fun postPartnerValidate(@Body validatePartnerRequest: ValidatePartnerRequest): Response<JsonObject>
@POST("Partner/SendOTP")
suspend fun postOTP(@Body sendOTPRequest: SendOTPRequest): Response<JsonObject>
@POST("Partner/SendOTP")
suspend fun postSaveEagreementOTP(@Body sendOTPRequest: SendOTPRequest): Response<JsonObject>
@POST("Partner/VerifyOTP")
suspend fun postVerifyOTP(@Body requestBody: RequestBody): Response<JsonObject>
@POST("Partner/GetAMFIDetail")
suspend fun postAMFIDetail(@Body requestBody: RequestBody): Response<JsonObject>
@GET//"User/GetPANDetail"
suspend fun getPANDetail(@Url url: String,@Query("PAN") value: String): Response<JsonObject>
@GET//"User/GetDocumentType"
suspend fun getDocumentType(@Url url: String,@Query("Role") value: String, @Query("Type") type: String): Response<JsonObject>
@Multipart
@POST("Partner/DocumentsUpload")
suspend fun getUploadDocument(
@Part multiPartBody: List<MultipartBody.Part>,
@Part("PartnerCode") partnerCode: Int,
@Part("PartnerRole") partnerRole: Int,
@Part("DocumentId") documentId: Int
): Response<JsonObject>
@POST("Partner/SaveEAgreement")
suspend fun postSaveEAgreement(@Body requestBody: RequestBody): Response<JsonObject>
@GET
suspend fun getAllProduct(@Url url: String): Response<JsonObject>
}

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

@ -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
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -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<MultipartBody.Part>,pc: Int,pr: Int,di: Int) =
apiInterface.getUploadDocument(multipartBody,pc,pr,di)
suspend fun getSaveEAgreement(requestBody: RequestBody, token: String) =
apiInterface.postSaveEAgreement(requestBody)
suspend fun getAllProduct(url: String) =
apiInterface.getAllProduct(url)
}

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

@ -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 {


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

@ -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 {
}
}
}

+ 2
- 3
app/src/main/java/com/nivesh/production/partnerOnBoarding/ui/activities/ViewPagerActivity.kt View File

@ -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()
}


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

@ -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
}
}

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

@ -1,3 +1,5 @@
@file:Suppress("SENSELESS_COMPARISON")
package com.nivesh.production.partnerOnBoarding.ui.fragments
import android.Manifest
@ -11,32 +13,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<Uri>? = null
private var selectImageIntent: ActivityResultLauncher<String>? = null
private var bitmap: Bitmap? = null
private var isPanVerify: Boolean = false
private val mainPANUpload: Int = 1
private val mainPhotoUpload: Int = 2
private val firstDocUpload: Int = 3
private val 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<Data>
private var imageSelectedList = ArrayList<File>()
private var arnList = ArrayList<DataX>()
private lateinit var arnData: DataX
private lateinit var panRes: PANResponse
private val listArray = ArrayList<String>()
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<DataX>
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<MultipartBody.Part>()
imageSelectedList.forEachIndexed { index, element ->
if (index == 0) {
part.add(prepareImagePart(element, "front"))
} else {
part.add(prepareImagePart(element, "back"))
}
}
(activity as SignUpActivity).viewModelOne.getDocumentUpload(
part,
3,
5,
8,
(activity as SignUpActivity)
)
(activity as SignUpActivity).viewModelOne.getDocumentUploadMutableData.observe(
viewLifecycleOwner
) { response ->
Log.e("check_upload_res", response.toString())
val res: DocumentUploadResponse =
Gson().fromJson(
response?.data.toString(),
DocumentUploadResponse::class.java
)
if (res.Status == 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


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

@ -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<Int, String>? = 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()
}
}
}
}

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

@ -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>(InputFilter.LengthFilter(1))
binding.edtOTP2.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
binding.edtOTP3.filters = arrayOf<InputFilter>(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
) {
}
}
}

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

@ -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()
}
}
}

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

@ -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>(InputFilter.LengthFilter(1))
edtOTP2.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
edtOTP3.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
edtOTP4.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
edtOTP5.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
edtOTP6.filters = arrayOf<InputFilter>(InputFilter.LengthFilter(1))
edtOTP1.addTextChangedListener(
GenericTextWatcher(
edtOTP1,
edtOTP2
)
)
edtOTP2.addTextChangedListener(
GenericTextWatcher(
edtOTP2,
edtOTP3
)
)
edtOTP3.addTextChangedListener(
GenericTextWatcher(
edtOTP3,
edtOTP4
)
)
edtOTP4.addTextChangedListener(
GenericTextWatcher(
edtOTP4,
edtOTP5
)
)
edtOTP5.addTextChangedListener(
GenericTextWatcher(
edtOTP5,
edtOTP6
)
)
edtOTP6.addTextChangedListener(
GenericTextWatcher(
edtOTP6,
null
)
)
edtOTP1.setOnKeyListener(OTPFragment.GenericKeyEvent(edtOTP1, null))
edtOTP2.setOnKeyListener(
GenericKeyEvent(
edtOTP2,
edtOTP1
)
)
edtOTP3.setOnKeyListener(
GenericKeyEvent(
edtOTP3,
edtOTP2
)
)
edtOTP4.setOnKeyListener(
OTPFragment.GenericKeyEvent(
edtOTP4,
edtOTP3
)
)
edtOTP5.setOnKeyListener(
OTPFragment.GenericKeyEvent(
edtOTP5,
edtOTP4
)
)
edtOTP6.setOnKeyListener(
OTPFragment.GenericKeyEvent(
edtOTP6,
edtOTP5
)
)
txtDigit.text =
getString(R.string.sixDigitOTP) + " " + arguments?.getString("email").toString()
txtResendOTP.setOnClickListener{
if(dialog.isShowing) dialog.cancel()
}
btnSubmit.setOnClickListener {
if (edtOTP1.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
edtOTP1,
tlOTP1,
""
)
} else if (edtOTP2.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
edtOTP2,
tlOTP2,
""
)
} else if (edtOTP3.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
edtOTP3,
tlOTP3,
""
)
} else if (edtOTP4.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
edtOTP4,
tlOTP4,
""
)
} else if (edtOTP5.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
edtOTP5,
tlOTP5,
""
)
} else if (edtOTP6.text.toString().isEmpty()) { // EditText
Common.commonErrorMethod(
edtOTP6,
tlOTP6,
""
)
} else {
apiVerifyOTP(
edtOTP1.text.toString().plus(
edtOTP2.text.toString().plus(
edtOTP3.text.toString().plus(
edtOTP4.text.toString().plus(
edtOTP5.text.toString().plus(
edtOTP6.text.toString()))
)
)
)
)
}
}
if(!dialog.isShowing) dialog.show()
val window: Window = dialog.window!!
window.setLayout(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT)
}
private fun apiVerifyOTP(otp: String) {
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
) {
}
}
}

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

@ -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>(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
}
}
}

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

@ -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<NewsApplication>().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<JsonObject>): Resource<JsonObject> {
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<String>): Resource<String> {
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<String> = preSelectedDate.split("-").toTypedArray()
year = items1[0].toInt()
month = items1[1].toInt() - 1
day = items1[2].toInt()
} else {
year = cal.get(Calendar.YEAR)
month = cal.get(Calendar.MONTH)
day = cal.get(Calendar.DAY_OF_MONTH)
}
val datePickerDialog = DatePickerDialog(
activity as SignUpActivity, { _, years, monthOfYear, dayOfMonth ->
if (monthOfYear.toString().length == 1) {
"0".plus(monthOfYear)
}
preSelectedDate = years.toString().plus("-").plus(monthOfYear + 1).plus("-")
.plus(dayOfMonth.toString())
edtDOB.setText(preSelectedDate)
edtDOB.setSelection(edtDOB.text.toString().length)
}, year, month, day
)
datePickerDialog.datePicker.maxDate = cal.timeInMillis
val c = Calendar.getInstance()
c.add(Calendar.YEAR, -140)
datePickerDialog.datePicker.minDate = c.timeInMillis
datePickerDialog.show()
return preSelectedDate
}
fun getDateFromTimeMills(long: Long): String {
val sdf = SimpleDateFormat("yyyy-MM-dd", Locale.US)
val resultDate = Date(long)
return sdf.format((resultDate))
}
//valid email check
fun isValidPinCode(target: String): Boolean {
return target.length != 6
}
}
}

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

@ -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
}
}

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

@ -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)
}
}
}

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

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

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

@ -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()
}


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -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<String>()
fun data(item: String) {
data.value = item
}
}

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

@ -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<Resource<JsonObject>> = 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<Resource<JsonObject>> = 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<Resource<JsonObject>?> = 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<Resource<JsonObject>?> = 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<Resource<JsonObject>?> = MutableLiveData()
fun getSendOTP(
sendOTPRequest: SendOTPRequest,
token: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
val response = mainRepository.getSendOTPResponse(sendOTPRequest)
getSendOTPMutableData.postValue(handleResponse(response))
}
}
val getSendOTPSaveEAgreementMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getSaveEAgreementSendOTP(
sendOTPRequest: SendOTPRequest,
token: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
val response = mainRepository.getSendSaveEAgreementOTPResponse(sendOTPRequest)
getSendOTPSaveEAgreementMutableData.postValue(handleResponse(response))
}
}
val getVerifyOTPMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getVerifyOTP(
requestBody: RequestBody,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
val response = mainRepository.getVerifyOTP(requestBody)
getVerifyOTPMutableData.postValue(handleResponse(response))
}
}
val getAMFIDetailMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getAMFIDetail(
requestBody: RequestBody,
token: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
val response = mainRepository.getAMFIDetailResponse(requestBody)
getAMFIDetailMutableData.postValue(handleResponse(response))
}
}
val getPANDetailMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getPANDetail(
requestBody: String,
url: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
val response = mainRepository.getPANDetailResponse(url,requestBody)
getPANDetailMutableData.postValue(handleResponse(response))
}
}
val getDocumentTypeMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getDocumentType(
value: String,
type: String,
url: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
val response = mainRepository.getDocumentTypeResponse(url,value,type)
getDocumentTypeMutableData.postValue(handleResponse(response))
}
}
val getDocumentUploadMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getDocumentUpload(
multipartBody: List<MultipartBody.Part>,
pc: Int,
pr: Int,
di: Int,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
val response = mainRepository.getDocumentUploadResponse(multipartBody,pc,pr,di)
getDocumentUploadMutableData.postValue(handleResponse(response))
}
}
val getSaveEAgreementMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getSaveEAgreement(
requestBody: RequestBody,
token: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
val response = mainRepository.getSaveEAgreement(requestBody, token)
getSaveEAgreementMutableData.postValue(handleResponse(response))
}
}
val getAllProductMutableData: MutableLiveData<Resource<JsonObject>?> = MutableLiveData()
fun getAllProduct(
url: String,
activity: Activity
) = viewModelScope.launch(handleError(activity)) {
if (Common.isNetworkAvailable(activity)) {
val response = mainRepository.getAllProduct(url)
getAllProductMutableData.postValue(handleResponse(response))
}
}
}

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

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


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

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

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

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

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


Loading…
Cancel
Save

Powered by TurnKey Linux.