Registration - mayurparmar2/AlarmDemo GitHub Wiki
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
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.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
)
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.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
}
}
}
}