Registration - mayurparmar2/AlarmDemo GitHub Wiki

Registration xml

Registration.xml
<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:backgroundTint="@color/colorPrimaryDark"
    android:orientation="vertical"
    >
    <RelativeLayout
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <ImageView
            android:layout_alignParentStart="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_back"
            android:paddingHorizontal="@dimen/_10sdp"
            android:paddingVertical="@dimen/_10sdp"
            />

        <TextView
            android:id="@+id/heading"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="@dimen/_16sdp"
            android:textStyle="bold"
            android:layout_centerVertical="true"
            android:ellipsize="end"
            android:gravity="center_horizontal|center_vertical"
            android:paddingHorizontal="@dimen/_5sdp"
            android:singleLine="true"
            android:textColor="@color/black"
            tools:text="Registration" />
    </RelativeLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar"
        android:paddingHorizontal="@dimen/_10sdp"
        android:orientation="vertical"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/_10sdp"
            android:text="Name"
            android:textStyle="bold"
            android:textSize="@dimen/_14sdp"
            />
        <EditText
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/shape_border"
            android:layout_marginTop="@dimen/_5sdp"
            android:hint="Enter name"
            android:inputType="textCapWords"
            android:textStyle="bold"
            android:textSize="@dimen/_14sdp"
            android:paddingHorizontal="@dimen/_10sdp"
            android:paddingVertical="@dimen/_10sdp"
            android:drawableStart="@drawable/ic_user"
            android:drawablePadding="@dimen/_10sdp"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/_10sdp"
            android:text="Email"
            android:textStyle="bold"
            android:textSize="@dimen/_14sdp"
            />
        <EditText
            android:id="@+id/email"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textEmailAddress"
            android:background="@drawable/shape_border"
            android:layout_marginTop="@dimen/_5sdp"
            android:hint="Enter email"
            android:textStyle="bold"
            android:textSize="@dimen/_14sdp"
            android:paddingHorizontal="@dimen/_10sdp"
            android:paddingVertical="@dimen/_10sdp"
            android:drawableStart="@drawable/ic_email"
            android:drawablePadding="@dimen/_10sdp"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/_10sdp"
            android:text="Mobile No"
            android:textStyle="bold"
            android:textSize="@dimen/_14sdp"
            />
        <EditText
            android:id="@+id/mobile"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/shape_border"
            android:layout_marginTop="@dimen/_5sdp"
            android:hint="Enter mobile"
            android:inputType="number"
            android:textStyle="bold"
            android:textSize="@dimen/_14sdp"
            android:paddingHorizontal="@dimen/_10sdp"
            android:paddingVertical="@dimen/_10sdp"
            android:drawableStart="@drawable/ic_phone"
            android:drawablePadding="@dimen/_10sdp"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/_10sdp"
            android:text="Date"
            android:textStyle="bold"
            android:textSize="@dimen/_14sdp"
            />
        <TextView
            android:id="@+id/date"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/shape_border"
            android:layout_marginTop="@dimen/_5sdp"
            android:hint="Select date"
            android:textStyle="bold"
            android:textSize="@dimen/_14sdp"
            android:paddingHorizontal="@dimen/_10sdp"
            android:paddingVertical="@dimen/_10sdp"
            android:drawablePadding="@dimen/_10sdp"
            android:drawableEnd="@drawable/ic_date"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/_10sdp"
            android:text="Days"
            android:textStyle="bold"
            android:textSize="@dimen/_14sdp"
            />
        <Spinner
            android:id="@+id/days"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/shape_border"
            android:layout_marginTop="@dimen/_5sdp"
            android:hint="Select days"
            android:textStyle="bold"
            android:textSize="@dimen/_14sdp"
            android:paddingHorizontal="@dimen/_10sdp"
            android:paddingVertical="@dimen/_10sdp"
            android:drawablePadding="@dimen/_10sdp"
            android:drawableEnd="@drawable/ic_date"
            />




    </LinearLayout>

    <TextView
        android:id="@+id/submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shape_border"
        android:layout_marginTop="@dimen/_10sdp"
        android:textAlignment="center"
        android:text="Intert"
        android:textStyle="bold"
        android:textColor="@color/white"
        android:textSize="@dimen/_14sdp"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="@dimen/_10sdp"
        android:paddingHorizontal="@dimen/_10sdp"
        android:paddingVertical="@dimen/_10sdp"
        android:layout_marginHorizontal="@dimen/_10sdp"
        android:backgroundTint="@color/black"

        />

</RelativeLayout>

Registration kt

Registration.kt
class RegistrationActivity : AppCompatActivity() {
    private lateinit var userDao: UserDao
    private var userId: Int? = null


    lateinit var binding: ActivityRegistrationBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityRegistrationBinding.inflate(layoutInflater)
        setContentView(binding.root)


        userId = intent.getIntExtra("USER_ID", -1)
        if (userId != -1) {
            userId?.let { loadUserData(it) }
        }


        val db = UserDatabase.getDatabase(this)
        userDao = db.userDao()

