Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 90.15 KB | None | 0 0
  1. package com.appypie.snappy.appsheet.pagedata.view.fragments.newentry.view.adapter
  2.  
  3. import android.annotation.SuppressLint
  4. import android.app.DatePickerDialog
  5. import android.app.TimePickerDialog
  6. import android.content.Context
  7. import android.graphics.BitmapFactory
  8. import android.os.Bundle
  9. import android.os.Handler
  10. import android.os.Looper
  11. import android.text.Editable
  12. import android.text.TextWatcher
  13. import android.util.SparseArray
  14. import android.view.View
  15. import android.view.ViewGroup
  16. import android.widget.EditText
  17. import android.widget.TextView
  18. import android.widget.TimePicker
  19. import androidx.recyclerview.widget.LinearLayoutManager
  20. import androidx.recyclerview.widget.RecyclerView
  21. import com.appypie.snappy.AppypieApplication
  22. import com.appypie.snappy.R
  23. import com.appypie.snappy.appsheet.AppConstant
  24. import com.appypie.snappy.appsheet.AppsheetUtils
  25. import com.appypie.snappy.appsheet.asformula.ASFormulaUtil
  26. import com.appypie.snappy.appsheet.asformula.ASFormulaUtil.fieldsList
  27. import com.appypie.snappy.appsheet.extensions.*
  28. import com.appypie.snappy.appsheet.pagedata.listeners.ItemClickListener
  29. import com.appypie.snappy.appsheet.pagedata.listeners.SelectedItemListener
  30. import com.appypie.snappy.appsheet.pagedata.model.FieldItem
  31. import com.appypie.snappy.appsheet.pagedata.model.appsheet.Column
  32. import com.appypie.snappy.appsheet.pagedata.model.ascompletedata.ASIntentData
  33. import com.appypie.snappy.appsheet.pagedata.model.ascompletedata.TableInfo
  34. import com.appypie.snappy.appsheet.pagedata.view.fragments.newentry.view.MainThreadExecutor
  35. import com.appypie.snappy.appsheet.pagedata.view.fragments.newentry.view.afterTextChangeEvents
  36. import com.appypie.snappy.appsheet.utility.InfoUtils
  37. import com.appypie.snappy.databinding.*
  38. import com.appypie.snappy.radioStream.AudioPlayerActivity.index
  39. import com.appypie.snappy.utils.Utils
  40. import com.bumptech.glide.Glide
  41. import com.google.android.gms.maps.model.LatLng
  42. import com.google.android.material.textfield.TextInputLayout
  43. import java.text.ParseException
  44. import java.text.SimpleDateFormat
  45. import java.util.*
  46. import java.util.concurrent.TimeUnit
  47. import kotlin.collections.ArrayList
  48. import kotlin.collections.HashMap
  49.  
  50. /*
  51. this is used to show common page list view
  52. */
  53. class NewAddSheetAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
  54.  
  55. val timeUnit: TimeUnit = TimeUnit.MILLISECONDS
  56. val timeout: Long = 300
  57. var formulaColumns: SparseArray<FieldItem> = SparseArray()
  58. lateinit var context: Context
  59. private var fieldsList: ArrayList<FieldItem> = ArrayList()
  60. private var sheetData: List<String>? = null
  61. private var isValidateNotify: Boolean = false
  62. var keyColumnType: String? = null
  63. private var itemClickListener: ItemClickListener<Any>? = null
  64. var selectableItemStateMap: HashMap<Int, ArrayList<Boolean>> = HashMap()
  65. private val asIntentData: ASIntentData by lazy {
  66. AppypieApplication.getApplicationInstance().asIntentData
  67. }
  68. private var tableInfo: TableInfo? = null
  69. private var isEditMode: Boolean = false
  70.  
  71. init {
  72. setHasStableIds(true)
  73. }
  74.  
  75. constructor(context: Context,
  76. tableId: String?,
  77. sheetData: List<String>?,
  78. itemClickListener: ItemClickListener<Any>) : this() {
  79. this.context = context
  80. this.sheetData = sheetData
  81. this.isValidateNotify = false
  82. this.itemClickListener = itemClickListener
  83. this.tableInfo = asIntentData.ascolumndata?.filterIndexed { index, tableInfo ->
  84. tableInfo.tableId?.equals(tableId) ?: false
  85. }?.getOrNull(0)
  86.  
  87. formulaColumns = SparseArray()
  88. for (index in 1 until (tableInfo?.tableData?.size ?: 0)) {
  89. val fieldItem = createField(tableInfo?.tableData?.getOrNull(index), "", index - 1)
  90. sheetData?.let {
  91. fieldItem.fieldValue = it.getOrNull(index - 1)
  92. }
  93. if (sheetData == null && validateIsFormulaField(fieldItem)) {
  94. formulaColumns.put(index, fieldItem)
  95. }
  96. if(!fieldItem.isHideField){
  97. fieldsList.add(fieldItem)
  98. }
  99. }
  100.  
  101. if (sheetData != null && sheetData.size > 0) {
  102. this.isEditMode = true
  103. }
  104. }
  105.  
  106. override fun getItemCount(): Int {
  107. return this.fieldsList.size
  108. }
  109.  
  110. override fun getItemId(position: Int): Long = position.toLong()
  111.  
  112. fun validationNotifyData(isValidateNotify: Boolean) {
  113. this.isValidateNotify = isValidateNotify
  114. notifyDataSetChanged()
  115. }
  116.  
  117. fun getNewAddSheetListData(): ArrayList<FieldItem> {
  118. return this.fieldsList
  119. }
  120.  
  121. override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
  122. when (getItemViewType(position)) {
  123. AppConstant.FIELD_EDIT_TEXT -> {
  124. val editTextFieldViewHolder = holder as EditTextFieldViewHolder
  125. editTextFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  126. }
  127. AppConstant.FIELD_EDIT_TEXT_FILE -> {
  128. val fileFieldViewHolder = holder as FileFieldViewHolder
  129. fileFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  130. }
  131. AppConstant.FIELD_EDIT_TEXT_IMAGE -> {
  132. val imageFieldViewHolder = holder as ImageFieldViewHolder
  133. imageFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  134. }
  135. AppConstant.FIELD_EDIT_TEXT_SIGNATURE -> {
  136. val signatureFieldViewHolder = holder as SignatureFieldViewHolder
  137. signatureFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  138.  
  139. }
  140. AppConstant.FIELD_EDIT_TEXT_EMAIL -> {
  141. val emailFieldViewHolder = holder as EmailFieldViewHolder
  142. emailFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  143. }
  144. AppConstant.FIELD_EDIT_TEXT_REFERENCE -> {
  145. val refFieldViewHolder = holder as RefFieldViewHolder
  146. refFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  147. }
  148. AppConstant.FIELD_EDIT_TEXT_ADDRESS -> {
  149. val addressFieldViewHolder = holder as AddressFieldViewHolder
  150. addressFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  151. }
  152. AppConstant.FIELD_EDIT_TEXT_LATLONG -> {
  153. val latLongFieldViewHolder = holder as LatLongFieldViewHolder
  154. latLongFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  155. }
  156. AppConstant.FIELD_EDIT_TEXT_COLOR -> {
  157. val colorFieldViewHolder = holder as ColorFieldViewHolder
  158. colorFieldViewHolder.binding.fieldItem = fieldsList.get(position)
  159. colorFieldViewHolder.binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  160. colorFieldViewHolder.binding.colorList.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
  161. if (isValidateNotify) else {
  162. colorFieldViewHolder.binding.colorList.adapter = ColorArrayAdapter(
  163. context,
  164. fieldsList.get(position).list,
  165. fieldsList.getOrNull(position)?.fieldValue ?: "",
  166. object : ItemClickListener<String?> {
  167. override fun onItemUtilityClick(clrPosition: Int, type: String, data: String?) {
  168. fieldsList.get(clrPosition).fieldValue = data
  169. }
  170.  
  171. override fun onItemClick(position: Int, type: String, data: String?) {
  172. }
  173. }, position)
  174. }
  175. //set error msg
  176. setLabelErrorValidation(colorFieldViewHolder.binding.label, fieldsList.getOrNull(position)?.errorMsg
  177. ?: "", position, isValidateNotify, "#000000")
  178.  
  179. }
  180. AppConstant.FIELD_EDIT_TEXT_ENUM -> {
  181. val enumFieldViewHolder = holder as EnumFieldViewHolder
  182. enumFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  183. }
  184. AppConstant.FIELD_EDIT_TEXT_ENUMLIST -> {
  185. val enumListFieldViewHolder = holder as EnumListFieldViewHolder
  186. enumListFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  187. }
  188. AppConstant.FIELD_EDIT_TEXT_LONGTEXT -> {
  189. val longTextFieldViewHolder = holder as LongTextFieldViewHolder
  190. longTextFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  191. }
  192. AppConstant.FIELD_EDIT_TEXT_PERCENT -> {
  193. val percentFieldViewHolder = holder as PercentFieldViewHolder
  194. percentFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  195.  
  196. }
  197. AppConstant.FIELD_EDIT_TEXT_PRICE -> {
  198. val priceFieldViewHolder = holder as PriceFieldViewHolder
  199. priceFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  200. }
  201. AppConstant.FIELD_EDIT_TEXT_YES_NO -> {
  202. val yesNoFieldViewHolder = holder as YesNoFieldViewHolder
  203. yesNoFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  204. }
  205. AppConstant.FIELD_EDIT_TEXT_VIDEO -> {
  206. val videoFieldViewHolder = holder as VideoFieldViewHolder
  207. videoFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  208. }
  209. AppConstant.FIELD_EDIT_TEXT_DECIMAL -> {
  210. val decimalFieldViewHolder = holder as DecimalFieldViewHolder
  211. decimalFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  212. }
  213. AppConstant.FIELD_EDIT_TEXT_URL -> {
  214. val urlFieldViewHolder = holder as UrlFieldViewHolder
  215. urlFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  216. }
  217. AppConstant.FIELD_EDIT_TEXT_PHONE -> {
  218. val phoneEditTextFieldViewHolder = holder as PhoneEditTextFieldViewHolder
  219. phoneEditTextFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  220.  
  221. }
  222. AppConstant.FIELD_EDIT_TEXT_DRAWING -> {
  223. val editTextFieldViewHolder = holder as EditTextFieldViewHolder
  224. editTextFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  225.  
  226. }
  227. AppConstant.FIELD_EDIT_TEXT_DURATION -> {
  228. val durationFieldViewHolder = holder as DurationFieldViewHolder
  229. durationFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  230. }
  231. AppConstant.FIELD_EDIT_TEXT_TIME -> {
  232. val timeFieldViewHolder = holder as TimeFieldViewHolder
  233. timeFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  234. }
  235. AppConstant.FIELD_EDIT_TEXT_DATETIME -> {
  236. val dateTimeFieldViewHolder = holder as DateTimeFieldViewHolder
  237. dateTimeFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  238.  
  239. }
  240. AppConstant.FIELD_EDIT_TEXT_DATE -> {
  241. val dateFieldViewHolder = holder as DateFieldViewHolder
  242. dateFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  243. }
  244. AppConstant.FIELD_EDIT_TEXT_NUMBER -> {
  245. val numberFieldViewHolder = holder as NumberFieldViewHolder
  246. numberFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  247. }
  248. AppConstant.FIELD_EDIT_TEXT_NAME -> {
  249. val nameFieldViewHolder = holder as NameFieldViewHolder
  250. nameFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  251. }
  252. AppConstant.FIELD_EDIT_TEXT_PROGRESS -> {
  253. val progressFieldViewHolder = holder as ProgressFieldViewHolder
  254. progressFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  255. }
  256. AppConstant.FIELD_EDIT_TEXT_CHANGE_LOCATION -> {
  257. val changeLocationFieldViewHolder = holder as ChangeLocationFieldViewHolder
  258. changeLocationFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  259. }
  260. AppConstant.FIELD_EDIT_TEXT_CHANGE_TIMESTAMP -> {
  261. val changeTimestampFieldViewHolder = holder as ChangeTimestampFieldViewHolder
  262. changeTimestampFieldViewHolder.bindData(fieldsList.getOrNull(position), position)
  263. }
  264. }
  265. }
  266.  
  267. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
  268. return when (viewType) {
  269. AppConstant.FIELD_EDIT_TEXT_NAME -> {
  270. val binding: NameItemBinding = parent.inflateBinding(R.layout.name_item)
  271. NameFieldViewHolder(binding)
  272. }
  273. AppConstant.FIELD_EDIT_TEXT_EMAIL -> {
  274. val binding: EmailItemBinding = parent.inflateBinding(R.layout.email_item)
  275. EmailFieldViewHolder(binding)
  276. }
  277. AppConstant.FIELD_EDIT_TEXT_NUMBER -> {
  278. val binding: NumberItemBinding = parent.inflateBinding(R.layout.number_item)
  279. NumberFieldViewHolder(binding)
  280. }
  281. AppConstant.FIELD_EDIT_TEXT_DATE -> {
  282. val binding: DateItemBinding = parent.inflateBinding(R.layout.date_item)
  283. DateFieldViewHolder(binding)
  284. }
  285. AppConstant.FIELD_EDIT_TEXT_TIME -> {
  286. val binding: TimeItemBinding = parent.inflateBinding(R.layout.time_item)
  287. TimeFieldViewHolder(binding)
  288. }
  289. AppConstant.FIELD_EDIT_TEXT_IMAGE -> {
  290. val binding: AddImageNewItemBinding = parent.inflateBinding(R.layout.add_image_new_item)
  291. ImageFieldViewHolder(binding)
  292. }
  293. AppConstant.FIELD_EDIT_TEXT_FILE -> {
  294. val binding: FileItemBinding = parent.inflateBinding(R.layout.file_item)
  295. FileFieldViewHolder(binding)
  296. }
  297. AppConstant.FIELD_EDIT_TEXT_ADDRESS -> {
  298. val binding: AddressNewItemBinding = parent.inflateBinding(R.layout.address_new_item)
  299. AddressFieldViewHolder(binding)
  300. }
  301. AppConstant.FIELD_EDIT_TEXT_SIGNATURE -> {
  302. val binding: SignatureImageNewItemBinding = parent.inflateBinding(R.layout.signature_image_new_item)
  303. SignatureFieldViewHolder(binding)
  304. }
  305. AppConstant.FIELD_EDIT_TEXT_PERCENT -> {
  306. val binding: PercentItemBinding = parent.inflateBinding(R.layout.percent_item)
  307. PercentFieldViewHolder(binding)
  308. }
  309.  
  310. AppConstant.FIELD_EDIT_TEXT_PROGRESS -> {
  311. val binding: ProgressItemBinding = parent.inflateBinding(R.layout.progress_item)
  312. ProgressFieldViewHolder(binding)
  313. }
  314. AppConstant.FIELD_EDIT_TEXT_COLOR -> {
  315. val binding: ColorRecyclerItemBinding = parent.inflateBinding(R.layout.color_recycler_item)
  316. ColorFieldViewHolder(binding)
  317. }
  318. AppConstant.FIELD_EDIT_TEXT_LATLONG -> {
  319. val binding: LatlongItemBinding = parent.inflateBinding(R.layout.latlong_item)
  320. LatLongFieldViewHolder(binding)
  321. }
  322. AppConstant.FIELD_EDIT_TEXT_LONGTEXT -> {
  323. val binding: LongTextItemBinding = parent.inflateBinding(R.layout.long_text_item)
  324. LongTextFieldViewHolder(binding)
  325. }
  326. AppConstant.FIELD_EDIT_TEXT_DURATION -> {
  327. val binding: DurationItemBinding = parent.inflateBinding(R.layout.duration_item)
  328. DurationFieldViewHolder(binding)
  329. }
  330. AppConstant.FIELD_EDIT_TEXT_PHONE -> {
  331. val binding: PhoneEditItemBinding = parent.inflateBinding(R.layout.phone_edit_item)
  332. PhoneEditTextFieldViewHolder(binding)
  333. }
  334. AppConstant.FIELD_EDIT_TEXT_YES_NO -> {
  335. val binding: YesNoItemBinding = parent.inflateBinding(R.layout.yes_no_item)
  336. YesNoFieldViewHolder(binding)
  337. }
  338. AppConstant.FIELD_EDIT_TEXT_ENUM -> {
  339. val binding: EnumItemBinding = parent.inflateBinding(R.layout.enum_item)
  340. EnumFieldViewHolder(binding)
  341. }
  342. AppConstant.FIELD_EDIT_TEXT_ENUMLIST -> {
  343. val binding: EnumListItemBinding = parent.inflateBinding(R.layout.enum_list_item)
  344. EnumListFieldViewHolder(binding)
  345. }
  346. AppConstant.FIELD_EDIT_TEXT_VIDEO -> {
  347. val binding: VideoItemBinding = parent.inflateBinding(R.layout.video_item)
  348. VideoFieldViewHolder(binding)
  349. }
  350. AppConstant.FIELD_EDIT_TEXT_DECIMAL -> {
  351. val binding: DecimalItemBinding = parent.inflateBinding(R.layout.decimal_item)
  352. DecimalFieldViewHolder(binding)
  353. }
  354. AppConstant.FIELD_EDIT_TEXT_URL -> {
  355. val binding: UrlItemBinding = parent.inflateBinding(R.layout.url_item)
  356. UrlFieldViewHolder(binding)
  357. }
  358. AppConstant.FIELD_EDIT_TEXT_CHANGE_LOCATION -> {
  359. val binding: ChangeLocationItemBinding = parent.inflateBinding(R.layout.change_location_item)
  360. ChangeLocationFieldViewHolder(binding)
  361. }
  362. AppConstant.FIELD_EDIT_TEXT_CHANGE_TIMESTAMP -> {
  363. val binding: ChangeTimestampItemBinding = parent.inflateBinding(R.layout.change_timestamp_item)
  364. ChangeTimestampFieldViewHolder(binding)
  365. }
  366. AppConstant.FIELD_EDIT_TEXT_DATETIME -> {
  367. val binding: DateTimeItemBinding = parent.inflateBinding(R.layout.date_time_item)
  368. DateTimeFieldViewHolder(binding)
  369. }
  370. AppConstant.FIELD_EDIT_TEXT_PRICE -> {
  371. val binding: PriceItemBinding = parent.inflateBinding(R.layout.price_item)
  372. PriceFieldViewHolder(binding)
  373. }
  374. AppConstant.FIELD_EDIT_TEXT_REFERENCE -> {
  375. val binding: EnumItemBinding = parent.inflateBinding(R.layout.enum_item)
  376. RefFieldViewHolder(binding)
  377. }
  378. else -> {
  379. val binding: AddNewItemBinding = parent.inflateBinding(R.layout.add_new_item)
  380. EditTextFieldViewHolder(binding)
  381. }
  382.  
  383. }
  384. }
  385.  
  386. //apply formula after any change
  387. fun validateIsFormulaField(fieldItem: FieldItem?): Boolean {
  388. val formulaNotApplicable = arrayOf("ref", "enum", "enumlist", "color")
  389. val type = fieldItem?.fieldType ?: ""
  390. val formula = fieldItem?.fieldFormula ?: ""
  391. if (formula.isNotEmpty() && !formulaNotApplicable.any { it == type }) {
  392. return true
  393. }
  394. return false
  395. }
  396.  
  397. //apply formula after any change
  398. fun observeChangesForFormula(callTypePosition: String?) {
  399. fieldsList.forEachIndexed { index, fieldItem ->
  400. val formulaNotApplicable = arrayOf("ref", "enum", "enumlist", "color")
  401. val type = fieldItem.fieldType ?: ""
  402. val formula = fieldItem.fieldFormula ?: ""
  403. if (formula.isNotEmpty() && !formulaNotApplicable.any { it == type }) {
  404. val taskExcuter = Runnable {
  405. val formulaResult = ASFormulaUtil.manageFormulaStack(context, formula, fieldsList)
  406. fieldsList.get(index).fieldValue = formulaResult
  407. notifyItemChanged(index)
  408. }
  409. MainThreadExecutor().execute(taskExcuter)
  410. }
  411. }
  412.  
  413. }
  414.  
  415. fun applyFormula() {
  416. for (index in 0 until formulaColumns.size()) {
  417. val formula = formulaColumns.valueAt(index)?.fieldFormula ?: ""
  418. val taskExcuter = Runnable {
  419. val formulaResult = ASFormulaUtil.manageFormulaStack(context, formula, fieldsList)
  420. if (fieldsList.size > formulaColumns.keyAt(index)) {
  421. fieldsList.get(formulaColumns.keyAt(index)).fieldValue = formulaResult
  422. notifyItemChanged(formulaColumns.keyAt(index))
  423. }
  424.  
  425. }
  426. MainThreadExecutor().execute(taskExcuter)
  427. }
  428.  
  429. }
  430.  
  431.  
  432. inner class PriceFieldViewHolder(var binding: PriceItemBinding) : RecyclerView.ViewHolder(binding.root) {
  433. fun bindData(fieldItem: FieldItem?, position: Int) {
  434. fieldItem?.let {
  435. binding.nameInput.afterTextChangeEvents()
  436. .debounce(timeout, timeUnit)
  437. .subscribe { qryTxt ->
  438. if (fieldsList.size > position) {
  439. fieldsList.getOrNull(position)?.fieldValue = qryTxt?.text?.toString()
  440. observeChangesForFormula("")
  441. }
  442. }
  443. binding.fieldItem = fieldsList.getOrNull(position)
  444. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  445. binding.languageSetting = asIntentData.asData?.languageSetting
  446. //enable and disable field
  447. setIsEnableField(binding.nameInput, it)
  448. //set error msg
  449. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  450. ?: "", position, isValidateNotify)
  451. }
  452. }
  453.  
  454. }
  455.  
  456. inner class PercentFieldViewHolder(var binding: PercentItemBinding) : RecyclerView.ViewHolder(binding.root) {
  457. fun bindData(fieldItem: FieldItem?, position: Int) {
  458. fieldItem?.let {
  459. binding.fieldItem = fieldsList.getOrNull(position)
  460. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  461. binding.languageSetting = asIntentData.asData?.languageSetting
  462. binding.nameInput.afterTextChangeEvents()
  463. .debounce(timeout, timeUnit)
  464. .subscribe { qryTxt ->
  465. if (fieldsList.size > position) {
  466. fieldsList.getOrNull(position)?.fieldValue = qryTxt?.text?.toString()
  467. observeChangesForFormula("")
  468. }
  469. }
  470. //enable and disable field
  471. setIsEnableField(binding.nameInput, it)
  472. //set error msg
  473. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  474. ?: "", position, isValidateNotify)
  475. }
  476. }
  477. }
  478.  
  479. inner class EditTextFieldViewHolder(var binding: AddNewItemBinding) : RecyclerView.ViewHolder(binding.root) {
  480. fun bindData(fieldItem: FieldItem?, position: Int) {
  481. fieldItem.let {
  482. binding.fieldItem = fieldItem
  483. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  484. var timer = Timer()
  485. binding.nameInput.onChange {qryTxt->
  486. timer.cancel()
  487. timer = Timer()
  488. timer.schedule(
  489. object:TimerTask() {
  490. override fun run() {
  491. if (fieldsList.size > position && fieldsList.getOrNull(position)?.fieldValue != qryTxt) {
  492. fieldsList.getOrNull(position)?.fieldValue = qryTxt
  493. observeChangesForFormula("")
  494. }
  495. }
  496. },
  497. timeout
  498. )
  499.  
  500. }
  501. /* binding.nameInput.afterTextChangeEvents()
  502. .debounce(timeout, timeUnit)
  503. .subscribe { qryTxt ->
  504. if (fieldsList.size > position && fieldsList.getOrNull(position)?.fieldValue != qryTxt?.text?.toString()) {
  505. fieldsList.getOrNull(position)?.fieldValue = qryTxt?.text?.toString()
  506. observeChangesForFormula("")
  507. }
  508. }*/
  509.  
  510. binding.nameInput.onFocusChangeListener = object:View.OnFocusChangeListener{
  511. override fun onFocusChange(v: View?, hasFocus: Boolean) {
  512.  
  513. }
  514.  
  515. }
  516.  
  517.  
  518. //enable and disable field
  519. setIsEnableField(binding.nameInput, fieldItem)
  520. //set error msg
  521. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  522. ?: "", position, isValidateNotify)
  523. }
  524. }
  525. }
  526. inner class DecimalFieldViewHolder(var binding: DecimalItemBinding) : RecyclerView.ViewHolder(binding.root) {
  527. fun bindData(fieldItem: FieldItem?, position: Int) {
  528. fieldItem?.let {
  529. binding.nameInput.afterTextChangeEvents()
  530. .debounce(timeout, timeUnit)
  531. .subscribe { qryTxt ->
  532. if (fieldsList.size > position && fieldsList.getOrNull(position)?.fieldValue != qryTxt?.text?.toString()) {
  533. fieldsList.getOrNull(position)?.fieldValue = qryTxt?.text?.toString()
  534. observeChangesForFormula("")
  535. }
  536. }
  537. binding.fieldItem = fieldItem
  538. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  539. handleInputFields(binding.nameInput,position)
  540. //enable and disable field
  541. setIsEnableField(binding.nameInput, fieldItem)
  542. //set error msg
  543. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  544. ?: "", position, isValidateNotify)
  545. }
  546. }
  547. }
  548. inner class NumberFieldViewHolder(var binding: NumberItemBinding) : RecyclerView.ViewHolder(binding.root) {
  549. fun bindData(fieldItem: FieldItem?, position: Int) {
  550. fieldItem?.let {
  551. var timer = Timer()
  552. binding.nameInput.onChange {qryTxt->
  553. timer.cancel()
  554. timer = Timer()
  555. timer.schedule(
  556. object:TimerTask() {
  557. override fun run() {
  558. if (fieldsList.size > position && fieldsList.getOrNull(position)?.fieldValue != qryTxt) {
  559. fieldsList.getOrNull(position)?.fieldValue = qryTxt
  560. observeChangesForFormula("")
  561. }
  562. }
  563. },
  564. timeout
  565. )
  566.  
  567. }
  568.  
  569. binding.fieldItem = fieldsList.getOrNull(position)
  570. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  571. //enable and disable field
  572. setIsEnableField(binding.nameInput, fieldItem)
  573. //set error msg
  574. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  575. ?: "", position, isValidateNotify)
  576. }
  577. }
  578. }
  579. inner class PhoneEditTextFieldViewHolder(var binding: PhoneEditItemBinding) : RecyclerView.ViewHolder(binding.root) {
  580. fun bindData(fieldItem: FieldItem?, position: Int) {
  581. fieldItem?.let {
  582. binding.fieldItem = fieldItem
  583. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  584. //enable and disable field
  585. setIsEnableField(binding.nameInput, fieldItem)
  586. //set error msg
  587. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  588. ?: "", position, isValidateNotify)
  589. }
  590. }
  591.  
  592. }
  593.  
  594.  
  595. inner class UrlFieldViewHolder(var binding: UrlItemBinding) : RecyclerView.ViewHolder(binding.root) {
  596.  
  597. fun bindData(fieldItem: FieldItem?, position: Int) {
  598. fieldItem?.let {
  599. binding.nameInput.afterTextChangeEvents()
  600. .debounce(timeout, timeUnit)
  601. .subscribe{ qryTxt ->
  602. if (fieldsList.size > position && !(fieldsList.getOrNull(position)?.fieldValue.equals(qryTxt?.text?.toString()))) {
  603. fieldsList.getOrNull(position)?.fieldValue = qryTxt?.text?.toString()
  604. observeChangesForFormula("")
  605. }
  606. }
  607.  
  608. binding.fieldItem = fieldsList.getOrNull(adapterPosition)
  609. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  610. //enable and disable field
  611. setIsEnableField(binding.nameInput, it)
  612. //set error msg
  613. setErrorValidation(binding.name, fieldsList.getOrNull(adapterPosition)?.errorMsg
  614. ?: "", adapterPosition, isValidateNotify)
  615. binding.executePendingBindings()
  616. } ?: kotlin.run {
  617. binding.unbind()
  618. }
  619. }
  620.  
  621. }
  622. inner class LongTextFieldViewHolder(var binding: LongTextItemBinding) : RecyclerView.ViewHolder(binding.root) {
  623. fun bindData(fieldItem: FieldItem?, position: Int) {
  624. var timer = Timer()
  625. binding.nameInput.onChange {qryTxt->
  626. timer.cancel()
  627. timer = Timer()
  628. timer.schedule(
  629. object:TimerTask() {
  630. override fun run() {
  631. if (fieldsList.size > position && fieldsList.getOrNull(position)?.fieldValue != qryTxt) {
  632. fieldsList.getOrNull(position)?.fieldValue = qryTxt
  633. observeChangesForFormula("")
  634. }
  635. }
  636. },
  637. timeout
  638. )
  639.  
  640. }
  641. binding.fieldItem = fieldsList.getOrNull(position)
  642. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  643.  
  644. //enable and disable field
  645. setIsEnableField(binding.nameInput, fieldItem)
  646.  
  647. //set error msg
  648. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  649. ?: "", position, isValidateNotify)
  650. }
  651.  
  652.  
  653. }
  654. inner class DurationFieldViewHolder(var binding: DurationItemBinding) : RecyclerView.ViewHolder(binding.root) {
  655. fun bindData(fieldItem: FieldItem?, position: Int) {
  656. fieldItem?.let {
  657. binding.fieldItem = fieldItem
  658. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  659. binding.nameInput.clickWithDebounce {
  660. val hour = Calendar.getInstance().getTime().hours
  661. val minute = Calendar.getInstance().getTime().minutes
  662. val mTimePicker: TimePickerDialog
  663. mTimePicker =
  664. TimePickerDialog(context, object : TimePickerDialog.OnTimeSetListener {
  665. override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {
  666. fieldsList.getOrNull(position)?.fieldValue = "${hourOfDay}:${minute}:00"
  667. notifyItemChanged(position)
  668. observeChangesForFormula("")
  669. }
  670.  
  671. }, hour, minute, true)
  672. mTimePicker.setTitle(
  673. "Select ${fieldsList.getOrNull(position)?.fieldLebal
  674. ?: "Duration"}"
  675. )
  676. mTimePicker.show()
  677. }
  678.  
  679. //enable and disable field
  680. setIsEnableField(binding.nameInput, it)
  681.  
  682. //set error msg
  683. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  684. ?: "", adapterPosition, isValidateNotify)
  685. binding.executePendingBindings()
  686. } ?: kotlin.run {
  687. binding.unbind()
  688. }
  689. }
  690.  
  691. }
  692. inner class DateTimeFieldViewHolder(var binding: DateTimeItemBinding) : RecyclerView.ViewHolder(binding.root) {
  693. fun bindData(fieldItem: FieldItem?, position: Int) {
  694. fieldItem?.let {
  695. binding.fieldItem = fieldItem
  696. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  697.  
  698. binding.nameInput.clickWithDebounce {
  699. val calendar = Calendar.getInstance()
  700. val mYear = calendar.get(Calendar.YEAR)
  701. val mMonth = calendar.get(Calendar.MONTH)
  702. val mDay = calendar.get(Calendar.DAY_OF_MONTH)
  703. val hour = calendar.get(Calendar.HOUR_OF_DAY)
  704. val minute = calendar.get(Calendar.MINUTE)
  705.  
  706. val datePickerDialog = DatePickerDialog(context,
  707. DatePickerDialog.OnDateSetListener { datepicker, year, month, day ->
  708. var month = month
  709. month++
  710. val finalMonth = month
  711. val timePickerDialog = TimePickerDialog(context,
  712. TimePickerDialog.OnTimeSetListener { view, hourOfDay, minute1 ->
  713. val dateTime =
  714. StringBuilder().append(day).append("-").append(finalMonth)
  715. .append("-").append(year).append(" ").append(hourOfDay)
  716. .append(":").append(minute1).append(":00").toString()
  717. try {
  718. val date_time = SimpleDateFormat(asIntentData?.asData?.languageSetting?.datetime_formate).format(
  719. SimpleDateFormat(
  720. "d-M-yyyy H:m:ss",
  721. Locale.ENGLISH
  722. ).parse(dateTime)
  723. )
  724. if (fieldsList.size > position && !(fieldsList.getOrNull(position)?.fieldValue.equals(date_time))) {
  725. fieldsList.getOrNull(position)?.fieldValue = date_time
  726. notifyItemChanged(position)
  727. observeChangesForFormula("")
  728. }
  729. } catch (e: ParseException) {
  730. e.printStackTrace()
  731. }
  732. }, hour, minute, true
  733. )
  734. timePickerDialog.show()
  735. }, mYear, mMonth, mDay
  736. )
  737. datePickerDialog.show()
  738. }
  739. //enable and disable field
  740. setIsEnableField(binding.nameInput, it)
  741. //set error msg
  742. setErrorValidation(binding.name, fieldsList.getOrNull(adapterPosition)?.errorMsg
  743. ?: "", adapterPosition, isValidateNotify)
  744. binding.executePendingBindings()
  745. } ?: kotlin.run {
  746. binding.unbind()
  747. }
  748. }
  749. }
  750. inner class VideoFieldViewHolder(var binding: VideoItemBinding) : RecyclerView.ViewHolder(binding.root) {
  751. @SuppressLint("CheckResult")
  752. fun bindData(fieldItem: FieldItem?, position: Int) {
  753. binding.nameInput.afterTextChangeEvents()
  754. .debounce(timeout, timeUnit)
  755. .subscribe{ qryTxt ->
  756. if (fieldsList.size > position && fieldsList.getOrNull(position)?.fieldValue != qryTxt?.text?.toString()) {
  757. fieldsList.getOrNull(position)?.fieldValue = qryTxt?.text?.toString()
  758. observeChangesForFormula("")
  759. }
  760. }
  761. binding.fieldItem = fieldsList.getOrNull(adapterPosition)
  762. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  763. //enable and disable field
  764. setIsEnableField(binding.nameInput, fieldItem)
  765. //set error msg
  766. setErrorValidation(binding.name, fieldsList.getOrNull(adapterPosition)?.errorMsg
  767. ?: "", adapterPosition, isValidateNotify)
  768. }
  769. }
  770. inner class NameFieldViewHolder(var binding: NameItemBinding) : RecyclerView.ViewHolder(binding.root) {
  771. @SuppressLint("CheckResult")
  772. fun bindData(fieldItem: FieldItem?, position: Int) {
  773. binding.nameInput.afterTextChangeEvents()
  774. .debounce(timeout, timeUnit)
  775. .subscribe{ qryTxt ->
  776. if (fieldsList.size > position && fieldsList.getOrNull(position)?.fieldValue != qryTxt?.text?.toString()) {
  777. fieldsList.getOrNull(position)?.fieldValue = qryTxt?.text?.toString()
  778. observeChangesForFormula("")
  779. }
  780. }
  781. binding.fieldItem = fieldItem
  782. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  783.  
  784. //enable and disable field
  785. setIsEnableField(binding.nameInput, fieldItem)
  786. //set error msg
  787. setErrorValidation(binding.name, fieldsList.getOrNull(adapterPosition)?.errorMsg
  788. ?: "", adapterPosition, isValidateNotify)
  789. }
  790. }
  791. inner class EmailFieldViewHolder(var binding: EmailItemBinding) : RecyclerView.ViewHolder(binding.root) {
  792. @SuppressLint("CheckResult")
  793. fun bindData(fieldItem: FieldItem?, position: Int) {
  794. binding.nameInput.afterTextChangeEvents()
  795. .debounce(timeout, timeUnit)
  796. .subscribe{ qryTxt ->
  797. if (fieldsList.size > position && fieldsList.getOrNull(position)?.fieldValue != qryTxt?.text?.toString()) {
  798. fieldsList.getOrNull(position)?.fieldValue = qryTxt?.text?.toString()
  799. observeChangesForFormula("")
  800. }
  801. }
  802.  
  803. binding.fieldItem = fieldsList.getOrNull(adapterPosition)
  804. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  805.  
  806. //enable and disable field
  807. setIsEnableField(binding.nameInput, fieldItem)
  808. //set error msg
  809. setErrorValidation(binding.name, fieldsList.getOrNull(adapterPosition)?.errorMsg
  810. ?: "", adapterPosition, isValidateNotify)
  811. }
  812. }
  813. inner class DateFieldViewHolder(var binding: DateItemBinding) : RecyclerView.ViewHolder(binding.root) {
  814. fun bindData(fieldItem: FieldItem?, position: Int) {
  815. binding.fieldItem = fieldItem
  816. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  817. binding.nameInput.clickWithDebounce {
  818. val calender = Calendar.getInstance()
  819. DatePickerDialog(
  820. context,
  821. DatePickerDialog.OnDateSetListener { view, year, monthOfYear, dayOfMonth ->
  822. val date_time = SimpleDateFormat(asIntentData?.asData?.languageSetting?.date_formate).format(
  823. SimpleDateFormat(
  824. "yyyy:MM:dd",
  825. Locale.ENGLISH
  826. ).parse("${year}:${monthOfYear}:${dayOfMonth}")
  827. ) ?: ""
  828.  
  829. if (fieldsList.size > position && !(fieldsList.getOrNull(position)?.fieldValue.equals(date_time))) {
  830. fieldsList.getOrNull(position)?.fieldValue = date_time
  831. notifyItemChanged(position)
  832. observeChangesForFormula("")
  833. }
  834. },
  835. calender.get(Calendar.YEAR),
  836. calender.get(Calendar.MONTH),
  837. calender.get(Calendar.DAY_OF_MONTH)
  838. ).show()
  839. }
  840.  
  841. //enable and disable field
  842. setIsEnableField(binding.nameInput, fieldItem)
  843. //set error msg
  844. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  845. ?: "", position, isValidateNotify)
  846. }
  847. }
  848. inner class TimeFieldViewHolder(var binding: TimeItemBinding) : RecyclerView.ViewHolder(binding.root) {
  849. fun bindData(fieldItem: FieldItem?, position: Int) {
  850. fieldItem?.let {
  851. binding.fieldItem = fieldItem
  852. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  853. binding.nameInput.clickWithDebounce {
  854. val calender = Calendar.getInstance()
  855. val hour = calender.getTime().hours
  856. val minute = calender.getTime().minutes
  857. val mTimePicker =
  858. TimePickerDialog(context, object : TimePickerDialog.OnTimeSetListener {
  859. override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {
  860. val selectedTime = "${hourOfDay}:${minute}"
  861. if (fieldsList.size > position && !(fieldsList.getOrNull(position)?.fieldValue.equals(selectedTime))) {
  862. fieldsList.getOrNull(position)?.fieldValue = selectedTime
  863. notifyItemChanged(position)
  864. observeChangesForFormula("")
  865. }
  866. }
  867.  
  868. }, hour, minute, android.text.format.DateFormat.is24HourFormat(context))
  869. mTimePicker.setTitle("Select Time")
  870. mTimePicker.show()
  871. }
  872.  
  873.  
  874. //enable and disable field
  875. setIsEnableField(binding.nameInput, it)
  876. //set error msg
  877. setErrorValidation(binding.name, fieldsList.getOrNull(adapterPosition)?.errorMsg
  878. ?: "", adapterPosition, isValidateNotify)
  879. binding.executePendingBindings()
  880. } ?: kotlin.run {
  881. binding.unbind()
  882. }
  883. }
  884.  
  885. }
  886. inner class ImageFieldViewHolder(var binding: AddImageNewItemBinding) : RecyclerView.ViewHolder(binding.root) {
  887. fun bindData(fieldItem: FieldItem?, position: Int) {
  888. fieldItem?.let {
  889. binding.fieldItem = it
  890. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  891. binding.languageSetting = asIntentData.asData?.languageSetting
  892. if (sheetData != null && !fieldsList.getOrNull(position)?.fieldValue.isNullOrBlank()) {
  893. val fileUrl = fieldsList.getOrNull(position)?.fieldValue
  894. // set profile image and name
  895. Glide.with(context)
  896. .load(fileUrl)
  897. .placeholder(R.drawable.no_image)
  898. .into(binding.captureImage)
  899. AppsheetUtils.setDrawableViewOut(binding.captureImage, "#B3B0AE", "${android.R.color.transparent}", 5, 10.0f, true)
  900. binding.captureImageView.visibility = View.VISIBLE
  901. binding.clickCaptureImage.visibility = View.GONE
  902. binding.delete.clickWithDebounce {
  903. fieldsList[position].fieldValue = ""
  904. notifyItemChanged(position)
  905. }
  906. } else if (!fieldsList[position].fieldValue.isNullOrBlank()) {
  907. val bitmap = BitmapFactory.decodeFile(fieldsList[position].fieldValue)
  908. binding.captureImage.setImageBitmap(bitmap)
  909. AppsheetUtils.setDrawableViewOut(binding.captureImage, "#B3B0AE", "${android.R.color.transparent}", 5, 10.0f, true)
  910. binding.captureImageView.visibility = View.VISIBLE
  911. binding.clickCaptureImage.visibility = View.GONE
  912. binding.delete.clickWithDebounce {
  913. fieldsList[position].fieldValue = ""
  914. notifyItemChanged(position)
  915. }
  916. } else {
  917. binding.captureImageView.visibility = View.GONE
  918. binding.clickCaptureImage.visibility = View.VISIBLE
  919. binding.clickCaptureImage.clickWithDebounce {
  920. if (itemClickListener != null) {
  921. itemClickListener!!.onItemClick(
  922. position,
  923. getItemViewType(position).toString(),
  924. binding.fieldItem
  925. )
  926. }
  927. }
  928. }
  929. //set error msg
  930. setLabelErrorValidation(binding.label, fieldsList.getOrNull(position)?.errorMsg
  931. ?: "", position, isValidateNotify, "#000000")
  932. //enable and disable field
  933. setIsEnableField(binding.mImageView, it)
  934. binding.executePendingBindings()
  935. } ?: kotlin.run {
  936. binding.unbind()
  937. }
  938. }
  939. }
  940. inner class FileFieldViewHolder(var binding: FileItemBinding) : RecyclerView.ViewHolder(binding.root) {
  941. fun bindData(fieldItem: FieldItem?, position: Int) {
  942. fieldItem?.let {
  943. var bundleData = Bundle()
  944. binding.fieldItem = it
  945. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  946. binding.languageSetting = asIntentData.asData?.languageSetting
  947. if (sheetData != null && fieldsList.getOrNull(position)?.fieldValue?.isNotEmpty() ?: false) {
  948. AppsheetUtils.setDrawableViewOut(binding.captureFile, asIntentData.asData?.styleAndNavigation?.fileDotCol
  949. ?: "#B3B0AE", "#ffffff", 5, 10.0f, true)
  950. binding.captureFileView.visibility = View.VISIBLE
  951. binding.clickCaptureFile.visibility = View.GONE
  952. binding.delete.clickWithDebounce {
  953. fieldsList[position].fieldValue = ""
  954. notifyItemChanged(position)
  955. }
  956. } else if (fieldsList[position].fieldValue?.isNotEmpty() ?: false) {
  957. AppsheetUtils.setDrawableViewOut(binding.captureFile, asIntentData.asData?.styleAndNavigation?.fileDotCol
  958. ?: "#B3B0AE", "#ffffff", 5, 10.0f, true)
  959. binding.captureFileView.visibility = View.VISIBLE
  960. binding.clickCaptureFile.visibility = View.GONE
  961. binding.delete.clickWithDebounce {
  962. fieldsList.getOrNull(position)?.fieldValue = ""
  963. notifyItemChanged(position)
  964. }
  965. } else {
  966. binding.captureFileView.visibility = View.GONE
  967. binding.clickCaptureFile.visibility = View.VISIBLE
  968. binding.clickCaptureFile.clickWithDebounce {
  969. if (itemClickListener != null) {
  970. itemClickListener?.onItemClick(
  971. position,
  972. getItemViewType(position).toString(),
  973. binding.fieldItem
  974. )
  975. }
  976. }
  977. }
  978. //set error msg
  979. setLabelErrorValidation(binding.label, fieldsList.getOrNull(position)?.errorMsg
  980. ?: "", adapterPosition, isValidateNotify, "#000000")
  981. //enable and disable field
  982. setIsEnableField(binding.mFileView, it)
  983.  
  984. binding.executePendingBindings()
  985. } ?: kotlin.run {
  986. binding.unbind()
  987. }
  988. }
  989. }
  990. inner class SignatureFieldViewHolder(var binding: SignatureImageNewItemBinding) : RecyclerView.ViewHolder(binding.root) {
  991. fun bindData(fieldItem: FieldItem?, position: Int) {
  992. fieldItem?.let {
  993. var bundleData = Bundle()
  994. binding.fieldItem = it
  995. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  996. binding.languageSetting = asIntentData.asData?.languageSetting
  997. if (sheetData != null && fieldsList.getOrNull(position)?.fieldValue?.isNotEmpty() == true) {
  998. val fileUrl = fieldsList.getOrNull(position)?.fieldValue
  999. // set profile image and name
  1000. Glide.with(context)
  1001. .load(fileUrl)
  1002. .placeholder(R.drawable.no_image)
  1003. .into(binding.signatureImage)
  1004. AppsheetUtils.setDrawableViewOut(binding.signatureImage, asIntentData.asData?.styleAndNavigation?.fileDotCol
  1005. ?: "#B3B0AE", null, 5, 10.0f, true)
  1006. binding.captureSignatureView.visibility = View.VISIBLE
  1007. binding.clickCaptureSignature.visibility = View.GONE
  1008. binding.delete.clickWithDebounce {
  1009. fieldsList.getOrNull(position)?.fieldValue = ""
  1010. notifyItemChanged(position)
  1011. }
  1012. } else if (fieldsList.getOrNull(position)?.fieldValue?.isNotEmpty() == true) {
  1013. val bitmap = BitmapFactory.decodeFile(fieldsList[position].fieldValue)
  1014. binding.signatureImage.setImageBitmap(bitmap)
  1015. binding.captureSignatureView.visibility = View.VISIBLE
  1016. binding.clickCaptureSignature.visibility = View.GONE
  1017. binding.delete.clickWithDebounce {
  1018. fieldsList.getOrNull(position)?.fieldValue = ""
  1019. notifyItemChanged(position)
  1020. }
  1021. } else {
  1022. binding.captureSignatureView.visibility = View.GONE
  1023. binding.clickCaptureSignature.visibility = View.VISIBLE
  1024. binding.clickCaptureSignature.clickWithDebounce {
  1025. if (itemClickListener != null) {
  1026. itemClickListener?.onItemClick(
  1027. position,
  1028. getItemViewType(position).toString(),
  1029. binding.fieldItem
  1030. )
  1031. }
  1032. }
  1033. }
  1034. //set error msg
  1035. setLabelErrorValidation(binding.label, fieldsList.getOrNull(position)?.errorMsg
  1036. ?: "", position, isValidateNotify, "#000000")
  1037. binding.executePendingBindings()
  1038. } ?: kotlin.run {
  1039. binding.unbind()
  1040. }
  1041. }
  1042. }
  1043. inner class AddressFieldViewHolder(var binding: AddressNewItemBinding) : RecyclerView.ViewHolder(binding.root) {
  1044. fun bindData(fieldItem: FieldItem?, position: Int) {
  1045. fieldItem?.let {
  1046. binding.fieldItem = fieldsList.getOrNull(position)
  1047. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  1048. binding.nameInput.clickWithDebounce {
  1049. itemClickListener?.let {
  1050. it.onItemClick(
  1051. position,
  1052. getItemViewType(position).toString(),
  1053. fieldsList.getOrNull(position)?.latLng
  1054. )
  1055. }
  1056. observeChangesForFormula("onChange")
  1057. }
  1058.  
  1059. //set error msg
  1060. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  1061. ?: "", position, isValidateNotify)
  1062. //enable and disable field
  1063. setIsEnableField(binding.nameInput, it)
  1064. binding.executePendingBindings()
  1065. } ?: kotlin.run {
  1066. binding.unbind()
  1067. }
  1068. }
  1069. }
  1070. inner class LatLongFieldViewHolder(var binding: LatlongItemBinding) : RecyclerView.ViewHolder(binding.root) {
  1071. fun bindData(fieldItem: FieldItem?, position: Int) {
  1072. fieldItem?.let {
  1073. binding.fieldItem = fieldsList.getOrNull(position)
  1074. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  1075. val latLngValue = "${fieldsList.getOrNull(position)?.latLng?.latitude
  1076. ?: "0.0"} , ${fieldsList.getOrNull(position)?.latLng?.longitude ?: "0.0"}"
  1077. fieldsList.getOrNull(position)?.fieldValue = latLngValue
  1078. binding.latlongName.setText(latLngValue)
  1079. binding.latlongName.clickWithDebounce {
  1080. itemClickListener?.let {
  1081. it.onItemClick(
  1082. position,
  1083. getItemViewType(position).toString(),
  1084. fieldsList.getOrNull(position)?.latLng
  1085. )
  1086. }
  1087. }
  1088. //set error msg
  1089. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  1090. ?: "", position, isValidateNotify)
  1091. //enable and disable field
  1092. setIsEnableField(binding.latlongName, it)
  1093. binding.executePendingBindings()
  1094. } ?: kotlin.run {
  1095. binding.unbind()
  1096. }
  1097. }
  1098. }
  1099. inner class ProgressFieldViewHolder(var binding: ProgressItemBinding) : RecyclerView.ViewHolder(binding.root) {
  1100. fun bindData(fieldItem: FieldItem?, position: Int) {
  1101. fieldItem?.let {
  1102. binding.fieldItem = fieldsList.getOrNull(position)
  1103. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  1104. val arrayList: ArrayList<String> = fieldsList[adapterPosition].list!!
  1105. var itemStateList: ArrayList<Boolean> = ArrayList()
  1106. if (selectableItemStateMap[adapterPosition] != null) {
  1107. itemStateList = selectableItemStateMap[adapterPosition] ?: ArrayList()
  1108. } else {
  1109. if (!fieldsList.getOrNull(adapterPosition)?.fieldValue.isNullOrEmpty()) {
  1110. val data = fieldsList.getOrNull(adapterPosition)?.fieldValue ?: ""
  1111. for (index in arrayList.indices) {
  1112. val posData = fieldsList.getOrNull(adapterPosition)?.list?.getOrNull(index)
  1113. if (data.equals(posData, true)) {
  1114. itemStateList.add(true)
  1115. } else {
  1116. itemStateList.add(false)
  1117. }
  1118. }
  1119. } else {
  1120. for (i in arrayList.indices) {
  1121. itemStateList.add(false)
  1122. }
  1123. }
  1124. }
  1125. binding.progressInput.clickWithDebounce {
  1126. context.showListDialog(
  1127. fieldsList.getOrNull(adapterPosition)?.fieldLebal ?: "Progress",
  1128. "radio",
  1129. object : ItemClickListener<Any> {
  1130. override fun onItemClick(position: Int, type: String, data: Any?) {
  1131.  
  1132. }
  1133.  
  1134. override fun onItemUtilityClick(
  1135. position: Int,
  1136. type: String,
  1137. data: Any?
  1138. ) {
  1139. selectableItemStateMap.put(
  1140. position,
  1141. data as ArrayList<Boolean>
  1142. )
  1143. if (selectableItemStateMap[position] != null) {
  1144. for (index in selectableItemStateMap[position]!!.indices) {
  1145. if (selectableItemStateMap[position]!![index]) {
  1146. fieldsList.getOrNull(position)?.fieldValue = arrayList[index]
  1147. notifyItemChanged(position)
  1148. observeChangesForFormula(null)
  1149. }
  1150. }
  1151. }
  1152. if (selectableItemStateMap.get(position) != null) {
  1153. loopBrk@ for (index in 0 until (selectableItemStateMap.get(position)?.size?:0)){
  1154. if( selectableItemStateMap.get(position)?.getOrNull(index) ?: false){
  1155. if (fieldsList.size > position && !(fieldsList.getOrNull(position)?.fieldValue.equals(arrayList.get(index)))) {
  1156. fieldsList.getOrNull(position)?.fieldValue = arrayList.get(index)
  1157. notifyItemChanged(position)
  1158. observeChangesForFormula("onChange")
  1159. break@loopBrk
  1160. }
  1161.  
  1162. }
  1163. }
  1164. }
  1165.  
  1166. }
  1167.  
  1168. },
  1169. fieldsList.getOrNull(adapterPosition)?.list ?: ArrayList(),
  1170. itemStateList,
  1171. adapterPosition
  1172. )
  1173. }
  1174.  
  1175. //set error msg
  1176. setErrorValidation(binding.name, fieldsList.getOrNull(adapterPosition)?.errorMsg
  1177. ?: "", adapterPosition, isValidateNotify)
  1178. //enable and disable field
  1179. setIsEnableField(binding.progressInput, it)
  1180. binding.executePendingBindings()
  1181. } ?: kotlin.run {
  1182. binding.unbind()
  1183. }
  1184. }
  1185. }
  1186. inner class EnumFieldViewHolder(var binding: EnumItemBinding) : RecyclerView.ViewHolder(binding.root) {
  1187. fun bindData(fieldItem: FieldItem?, pos: Int) {
  1188. fieldItem?.let {
  1189. binding.fieldItem = fieldsList.getOrNull(pos)
  1190. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  1191. val arrayList: ArrayList<String> = fieldsList.getOrNull(pos)?.list ?: ArrayList()
  1192. var itemStateList: ArrayList<Boolean> = ArrayList()
  1193. if (selectableItemStateMap.get(pos) != null) {
  1194. itemStateList = selectableItemStateMap.get(pos) ?: ArrayList()
  1195. } else {
  1196. if (!fieldsList.getOrNull(adapterPosition)?.fieldValue.isNullOrEmpty()) {
  1197. val data = fieldsList.getOrNull(adapterPosition)?.fieldValue ?: ""
  1198. for (index in arrayList.indices) {
  1199. val posData = fieldsList.getOrNull(adapterPosition)?.list?.getOrNull(index)
  1200. if (data.equals(posData, true)) {
  1201. itemStateList.add(true)
  1202. } else {
  1203. itemStateList.add(false)
  1204. }
  1205. }
  1206. } else {
  1207. for (i in arrayList.indices) {
  1208. itemStateList.add(false)
  1209. }
  1210. }
  1211.  
  1212. }
  1213. binding.nameInput.clickWithDebounce {
  1214. context.showListDialog(
  1215. fieldsList.getOrNull(pos)?.fieldLebal ?: "Enum",
  1216. "radio",
  1217. object : ItemClickListener<Any> {
  1218. override fun onItemClick(position: Int, type: String, data: Any?) {
  1219.  
  1220. }
  1221.  
  1222. override fun onItemUtilityClick(
  1223. position: Int,
  1224. type: String,
  1225. data: Any?
  1226. ) {
  1227. selectableItemStateMap.put(
  1228. position,
  1229. data as ArrayList<Boolean>
  1230. )
  1231. if (selectableItemStateMap.get(position) != null) {
  1232. loopBrk@ for (index in 0 until (selectableItemStateMap.get(position)?.size?:0)){
  1233. if( selectableItemStateMap.get(position)?.getOrNull(index) ?: false){
  1234. if (fieldsList.size > position && !(fieldsList.getOrNull(position)?.fieldValue.equals(arrayList.get(index)))) {
  1235. fieldsList.getOrNull(position)?.fieldValue = arrayList.get(index)
  1236. notifyItemChanged(position)
  1237. observeChangesForFormula("onChange")
  1238. break@loopBrk
  1239. }
  1240.  
  1241. }
  1242. }
  1243. }
  1244. }
  1245.  
  1246. },
  1247. fieldsList.getOrNull(adapterPosition)?.list ?: ArrayList(),
  1248. itemStateList,
  1249. adapterPosition
  1250. )
  1251. }
  1252. //set error msg
  1253. setErrorValidation(binding.name, fieldsList.getOrNull(adapterPosition)?.errorMsg
  1254. ?: "", adapterPosition, isValidateNotify)
  1255. //enable and disable field
  1256. setIsEnableField(binding.nameInput, it)
  1257. binding.executePendingBindings()
  1258. } ?: kotlin.run {
  1259. binding.unbind()
  1260. }
  1261. }
  1262. }
  1263. inner class ColorFieldViewHolder(var binding: ColorRecyclerItemBinding) : RecyclerView.ViewHolder(binding.root) {
  1264. }
  1265.  
  1266. inner class YesNoFieldViewHolder(var binding: YesNoItemBinding) : RecyclerView.ViewHolder(binding.root) {
  1267. init {
  1268. setYesNoBtnColor(binding.yes, binding.no, "")
  1269. }
  1270.  
  1271.  
  1272. fun bindData(fieldItem: FieldItem?, position: Int) {
  1273. binding.no.clickWithDebounce {
  1274. setYesNoBtnColor(binding.yes, binding.no, "FALSE")
  1275. //set value
  1276. fieldsList.getOrNull(position)?.fieldValue = "FALSE"
  1277. observeChangesForFormula("onChange")
  1278. }
  1279.  
  1280. binding.yes.clickWithDebounce {
  1281. setYesNoBtnColor(binding.yes, binding.no, "TRUE")
  1282. //set value
  1283. fieldsList.getOrNull(position)?.fieldValue = "TRUE"
  1284. observeChangesForFormula("onChange")
  1285. }
  1286. binding.fieldItem = fieldItem
  1287. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  1288. binding.languageSetting = asIntentData.asData?.languageSetting
  1289. //set error msg
  1290. setLabelErrorValidation(binding.label, fieldsList.getOrNull(position)?.errorMsg
  1291. ?: "", position, isValidateNotify, "#000000")
  1292.  
  1293. if (fieldItem?.fieldFormula?.isNotEmpty() ?: false || fieldItem?.key ?: false) {
  1294. binding.yes.isEnabled = false
  1295. binding.yes.isFocusable = false
  1296. binding.no.isEnabled = false
  1297. binding.no.isFocusable = false
  1298. } else {
  1299. binding.yes.isEnabled = true
  1300. binding.yes.isFocusable = true
  1301. binding.no.isEnabled = true
  1302. binding.no.isFocusable = true
  1303. }
  1304.  
  1305. if (fieldItem?.fieldValue?.isNotEmpty() ?: false) {
  1306. setYesNoBtnColor(binding.yes, binding.no, fieldItem?.fieldValue ?: "")
  1307. }
  1308. }
  1309.  
  1310. }
  1311.  
  1312. inner class EnumListFieldViewHolder(var binding: EnumListItemBinding) : RecyclerView.ViewHolder(binding.root) {
  1313. fun bindData(fieldItem: FieldItem?, pos: Int) {
  1314. binding.fieldItem = fieldItem
  1315. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  1316. val arrayList: ArrayList<String> = fieldsList.getOrNull(pos)?.list ?: ArrayList()
  1317. var itemStateList: ArrayList<Boolean> = ArrayList()
  1318. if (selectableItemStateMap[pos] != null) {
  1319. itemStateList = selectableItemStateMap?.get(pos) ?: ArrayList()
  1320. } else {
  1321. if (!fieldsList.getOrNull(pos)?.fieldValue.isNullOrEmpty()) {
  1322. val data = fieldsList.getOrNull(pos)?.fieldValue?.split(",")
  1323. for (index in arrayList.indices) {
  1324. val posData = fieldsList[pos].list!![index]
  1325. if (data?.size ?: 0 > index && (data?.get(index)?.equals(posData, true)) ?: false) {
  1326. itemStateList.add(true)
  1327. } else {
  1328. itemStateList.add(false)
  1329. }
  1330. }
  1331. } else {
  1332. for (i in arrayList.indices) {
  1333. itemStateList.add(false)
  1334. }
  1335. }
  1336. }
  1337. binding.nameInput.clickWithDebounce {
  1338. context.showListDialog(
  1339. fieldsList.getOrNull(pos)?.fieldLebal ?: "Enum List",
  1340. "checkbox",
  1341. object : ItemClickListener<Any> {
  1342. override fun onItemClick(position: Int, type: String, data: Any?) {
  1343.  
  1344. }
  1345.  
  1346. override fun onItemUtilityClick(
  1347. position: Int,
  1348. type: String,
  1349. data: Any?
  1350. ) {
  1351. selectableItemStateMap.put(
  1352. position,
  1353. data as ArrayList<Boolean>
  1354. )
  1355. var selectedData:StringBuffer? = null
  1356. if (selectableItemStateMap.get(position) != null) {
  1357. selectedData = StringBuffer()
  1358. for (index in 0 until (selectableItemStateMap.get(position)?.size?:0)){
  1359. if( selectableItemStateMap.get(position)?.getOrNull(index) ?: false){
  1360. if (selectedData.isEmpty()) {
  1361. selectedData.append(arrayList[index])
  1362. } else {
  1363. selectedData.append("," + arrayList[index])
  1364. }
  1365. }
  1366. }
  1367. }
  1368. if (fieldsList.size > position && !(fieldsList.getOrNull(position)?.fieldValue.equals(selectedData?.toString()?:""))) {
  1369. fieldsList.getOrNull(position)?.fieldValue = selectedData.toString()
  1370. notifyItemChanged(position)
  1371. observeChangesForFormula("onChange")
  1372. }
  1373. }
  1374.  
  1375. },
  1376. fieldsList.getOrNull(pos)?.list ?: ArrayList(),
  1377. itemStateList,
  1378. pos
  1379. )
  1380. }
  1381.  
  1382. //set error msg
  1383. setErrorValidation(binding.name, fieldsList.getOrNull(pos)?.errorMsg
  1384. ?: "", pos, isValidateNotify)
  1385. }
  1386. }
  1387.  
  1388. inner class ChangeLocationFieldViewHolder(var binding: ChangeLocationItemBinding) : RecyclerView.ViewHolder(binding.root) {
  1389. fun bindData(fieldItem: FieldItem?, position: Int) {
  1390. fieldItem?.let {
  1391. binding.fieldItem = fieldsList.getOrNull(position)
  1392. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  1393. if (fieldsList.getOrNull(position)?.fieldValue.isNullOrBlank()) {
  1394. // Get the Layout Parameters for ListView Current Item View
  1395. val params = binding.addNewItem.getLayoutParams()
  1396. // Set the height of the Item View
  1397. params.height = 0
  1398. binding.addNewItem.setLayoutParams(params)
  1399. }
  1400.  
  1401. //set error msg
  1402. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  1403. ?: "", position, isValidateNotify)
  1404.  
  1405. //enable and disable field
  1406. binding.executePendingBindings()
  1407. } ?: kotlin.run {
  1408. binding.unbind()
  1409. }
  1410. }
  1411. }
  1412.  
  1413. inner class ChangeTimestampFieldViewHolder(var binding: ChangeTimestampItemBinding) : RecyclerView.ViewHolder(binding.root) {
  1414. fun bindData(fieldItem: FieldItem?, position: Int) {
  1415. fieldItem?.let {
  1416. binding.fieldItem = fieldsList.getOrNull(position)
  1417. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  1418.  
  1419. val date = Utils.simpleDateFormatUtil(asIntentData.asData?.languageSetting?.datetime_formate, null, Date())
  1420. fieldsList.getOrNull(position)?.fieldValue = date
  1421. binding.changeTimestamp.setText(date)
  1422. if (!(fieldsList.getOrNull(position)?.editable ?: false)) {
  1423. binding.changeTimestamp.isClickable = false
  1424. } else {
  1425. binding.changeTimestamp.isClickable = true
  1426. }
  1427. //set error msg
  1428. setErrorValidation(binding.name, fieldsList.getOrNull(position)?.errorMsg
  1429. ?: "", position, isValidateNotify)
  1430. //enable and disable field
  1431. binding.executePendingBindings()
  1432. } ?: kotlin.run {
  1433. binding.unbind()
  1434. }
  1435. }
  1436. }
  1437.  
  1438. inner class RefFieldViewHolder(var binding: EnumItemBinding) : RecyclerView.ViewHolder(binding.root) {
  1439. fun bindData(fieldItem: FieldItem?, position: Int) {
  1440. fieldItem?.let { it ->
  1441. var refTableId = ""
  1442. binding.fieldItem = it
  1443. binding.styleNavigation = asIntentData.asData?.styleAndNavigation
  1444. try {
  1445. refTableId = fieldItem.fieldFormula?.getStrBtTwoDelimilers("(", ")")?.trim()
  1446. ?: ""
  1447. val tableInfo = AppypieApplication.getApplicationInstance().asIntentData?.ascolumndata?.filterIndexed { index, tableInfo ->
  1448. tableInfo.tableId?.equals(refTableId) ?: false
  1449. }?.getOrNull(0)
  1450.  
  1451. /* val keyList = asIntentData.asKeyData?.get(tableInfo?.tableId)?.map {
  1452. it.getOrNull(tableInfo?.keyPosition?:1)?:""
  1453. }?:ArrayList()*/
  1454.  
  1455.  
  1456. var keyListResult = asIntentData.asKeyData?.get(tableInfo?.tableId)?.mapNotNull { item ->
  1457. (item.getOrNull(tableInfo?.keyPosition ?: 1)
  1458. ?: "").takeIf { it.toString().isNotEmpty() }
  1459. }
  1460.  
  1461. if (keyListResult?.size ?: 0 > 0) {
  1462. (keyListResult as ArrayList).removeAt(0)
  1463. fieldItem.list = keyListResult
  1464. }
  1465.  
  1466. } catch (ex: Exception) {
  1467. ex.printStackTrace()
  1468. }
  1469.  
  1470. binding.nameInput.clickWithDebounce {
  1471. val refData = fieldsList.getOrNull(position)?.list ?: ArrayList()
  1472. context.showRefListDialog(fieldsList.getOrNull(position)?.fieldLebal, object : SelectedItemListener {
  1473. override fun <T> onItemClick(position: Int, type: String, data: T?) {
  1474. if (type.equals(AppConstant.ADD_NEW_REF)) {
  1475. itemClickListener?.onItemUtilityClick(position, AppConstant.ADD_NEW_REF, refTableId)
  1476. } else {
  1477. fieldsList.getOrNull(position)?.fieldValue = data.toString()
  1478. binding.fieldItem = fieldsList?.get(position)
  1479. observeChangesForFormula("onChange")
  1480. }
  1481. }
  1482.  
  1483. }, refData, -1, position)
  1484. }
  1485.  
  1486. //set error msg
  1487. setErrorValidation(binding.name, fieldsList.get(position).errorMsg
  1488. ?: "", adapterPosition, isValidateNotify)
  1489. binding.executePendingBindings()
  1490. } ?: kotlin.run {
  1491. binding.unbind()
  1492. }
  1493. }
  1494. }
  1495.  
  1496.  
  1497. override fun getItemViewType(position: Int): Int {
  1498. return fieldsList[position].fieldTypeId
  1499. }
  1500.  
  1501. fun createField(column: Column?, errorMsg: String?, index: Int): FieldItem {
  1502. val fieldItem = FieldItem()
  1503. fieldItem.fieldType = column?.dataType
  1504. fieldItem.isHideField = column?.hidden ?: false
  1505. fieldItem.readOnly = column?.readOnly ?: false
  1506. fieldItem.fieldTitle = column?.title
  1507. fieldItem.fieldLebal = column?.displayName
  1508. fieldItem.fieldFormula = column?.formula
  1509. if (column?.key ?: false) {
  1510. fieldItem.key = true
  1511. keyColumnType = column?.dataType
  1512. }
  1513. if (column?.required ?: false) {
  1514. fieldItem.fieldLebal += "*"
  1515. fieldItem.mandatory = column?.required ?: false
  1516. }
  1517. when (column?.dataType) {
  1518. "name" -> {
  1519. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_NAME
  1520. fieldItem.errorMsg = errorMsg ?: "Please enter name."
  1521. }
  1522. "email" -> {
  1523. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_EMAIL
  1524. fieldItem.errorMsg = errorMsg ?: "Please enter valid email."
  1525. }
  1526. "number" -> {
  1527. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_NUMBER
  1528. fieldItem.errorMsg = errorMsg ?: "Please enter number."
  1529. }
  1530. "date" -> {
  1531. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_DATE
  1532. fieldItem.errorMsg = errorMsg ?: "Please enter date."
  1533. }
  1534. "date_time" -> {
  1535. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_DATETIME
  1536. fieldItem.errorMsg = errorMsg ?: "Please enter date time."
  1537. }
  1538. "time" -> {
  1539. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_TIME
  1540. fieldItem.errorMsg = errorMsg ?: "Please enter time."
  1541. }
  1542. "decimal" -> {
  1543. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_DECIMAL
  1544. fieldItem.errorMsg = errorMsg ?: "Please enter valid decimal."
  1545. }
  1546. "url" -> {
  1547. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_URL
  1548. fieldItem.errorMsg = errorMsg ?: "Please enter valid url."
  1549. }
  1550. "phone" -> {
  1551. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_PHONE
  1552. fieldItem.errorMsg = errorMsg ?: "Please enter valid phone."
  1553. }
  1554. "duration" -> {
  1555. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_DURATION
  1556. fieldItem.errorMsg = errorMsg ?: "Please enter valid duration."
  1557. }
  1558. "ref" -> {
  1559. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_REFERENCE
  1560. fieldItem.errorMsg = errorMsg ?: "Please enter valid reference."
  1561.  
  1562. }
  1563. "file" -> {
  1564. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_FILE
  1565. }
  1566. "image" -> {
  1567. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_IMAGE
  1568. }
  1569. "signature" -> {
  1570. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_SIGNATURE
  1571. }
  1572. "address" -> {
  1573. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_ADDRESS
  1574. fieldItem.errorMsg = errorMsg ?: "Please enter valid address."
  1575. if (sheetData != null && sheetData?.size ?: 0 > 0 && sheetData?.size ?: 0 > index && !sheetData?.get(index).isNullOrEmpty()) {
  1576. fieldItem.fieldValue = sheetData?.get(index)
  1577. try {
  1578. var latLng = AppsheetUtils.getLatLongFromAddress(context, sheetData?.get(index))
  1579. fieldItem.latLng = latLng
  1580. } catch (ex: Exception) {
  1581. InfoUtils(context).logError(ex.message
  1582. ?: "", "NewAddSheetAdapter", "latnlong")
  1583. }
  1584. } else {
  1585. var latlong = AppsheetUtils.getGpsLocation(context)
  1586. if (latlong != null) {
  1587. var address = AppsheetUtils.getAddressFromLatLong(
  1588. context,
  1589. latlong.latitude,
  1590. latlong.longitude
  1591. )
  1592. fieldItem.fieldValue = address
  1593. fieldItem.latLng = latlong
  1594. }
  1595. }
  1596. }
  1597. "color" -> {
  1598. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_COLOR
  1599. val stringListData = column.formula?.split(",") ?: ArrayList()
  1600. fieldItem.list!!.addAll(stringListData)
  1601.  
  1602. }
  1603. "text" -> {
  1604. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT
  1605. fieldItem.errorMsg = errorMsg ?: "Please enter valid text."
  1606. }
  1607. "enum" -> {
  1608. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_ENUM
  1609. fieldItem.errorMsg = errorMsg ?: "Please select valid enum."
  1610.  
  1611. val stringListData = column.formula?.split(",") ?: ArrayList()
  1612. fieldItem.list!!.addAll(stringListData)
  1613. }
  1614. "enumlist" -> {
  1615. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_ENUMLIST
  1616. fieldItem.errorMsg = errorMsg ?: "Please select valid enum list."
  1617.  
  1618. val stringListData = column.formula?.split(",") ?: ArrayList()
  1619. fieldItem.list!!.addAll(stringListData)
  1620.  
  1621. }
  1622. "latnlong" -> {
  1623. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_LATLONG
  1624. fieldItem.errorMsg = errorMsg ?: "Please enter valid latlong."
  1625.  
  1626. if (sheetData != null && sheetData?.size ?: 0 > 0 && sheetData?.size ?: 0 > index && !sheetData?.get(index).isNullOrEmpty()) {
  1627. val latlong = sheetData?.getOrNull(index)?.split(",")
  1628. if (latlong?.size ?: 0 > 1) {
  1629. try {
  1630. fieldItem.latLng = LatLng((latlong?.get(0)
  1631. ?: "0.0").toDouble(), (latlong?.get(1) ?: "0.0").toDouble())
  1632. } catch (ex: Exception) {
  1633. InfoUtils(context).logError(ex.message
  1634. ?: "", "NewAddSheetAdapter", "latnlong")
  1635. }
  1636. }
  1637. } else if (sheetData != null && sheetData?.size ?: 0 > 0) {
  1638. try {
  1639. fieldItem.latLng = LatLng(("0.0").toDouble(), ("0.0").toDouble())
  1640. } catch (ex: Exception) {
  1641. InfoUtils(context).logError(ex.message
  1642. ?: "", "NewAddSheetAdapter", "latnlong")
  1643. }
  1644. } else {
  1645. val latlong = AppsheetUtils.getGpsLocation(context)
  1646. if (latlong != null) {
  1647. val address = AppsheetUtils.getAddressFromLatLong(
  1648. context,
  1649. latlong.latitude,
  1650. latlong.longitude
  1651. )
  1652. fieldItem.fieldValue = address
  1653. fieldItem.latLng = latlong
  1654. }
  1655. }
  1656. }
  1657. "longtext" -> {
  1658. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_LONGTEXT
  1659. fieldItem.errorMsg = errorMsg ?: "Please enter valid long text."
  1660. }
  1661. "percent" -> {
  1662. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_PERCENT
  1663. fieldItem.errorMsg = errorMsg ?: "Please enter valid percent value."
  1664. }
  1665. "price" -> {
  1666. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_PRICE
  1667. fieldItem.errorMsg = errorMsg ?: "Please enter valid percent value."
  1668. }
  1669. "progress" -> {
  1670. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_PROGRESS
  1671. fieldItem.errorMsg = errorMsg ?: "Please select valid progress."
  1672.  
  1673. val laguageData = asIntentData.asData?.languageSetting
  1674. fieldItem.list?.add(laguageData?.to_start ?: "")
  1675. fieldItem.list?.add(laguageData?.partially_done ?: "")
  1676. fieldItem.list?.add(laguageData?.half_completed ?: "")
  1677. fieldItem.list?.add(laguageData?.almost_done ?: "")
  1678. fieldItem.list?.add(laguageData?.completed ?: "")
  1679. }
  1680. "video" -> {
  1681. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_VIDEO
  1682. fieldItem.errorMsg = errorMsg ?: "Please enter valid video link."
  1683. }
  1684. "yesno" -> {
  1685. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_YES_NO
  1686. }
  1687. "change_location" -> {
  1688. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_CHANGE_LOCATION
  1689. fieldItem.errorMsg = errorMsg ?: "Please enter valid change location"
  1690. if (sheetData != null && sheetData?.size ?: 0 > 0 && sheetData?.size ?: 0 > index) {
  1691. fieldItem.fieldValue = sheetData?.get(index) ?: ""
  1692. } else {
  1693. val latlong = AppsheetUtils.getGpsLocation(context)
  1694. if (latlong != null) {
  1695. val address = AppsheetUtils.getAddressFromLatLong(
  1696. context,
  1697. latlong.latitude,
  1698. latlong.longitude
  1699. )
  1700. fieldItem.fieldValue = address
  1701. fieldItem.latLng = latlong
  1702. }
  1703. }
  1704. }
  1705. "change_timestamp" -> {
  1706. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT_CHANGE_TIMESTAMP
  1707. fieldItem.errorMsg = errorMsg ?: "Please enter valid change timestamp"
  1708. }
  1709. else -> {
  1710. fieldItem.fieldTypeId = AppConstant.FIELD_EDIT_TEXT
  1711. fieldItem.errorMsg = errorMsg ?: "Please enter valid text"
  1712. }
  1713.  
  1714. }
  1715. return fieldItem
  1716. }
  1717.  
  1718. fun setErrorValidation(textInputLayout: TextInputLayout, errorMsg: String, position: Int, isValidateNotify: Boolean) {
  1719. textInputLayout.setError(errorMsg)
  1720. if (fieldsList.getOrNull(position)?.mandatory ?: false && fieldsList.getOrNull(position)?.fieldValue.isNullOrBlank() && isValidateNotify) {
  1721. textInputLayout.isErrorEnabled = true
  1722. } else {
  1723. textInputLayout.isErrorEnabled = false
  1724. }
  1725. }
  1726.  
  1727. fun setLabelErrorValidation(label: TextView, errorMsg: String, position: Int, isValidateNotify: Boolean, color: String) {
  1728. if (fieldsList.getOrNull(position)?.mandatory ?: false && fieldsList.getOrNull(position)?.fieldValue.isNullOrBlank() && isValidateNotify) {
  1729. label.setTextColor(context.resources.getColor(R.color.errorText))
  1730. } else {
  1731. label.setTextColor(AppsheetUtils.getColor(color))
  1732. }
  1733. }
  1734.  
  1735. fun setYesNoBtnColor(yesTxt: TextView, noTxt: TextView, type: String) {
  1736. val primarybgColor = asIntentData?.asData?.styleAndNavigation?.button?.get(2) ?: "#4891DB"
  1737. val primaryTxtColor = asIntentData?.asData?.styleAndNavigation?.button?.get(3) ?: "#FFFFFF"
  1738. val secbgColor = asIntentData?.asData?.styleAndNavigation?.secondaryButton?.get(2) ?: "#EEE"
  1739. val secTxtColor = asIntentData?.asData?.styleAndNavigation?.secondaryButton?.get(3)
  1740. ?: "#000000"
  1741. if (type.equals("TRUE", true)) {
  1742. yesTxt.setTextColor(
  1743. AppsheetUtils.getColor(
  1744. primaryTxtColor
  1745. )
  1746. )
  1747.  
  1748. AppsheetUtils.setDrawableViewOut(
  1749. yesTxt,
  1750. primarybgColor,
  1751. primarybgColor,
  1752. 1,
  1753. 5.0f
  1754. , false)
  1755.  
  1756. noTxt.setTextColor(
  1757. AppsheetUtils.getColor(
  1758. secTxtColor
  1759. )
  1760. )
  1761. AppsheetUtils.setDrawableViewOut(
  1762. noTxt,
  1763. secbgColor,
  1764. secbgColor,
  1765. 1,
  1766. 5.0f
  1767. , false)
  1768. } else if (type.equals("FALSE", true)) {
  1769. noTxt.setTextColor(
  1770. AppsheetUtils.getColor(
  1771. primaryTxtColor
  1772. )
  1773. )
  1774. AppsheetUtils.setDrawableViewOut(
  1775. noTxt,
  1776. primarybgColor,
  1777. primarybgColor,
  1778. 1,
  1779. 5.0f
  1780. , false)
  1781. yesTxt.setTextColor(
  1782. AppsheetUtils.getColor(
  1783. secTxtColor
  1784. )
  1785. )
  1786. AppsheetUtils.setDrawableViewOut(
  1787. yesTxt,
  1788. secbgColor,
  1789. secbgColor,
  1790. 1,
  1791. 5.0f
  1792. , false)
  1793. } else {
  1794. AppsheetUtils.setDrawableViewOut(noTxt, secbgColor, secbgColor, 1, 5.0f, false)
  1795. AppsheetUtils.setDrawableViewOut(yesTxt, secbgColor, secbgColor, 1, 5.0f, false)
  1796. }
  1797. }
  1798.  
  1799. //is use to enable and disable field
  1800. fun setIsEnableField(view: View, fieldItem: FieldItem?) {
  1801. var condition: Boolean = false
  1802. val formulaNotApplicable = arrayOf("ref", "enum", "enumlist", "color")
  1803. if (fieldItem?.fieldFormula?.isNotEmpty() ?: false && !formulaNotApplicable.any { it == fieldItem?.fieldType }) {
  1804. condition = true
  1805. }
  1806. if (fieldItem?.key ?: false && isEditMode) {
  1807. condition = true
  1808. }
  1809. if (fieldItem?.readOnly ?: false) {
  1810. condition = true
  1811. }
  1812.  
  1813. if (condition) {
  1814. view.isEnabled = false
  1815. view.isFocusable = false
  1816. view.isClickable = false
  1817. } else {
  1818. view.isEnabled = true
  1819. view.isFocusable = true
  1820. view.isClickable = true
  1821. }
  1822. }
  1823.  
  1824. fun handleInputFields(nameInput:EditText,pos: Int){
  1825. nameInput.addTextChangedListener(object : TextWatcher {
  1826. override fun afterTextChanged(s: Editable?) {}
  1827. override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
  1828. override fun onTextChanged(qryTxt: CharSequence?, start: Int, before: Int, count: Int) {
  1829. if (fieldsList.size > pos ) {
  1830. fieldsList.getOrNull(pos)?.fieldValue = qryTxt?.toString()?:""
  1831. observeChangesForFormula("onChange")
  1832. }
  1833. }
  1834.  
  1835. })
  1836. }
  1837.  
  1838. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement