What is Kotlin?
1. Google announced Kotlin is an official language for android development.Kotlin is flexible and has some cool features and easy to use!
2. Kotlin is a statically-typed, modern programming language that runs on a Java Virtual Machine (JVM) by compiling Kotlin code into Java byte-code.
3. Kotlin is free and open to use
4. It can also be compiled to JavaScript source code to native executable.
5. Kotlin fully supported in Android Studio 3.0 and higher
Why Kotlin?
1. Compatibility: Kotlin is fully compatible with JDK 6, ensuring that Kotlin applications can run on older Android devices with no issues. The Kotlin tooling is fully supported in Android Studio and compatible with the Android build system.
2. Performance: A Kotlin application runs as fast as an equivalent Java one, thanks to very similar bytecode structure. With Kotlin's support for inline functions, code using lambdas often runs even faster than the same code written in Java.
3.Interoperability: Kotlin is 100% interoperable with Java, allowing to use all existing Android libraries in a Kotlin application. This includes annotation processing, so databinding and Dagger work too.
4. Footprint Kotlin has a very compact runtime library, which can be further reduced through the use of ProGuard. In a real application, the Kotlin runtime adds only a few hundred methods and less than 100K to the size of the .apk file.
What is SQLite?
1. SQLite is one of the ways of storing data. It is very lightweight database that comes with Android OS.
2. In Android, integrating SQLite is a tedious task as it needs writing lot of boilerplate code to store simple data. Consider SQLite when your app needs to store simple data objects.
3. For many applications, SQLite is the app’s backbone whether it’s used directly or via some third-party wrapper. In this tutorial, we will write code in Kotlin and also see how to use SQLite in our app directly.
Key point to understand regarding SQLite in this project: -
1. SQLite is RDBMS (Relational Database Management System)
2. SQLite is written in programming language
3. SQLite is embedded within the Android Operating System, so you don’t need anything external on Android to use SQLite
4. To manipulate data (insert, update, delete) in SQLite database – we’ll use SQL (Structured Query Language)
In this tutorial, we are going to learn how to use SQLite using Kotlin. To really understand the usage of SQLite we will create an app using Kotlin. The App contains simple Login form, Registration form. This app shows how SQLite database operations are performed.
What is Material Design?
1. Material Design is a visual language developed by Google which was first introduced with Lollipop OS and since then it has become popular in designing and developing Android Apps.
2. Material Design is a visual language that synthesizes the classic principles of good design with the innovation of technology and science.
Follow the below steps to developed the Login and registration form with Kotlin in android studio 3.0 and higher using SQLite:
Create a new android project.
1. Add libraries to build.gradle file.
1. For designing purpose, you can use Material Design.
2. Add Gradle dependencies libraries in your build.gradle file and rebuilt the project successfully.
dependencies
{
Implementation 'com.android.support:appcompat-v7:27.1.1'
Implementation 'com.android.support:design:27.1.1'
Implementation 'com.android.support:cardview-v7:27.1.1'
}
2. Update strings.xml located in res->values->string.xml.
Add the below string values to the string.xml file located in res ⇒ values ⇒ strings.xml.
<resources>
<!--App name-->
<string name="app_name">ToDoListKotlinApp</string>
<!--registration-->
<string name="hint_name">Username</string>
<string name="hint_pass">Password</string>
<string name="hint_email">Email</string>
<string name="register_txt">No account yet? Create one</string>
<string name="registration_text">REGISTER</string>
<!--Login-->
<string name="login_text">LOGIN</string>
<string name="already_login_txt">Already a member? Login</string>
<!--error message-->
<string name="error_message_name">Please enter valid name</string>
<string name="error_message_email">Please enter valid email</string>
<string name="error_message_password">Please enter valid password</string>
<string name="error_email_exists">User may already exist</string>
<!--success message-->
<string name="success_message">User added successfully</string>
<string name="login_success_message">User logged successfully</string>
</resources>
Please refer below attachment for string.xml file declaration:
3. Update colors.xml located in res->values->colors.xml.
Add the below color values to the colors.xml located in res ⇒ values ⇒ colors.xml.
<resources>
<color name="colorPrimary">#b71c1c</color>
<color name="colorPrimaryDark">#7f0000</color>
<color name="colorAccent">#FF4081</color>
<color name="df_red">#dc3545</color>
<color name="df_danger">#dc3545</color>
<color name="formBg">#f0f0f0</color>
<color name="black_alpha_75">#bf000000</color>
<color name="colorText">#ffffffff</color>
</resources>
This colors are used in form background, toolbar, actionbar, textview colors.
4. Update styles.xml located in res->values->styles.xml.
Add the below style values to the styles.xml located in res ⇒ values ⇒ styles.xml.
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
Please refer below attachment for style.xml file
5. Add Logo Image in res->drawable.
Add logo image to the drawable folder located in res ⇒ drawable.
Please refer below path to add resource in drawable file.
6. Create User model class in model package.
Create a new package named model or you say it as a pojo class and create a Kotlin class named UserModel to maintain single user as an object.
package com.itw.todolistkotlinapp.model
class UserModel(val userid: Int = -1, val name: String, val email: String, val pass: String)
7. Create DbHelper class in dbmanager package.
Create a new package named dbmanager and create Kotlin class named DBHelper. Extend this class with SQLiteOpenHelper to manage database creation and version management. I have written methods for database operations.
Methods and functionality
1. addUser:- add user to database.
2. getAllUser:- fetch user’s data from database.
3. checkUser :- check whether user exists in database.
Write the below code in DBHelper.txt file.
package com.itw.todolistkotlinapp.dbmanager
import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteConstraintException
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteException
import android.database.sqlite.SQLiteOpenHelper
import android.support.annotation.IntegerRes
import com.itw.todolistkotlinapp.model.UserModel
class DBHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
override fun onCreate(db: SQLiteDatabase?) {
db?.execSQL(SQL_CREATE_ENTRIES)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
db?.execSQL(SQL_DELETE_ENTRIES)
onCreate(db)
}
override fun onDowngrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
onUpgrade(db, oldVersion, newVersion)
}
@Throws(SQLiteConstraintException::class)
fun insertUser(user: UserModel): Boolean {
// Gets the data repository in write mode
val db = writableDatabase
// Create a new map of values, where column names are the keys
val values = ContentValues()
values.put(USER_NAME, user.name)
values.put(USER_EMAIL, user.email)
values.put(USER_PASS, user.pass)
// Insert the new row, returning the primary key value of the new row
db.insert(TABLE_NAME, null, values)
db.close()
return true
}
@Throws(SQLiteConstraintException::class)
fun deleteUser(userid: String): Boolean {
// Gets the data repository in write mode
val db = writableDatabase
// Define 'where' part of query.
val selection = USER_ID + " LIKE ?"
// Specify arguments in placeholder order.
val selectionArgs = arrayOf(userid)
// Issue SQL statement.
db.delete(TABLE_NAME, selection, selectionArgs)
return true
}
/**
* This method to check user exist or not
*
* @param email
* @return true/false
*/
fun checkUser(email: String): Boolean {
// array of columns to fetch
val columns = arrayOf(USER_ID)
val db = this.readableDatabase
// selection criteria
val selection = "$USER_EMAIL = ?"
// selection argument
val selectionArgs = arrayOf(email)
// query user table with condition
/**
* Here query function is used to fetch records from user table this function works like we use sql query.
* SQL query equivalent to this query function is
* SELECT user_id FROM user WHERE user_email = 'abc@d.com';
*/
val cursor = db.query(
TABLE_NAME, //Table to query
columns, //columns to return
selection, //columns for the WHERE clause
selectionArgs, //The values for the WHERE clause
null, //group the rows
null, //filter by row groups
null
) //The sort order
val cursorCount = cursor.count
cursor.close()
db.close()
if (cursorCount > 0) {
return true
}
return false
}
fun getUserIdByEmail(email: String): Int {
val db = this.readableDatabase
val cursor = db.query(
TABLE_NAME, null, "$USER_EMAIL = ?", arrayOf(email),
null, null, null
)
if (cursor.getCount() < 1) {
return 0;
} else {
cursor.moveToFirst()
val userID: Int = cursor.getString(cursor.getColumnIndex(USER_ID)).toInt()
return userID;
}
}
fun getAllUser(): ArrayList {
// array of columns to fetch
val columns = arrayOf(USER_NAME, USER_EMAIL, USER_PASS)
// sorting orders
val sortOrder = "$USER_NAME ASC"
val userList = ArrayList()
val db = this.readableDatabase
// query the user table
val cursor = db.query(
TABLE_NAME, //Table to query
columns, //columns to return
null, //columns for the WHERE clause
null, //The values for the WHERE clause
null, //group the rows
null, //filter by row groups
sortOrder
) //The sort order
if (cursor.moveToFirst()) {
do {
val user = UserModel(
name = cursor.getString(cursor.getColumnIndex(USER_NAME)),
email = cursor.getString(cursor.getColumnIndex(USER_EMAIL)),
pass = cursor.getString(cursor.getColumnIndex(USER_PASS))
)
userList.add(user)
} while (cursor.moveToNext())
}
cursor.close()
db.close()
return userList
}
companion object {
// If you change the database schema, you must increment the database version.
val DATABASE_VERSION = 1
val DATABASE_NAME = "User.db"
val TABLE_NAME = "USER";
val USER_ID = "USER_ID";
val USER_NAME = "NAME";
val USER_EMAIL = "EMAIL";
val USER_PASS = "PASS";
private val SQL_CREATE_ENTRIES =
"CREATE TABLE " + TABLE_NAME + "(" +
USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
USER_NAME + " TEXT NOT NULL," +
USER_EMAIL + " TEXT NOT NULL," +
USER_PASS + " TEXT NOT NULL)"
private val SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + TABLE_NAME
}
}
8. Create activity_login.xml in res->layout->activity_login.xml.
Now create a layout file for the LoginActivity.kt i.e activity_login.xml and add the below code in your layout file.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.itw.todolistkotlinapp.activity.LoginActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.55"
android:gravity="center"
android:background="@color/df_danger">
<ImageView
android:id="@+id/imgKotlin"
android:layout_width="200dp"
android:layout_height="100dp"
android:src="@drawable/kotlin"
android:layout_centerInParent="true"
/>
</LinearLayout>
<LinearLayout
android:layout_weight=".5"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_margin="10dp"
android:orientation="vertical"
android:gravity="bottom"
android:layout_gravity="bottom">
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_email"
android:inputType="text"
android:maxLines="1"
android:textColor="@android:color/black"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_pass"
android:inputType="textPassword"
android:maxLines="1"
android:textColor="@android:color/black"/>
</android.support.design.widget.TextInputLayout>
<Button
android:id="@+id/button_check_user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="checkUser"
android:text="@string/login_text"
android:layout_gravity="center"/>
<TextView
android:id="@+id/textview_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/ll_entries"
android:padding="15dp"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"></LinearLayout>
<TextView
android:gravity="center"
android:id="@+id/txtLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/register_txt"
android:onClick="openRegister"/>
</LinearLayout>
</LinearLayout>
The below screen shows the login form with input validation
9. Create InputValidation class in utils->InputValidation.kt.
Create a package named utils and create a Kotlin class in it named InputValidation.kt and add below code in it. The code will create validation methods for input field. Validation like empty input, valid email and etc.
package com.itw.todolistkotlinapp.utils
import android.app.Activity
import android.content.Context
import android.support.design.widget.TextInputEditText
import android.support.design.widget.TextInputLayout
import android.view.View
import android.view.WindowManager
import android.view.inputmethod.InputMethodManager
class InputValidation
/**
* constructor
*
* @param context
*/
(private val context: Context) {
/**
* method to check InputEditText filled .
*
* @param textInputEditText
* @param textInputLayout
* @param message
* @return
*/
fun isInputEditTextFilled(textInputEditText: TextInputEditText, textInputLayout: TextInputLayout, message: String): Boolean {
val value = textInputEditText.text.toString().trim()
if (value.isEmpty()) {
textInputLayout.error = message
hideKeyboardFrom(textInputEditText)
return false
} else {
textInputLayout.isErrorEnabled = false
}
return true
}
/**
* method to check InputEditText has valid email .
*
* @param textInputEditText
* @param textInputLayout
* @param message
* @return
*/
fun isInputEditTextEmail(textInputEditText: TextInputEditText, textInputLayout: TextInputLayout, message: String): Boolean {
val value = textInputEditText.text.toString().trim()
if (value.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(value).matches()) {
textInputLayout.error = message
hideKeyboardFrom(textInputEditText)
return false
} else {
textInputLayout.isErrorEnabled = false
}
return true
}
/**
* method to check both InputEditText value matches.
*
* @param textInputEditText1
* @param textInputEditText2
* @param textInputLayout
* @param message
* @return
*/
fun isInputEditTextMatches(textInputEditText1: TextInputEditText, textInputEditText2: TextInputEditText, textInputLayout: TextInputLayout, message: String): Boolean {
val value1 = textInputEditText1.text.toString().trim()
val value2 = textInputEditText2.text.toString().trim()
if (!value1.contentEquals(value2)) {
textInputLayout.error = message
hideKeyboardFrom(textInputEditText2)
return false
} else {
textInputLayout.isErrorEnabled = false
}
return true
}
/**
* method to Hide keyboard
*
* @param view
*/
private fun hideKeyboardFrom(view: View) {
val imm = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
}
}
10. Create LoginActivity class in activity->LoginActivity.kt.
Create a package named activities and create a kotlin class named LoginActivity and add below code. Here i have written the code to validate the input fields Email and Password using the InputValidation class which i described above. Also code for navigation to registration screen on the click of registration link.
package com.itw.todolistkotlinapp.activity
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.design.widget.TextInputEditText
import android.support.design.widget.TextInputLayout
import android.view.View
import android.widget.Toast
import com.itw.todolistkotlinapp.R
import com.itw.todolistkotlinapp.dbmanager.DBHelper
import com.itw.todolistkotlinapp.utils.InputValidation
import com.itw.todolistkotlinapp.utils.ToDoPref
class LoginActivity : AppCompatActivity() {
private lateinit var databaseHelper: DBHelper
private lateinit var textInputLayoutEmail: TextInputLayout
private lateinit var textInputLayoutPassword: TextInputLayout
private lateinit var textInputEditTextEmail: TextInputEditText
private lateinit var textInputEditTextPassword: TextInputEditText
private lateinit var inputValidation: InputValidation
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
initObjects()
}
fun checkUser(v: View) {
if (!inputValidation!!.isInputEditTextFilled(
textInputEditTextEmail!!,
textInputLayoutEmail!!,
getString(R.string.error_message_email)
)
) {
return
}
if (!inputValidation!!.isInputEditTextEmail(
textInputEditTextEmail!!,
textInputLayoutEmail!!,
getString(R.string.error_message_email)
)
) {
return
}
if (!inputValidation!!.isInputEditTextFilled(
textInputEditTextPassword!!,
textInputLayoutPassword!!,
getString(R.string.error_message_password)
)
) {
return
}
if (databaseHelper!!.checkUser(textInputEditTextEmail!!.text.toString().trim())) {
Toast.makeText(this, getString(R.string.success_message), Toast.LENGTH_LONG).show()
ToDoPref.getUserId = databaseHelper.getUserIdByEmail(textInputEditTextEmail!!.text.toString())
val accountsIntent = Intent(this, HomeActivity::class.java)
startActivity(accountsIntent)
finish()
} else {
Toast.makeText(this, "not exist", Toast.LENGTH_LONG).show()
}
}
fun openRegister(v: View) {
val intent = Intent(this, RegisterActivity::class.java)
startActivity(intent)
finish()
}
private fun initObjects() {
inputValidation = InputValidation(this)
databaseHelper = DBHelper(this)
textInputLayoutEmail = findViewById(R.id.textInputLayoutEmail) as TextInputLayout
textInputLayoutPassword = findViewById(R.id.textInputLayoutPassword) as TextInputLayout
textInputEditTextEmail = findViewById(R.id.textInputEditTextEmail) as TextInputEditText
textInputEditTextPassword = findViewById(R.id.textInputEditTextPassword) as TextInputEditText
}
}
The below screen shows the login form with input validation display the error message if values entered in input fields are not valid.
11. Create activity_register.xml in res->layout->activity_register.xml.
Now create a layout file for the RegisterActivity.kt i.e activity_register.xml and add the below code in your layout file. The code will create a simple registration form containing logo on the top with input fields and login screen navigation link.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.itw.todolistkotlinapp.activity.RegisterActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.55"
android:gravity="center"
android:background="@color/df_danger">
<ImageView
android:id="@+id/imgKotlin"
android:layout_width="200dp"
android:layout_height="100dp"
android:src="@drawable/kotlin"
android:layout_centerInParent="true" />
</LinearLayout>
<android.support.v7.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.5"
android:orientation="vertical"
android:gravity="bottom"
android:layout_gravity="center"
android:layout_margin="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="start"
android:hint="@string/hint_name"
android:textColorHint="@android:color/black"
android:inputType="text"
android:maxLines="1"
android:textColor="@android:color/black"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="start"
android:textColorHint="@android:color/white"
android:hint="@string/hint_email"
android:inputType="text"
android:maxLines="1"
android:textColor="@android:color/black"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayoutPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center">
<android.support.design.widget.TextInputEditText
android:id="@+id/textInputEditTextPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="start"
android:textColorHint="@android:color/white"
android:hint="@string/hint_pass"
android:inputType="textPassword"
android:maxLines="1"
android:textColor="@android:color/black"/>
</android.support.design.widget.TextInputLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button_add_user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="addUser"
android:text="@string/registration_text"/>
<Button
android:id="@+id/button_delete_user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="deleteUser"
android:text="Delete"
android:visibility="gone"/>
<Button
android:id="@+id/button_show_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="showAllUsers"
android:text="Show All"
android:visibility="gone"/>
</LinearLayout>
<TextView
android:id="@+id/textview_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:gravity="center"
android:id="@+id/txtLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/already_login_txt"
android:onClick="openLogin"/>
</android.support.v7.widget.LinearLayoutCompat>
</LinearLayout>
activity_register.xml would result a screen like this:
12. Create RegisterActivity class in activity->RegisterActivity.kt.
Create a kotlin class named RegisterActivity and add below code.
Below code is written to validate the input fields Name, Email, Password using the InputValidation class which i described above. Also code for navigation to login screen on the click of login link and shows snackbar with success message for registration.
Please add RegisterActivity.kt file into below location :
package com.itw.todolistkotlinapp.activity
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.design.widget.TextInputEditText
import android.support.design.widget.TextInputLayout
import android.view.View
import android.widget.TextView
import android.widget.Toast
import com.itw.todolistkotlinapp.R
import com.itw.todolistkotlinapp.dbmanager.DBHelper
import com.itw.todolistkotlinapp.model.UserModel
import com.itw.todolistkotlinapp.utils.InputValidation
import kotlinx.android.synthetic.main.activity_main.*
class RegisterActivity : AppCompatActivity(){
lateinit var usersDBHelper: DBHelper
private lateinit var textInputLayoutName: TextInputLayout
private lateinit var textInputLayoutEmail: TextInputLayout
private lateinit var textInputLayoutPassword: TextInputLayout
private lateinit var textInputEditTextName: TextInputEditText
private lateinit var textInputEditTextEmail: TextInputEditText
private lateinit var textInputEditTextPassword: TextInputEditText
private lateinit var inputValidation: InputValidation
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
usersDBHelper = DBHelper(this)
inputValidation = InputValidation(this)
initViews()
}
/**
* This method is to initialize views
*/
private fun initViews() {
textInputLayoutName = findViewById(R.id.textInputLayoutName) as TextInputLayout
textInputLayoutEmail = findViewById(R.id.textInputLayoutEmail) as TextInputLayout
textInputLayoutPassword = findViewById(R.id.textInputLayoutPassword) as TextInputLayout
textInputEditTextName = findViewById(R.id.textInputEditTextName) as TextInputEditText
textInputEditTextEmail = findViewById(R.id.textInputEditTextEmail) as TextInputEditText
textInputEditTextPassword = findViewById(R.id.textInputEditTextPassword) as TextInputEditText
}
fun addUser(v: View){
if (!inputValidation!!.isInputEditTextFilled(textInputEditTextName, textInputLayoutName, getString(R.string.error_message_name))) {
return
}
if (!inputValidation!!.isInputEditTextFilled(textInputEditTextEmail, textInputLayoutEmail, getString(R.string.error_message_email))) {
return
}
if (!inputValidation!!.isInputEditTextEmail(textInputEditTextEmail, textInputLayoutEmail, getString(R.string.error_message_email))) {
return
}
if (!inputValidation!!.isInputEditTextFilled(textInputEditTextPassword, textInputLayoutPassword, getString(R.string.error_message_password))) {
return
}
if (!usersDBHelper!!.checkUser(textInputEditTextEmail!!.text.toString().trim())) {
var result = usersDBHelper.insertUser(UserModel(name = textInputEditTextName!!.text.toString().trim(),
email = textInputEditTextEmail!!.text.toString().trim(),
pass = textInputEditTextPassword!!.text.toString().trim()))
//clear all edittext s
this.textInputEditTextEmail.setText("")
this.textInputEditTextName.setText("")
this.textInputEditTextPassword.setText("")
this.textview_result.text = "Added user : "+result
Toast.makeText(this, getString(R.string.success_message), Toast.LENGTH_LONG).show()
this.ll_entries.removeAllViews()
}else {
Toast.makeText(this, getString(R.string.error_email_exists), Toast.LENGTH_LONG).show()
}
}
fun deleteUser(v:View){
var userid = this.textInputEditTextPassword.text.toString()
val result = usersDBHelper.deleteUser(userid)
this.textview_result.text = "Deleted user : "+result
this.ll_entries.removeAllViews()
}
fun showAllUsers(v:View){
var users = usersDBHelper.getAllUser()
this.ll_entries.removeAllViews()
users.forEach {
var tv_user = TextView(this)
tv_user.textSize = 30F
tv_user.text = it.userid.toString() + " " + it.name.toString() + " " + it.email.toString()
this.ll_entries.addView(tv_user)
}
this.textview_result.text = "Fetched " + users.size + " users"
}
fun openLogin(v: View){
val intent = Intent(this, LoginActivity::class.java)
startActivity(intent)
finish()
}
}
Below screen shows the register form with input validation display the error message if values entered in input fields are not valid.
Below Screen shows the filled register form with valid values.
Below screen shows the register form display the toast with registration success message.
13. Update AndroidManifest.xml.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itw.todolistkotlinapp">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:name=".app.ToDoApplication"
>
<activity android:name=".activity.LoginActivity">
</activity>
<activity android:name=".activity.RegisterActivity">
</activity>
<activity android:name=".activity.HomeActivity">
</activity>
<activity android:name=".activity.AppStartActivity">
</activity>
<activity android:name=".activity.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>