        ArrayAdapter.createFromResource(
            this,
            R.array.days_array,
            android.R.layout.simple_spinner_item
        ).also { adapter ->
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
            binding.days.adapter = adapter
        }
        setCurrentDate()
        binding.date.setOnClickListener {
            showDatePickerDialog()
        }
        binding.submit.text = if (userId != -1) "Update" else "Insert"
        binding.submit.setOnClickListener {
            if (validateInput()) {
                if (userId != -1) {
                    updateData()
                } else {
                    insertData()
                }
            }
        }
    }




    private fun validateInput(): Boolean {
        val name: String = binding.name.text.toString().trim()
        val mobile: String = binding.mobile.text.toString().trim()
        val date: String = binding.date.text.toString().trim()
        val email: String = binding.email.text.toString().trim()

        if (TextUtils.isEmpty(name)) {
            binding.name.error = "Please enter name"
            return false
        }
        if (TextUtils.isEmpty(email) || !Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
           binding.email.error = "Please enter a valid email"
            return false
        }

        if (TextUtils.isEmpty(mobile) || mobile.length != 10) {
           binding.mobile.error = "Please enter a valid mobile number"
            return false
        }
        if (TextUtils.isEmpty(date)) {
           binding.date.error = "Please select a date"
            return false
        }
//        if (!isValidDate(date)) {
//            binding.date.error = "Please select a valid date"
//            return false
//        }
        return true
    }


    private fun isValidDate(selectedDate: String): Boolean {
        val simpleDateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
        val selectedDateObject = simpleDateFormat.parse(selectedDate)

        val currentDate = Calendar.getInstance().time

        return selectedDateObject?.before(currentDate) ?: false
    }

    private fun setCurrentDate() {
        val calendar = Calendar.getInstance()
        val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
        val currentDate = dateFormat.format(calendar.time)
        binding.date.setText(currentDate)
    }



    private fun updateData() {
        val name: String = binding.name.text.toString()
        val email: String = binding.email.text.toString()
        val mobile: String = binding.mobile.text.toString()
        val date: String = binding.date.text.toString()
        val selectedDay: String = binding.days.selectedItem.toString()

        val updatedUser = User(
            id = userId ?: 0,
            name = name,
            email = email,
            mobile = mobile,
            date = date,
            days = selectedDay
        )

        lifecycleScope.launch {
            userDao.update(updatedUser)
            Toast.makeText(this@RegistrationActivity, "Data updated", Toast.LENGTH_SHORT).show()
        }
    }


    private fun insertData() {
        val name: String = binding.name.text.toString()
        val email: String = binding.email.text.toString()
        val mobile: String = binding.mobile.text.toString()
        val date: String = binding.date.text.toString()
        val selectedDay: String = binding.days.selectedItem.toString()

        val newUser = User(
            name = name,
            email = email,
            mobile = mobile,
            date = date,
            days = selectedDay
        )

        lifecycleScope.launch {
            userDao.insert(newUser)
            Toast.makeText(this@RegistrationActivity, "Data inserted", Toast.LENGTH_SHORT).show()
        }
    }


    private fun showDatePickerDialog() {
        val calendar = Calendar.getInstance()

        val datePickerDialog = DatePickerDialog(
            this,
            { _, year, month, dayOfMonth ->
                val selectedDate = "$dayOfMonth/${month + 1}/$year"
                binding.date.setText(selectedDate)
            },
            calendar.get(Calendar.YEAR),
            calendar.get(Calendar.MONTH),
            calendar.get(Calendar.DAY_OF_MONTH)
        )
        datePickerDialog.show()
    }


    private fun loadUserData(userId: Int) {
        lifecycleScope.launch {
            val user = userDao.getUserById(userId)
            user?.let {
                binding.name.setText(it.name)
                binding.email.setText(it.email)
                binding.mobile.setText(it.mobile)
                binding.date.setText(it.date)

                val daysArray = resources.getStringArray(R.array.days_array)
                val dayIndex = daysArray.indexOf(it.days)
                if (dayIndex >= 0) {
                    binding.days.setSelection(dayIndex)
                }
            }
        }
    }

}

User Mode

User.kt
@Entity(tableName = "user_table")
data class User(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val name: String,
    val email: String,
    val mobile: String,
    val date: String,
    val days: String
)

User Dao

UserDao.kt
@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User)

    @Update
    suspend fun update(user: User)

    @Query("SELECT * FROM user_table WHERE id = :userId")
    suspend fun getUserById(userId: Int): User?


    @Query("Select * from user_table")
    fun getAll(): LiveData<List<User>>

}

UserDatabase

UserDatabase.kt
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class UserDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao

    companion object {
        @Volatile
        private var INSTANCE: UserDatabase? = null

        fun getDatabase(context: Context): UserDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    UserDatabase::class.java,
                    "user_database"
                ).build()
                INSTANCE = instance
                instance
            }
        }
    }
}
⚠️ **GitHub.com Fallback** ⚠️