Saturday 21 December 2019

Android (Kotlin) Login and Register using Retrofit example with PHP MYSQL

Android (Kotlin) Login and Register example with Retrofit


Output : 




Create Table :



PHP Files :

config.php

<?php
$host="localhost";
$user="root";
$password="";
$db = "kotlin_example";
$con = mysqli_connect($host,$user,$password,$db);
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }else{  //echo "Connect"; 

   }
?>

register.php

<?php

if($_SERVER['REQUEST_METHOD']=='POST'){
    include_once("config.php");
    $postdata = file_get_contents("php://input");

    if (isset($postdata)) {
        $request1 = json_decode($postdata);
        $email = $request1->email;
        $username = $request1->username;
        $password = $request1->password;
         if($email == '' || $username == '' || $password == ''){
                echo json_encode(array( "status" => "false","message" => "Parameter missing!") );
         }else{
                $query= "SELECT * FROM user WHERE username='$username'";
                $result= mysqli_query($con, $query);
                if(mysqli_num_rows($result) > 0){  
                   echo json_encode(array( "status" => "false","message" => "Username already exist!") );
                }else{ 
                 $query = "INSERT INTO user (email,username,password) VALUES ('$email','$username','$password')";
                 if(mysqli_query($con,$query)){
                     $query= "SELECT * FROM user WHERE username='$username'";
                             $result= mysqli_query($con, $query);
                         $emparray = array();
                             if(mysqli_num_rows($result) > 0){  
                             while ($row = mysqli_fetch_assoc($result)) {
                                         $emparray[] = $row;
                                         echo json_encode(array( "status" => "true","message" => "Successfully registered!" , "data" => $row) );
                                       }
                             }
                 }else{
                     echo json_encode(array( "status" => "false","message" => "Error occured, please try again!") );
                }
            }
                    mysqli_close($con);
         }
    }

} else{
    echo json_encode(array( "status" => "false","message" => "Error occured, please try again!") );
}

 ?>

login.php

<?php

if($_SERVER['REQUEST_METHOD']=='POST'){
include_once("config.php");
$postdata = file_get_contents("php://input");
    if (isset($postdata)) {
        $request1 = json_decode($postdata);
        $email = $request1->email;
        $password = $request1->password;
        if( $email == '' || $password == '' ){
            echo json_encode(array( "status" => false,"message" => "Parameter missing!") );
         }else{
            $query= "SELECT * FROM user WHERE email='$email' AND password='$password'";
                $result= mysqli_query($con, $query);
                if(mysqli_num_rows($result) > 0){  
                 $query= "SELECT * FROM user WHERE email='$email' AND password='$password'";
                             $result= mysqli_query($con, $query);
                         $emparray;
                             if(mysqli_num_rows($result) > 0){  
                             while ($row = mysqli_fetch_assoc($result)) {
                                         $emparray = $row;
                                       }
                             }
                   echo json_encode(array( "status" => true,"message" => "Login successfully!", "data" => $emparray) );
                }else{ 
                    echo json_encode(array( "status" => false,"message" => "Invalid email or password!") );
                }
                 mysqli_close($con);
         }
    }
} else{
    echo json_encode(array( "status" => false,"message" => "Error occured, please try again!") );
}

?>

get_user_detail.php

<?php
$response = array();
include_once("config.php");
if (isset($_GET["id"])) {
    $id = $_GET['id'];
    $query= "SELECT * FROM user WHERE id='$id'";
    $result= mysqli_query($con, $query);
    $emparray;
    if(mysqli_num_rows($result) > 0){  
        while ($row = mysqli_fetch_assoc($result)) {
            $emparray = $row;
            echo json_encode(array( "status" => true, "data" => $emparray) );
        }
    }
    else{ 
        echo json_encode(array( "status" => false,"message" => "No User Found!") );
    }
}else {
    echo json_encode(array( "status" => false,"message" => "Required field(s) is missing!") )
}

?>

build.gradle

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
implementation 'com.google.android.material:material:1.0.0'

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.hpos.loginregisterusingretrofit">

    <uses-permission android:name="android.permission.INTERNET" />

    <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:usesCleartextTraffic="true"
        tools:ignore="GoogleAppIndexingWarning"
        tools:targetApi="m">
        <activity android:name=".HomeActivity"></activity>
        <activity android:name=".RegisterActivity" />
        <activity android:name=".LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Models

SigninRequest.kt

package com.hpos.loginregisterusingretrofit.models

import com.google.gson.annotations.SerializedName

class SigninRequest(@SerializedName("email") var email: String,
                    @SerializedName("password") var password: String)

SigninResponse.kt

package com.hpos.loginregisterusingretrofit.models

class SigninResponse(val status: Boolean, val message:String, val data: User)

SignupRequest.kt

package com.hpos.loginregisterusingretrofit.models

import com.google.gson.annotations.SerializedName

class SignupRequest(@SerializedName("email") var email: String,
                    @SerializedName("username") var username: String,
                    @SerializedName("password") var password: String)

SignupResponse.kt

package com.hpos.loginregisterusingretrofit.models

class SignupResponse(val status: Boolean, val message:String, val data: User)

UserResponse.kt

package com.hpos.loginregisterusingretrofit.models

data class UserResponse(val status: Boolean, val data: User)

User.kt

package com.hpos.loginregisterusingretrofit.models;

data class User(val id:Int, val username:String, val email:String, val password:String)

Retrofit Files

ApiList

package com.hpos.loginregisterusingretrofit.api

import com.hpos.loginregisterusingretrofit.models.*
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Query

interface ApiList {

    //TODO : Register User
    @POST("register.php")
    fun doRegister(
        @Body signupRequest: SignupRequest
    ): Call<SignupResponse> // body data

    //TODO : Login User
    @POST("login.php")
    fun doLogin(
        @Body signinRequest: SigninRequest
    ): Call<SigninResponse> // body data

    //TODO : Get User
    @GET("get_user_detail.php")
    fun getUser(@Query("id") id: String): Call<UserResponse>
}


ApiService

package com.hpos.loginregisterusingretrofit.api

import retrofit2.Retrofit

object ApiService {
    private val TAG = "--ApiService"

    private const val BASE_URL = "http://192.168.1.111/KotlinExample/LoginRegistration/"

    fun loginApiCall() = Retrofit.Builder()
            .baseUrl(BASE_URL)
//            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(ApiWorker.gsonConverter)
            .client(ApiWorker.client)
            .build()
            .create(ApiList::class.java)!!
}

ApiWorker

package com.hpos.loginregisterusingretrofit.api

import com.google.gson.GsonBuilder
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.converter.gson.GsonConverterFactory
import java.security.KeyManagementException
import java.security.NoSuchAlgorithmException
import java.util.concurrent.TimeUnit

object ApiWorker {
    private var mClient: OkHttpClient? = null
    private var mGsonConverter: GsonConverterFactory? = null

    /**
     * Don't forget to remove Interceptors (or change Logging Level to NONE)
     * in production! Otherwise people will be able to see your request and response on Log Cat.
     */
    val client: OkHttpClient
        @Throws(NoSuchAlgorithmException::class, KeyManagementException::class)
        get() {
            if (mClient == null) {
                val interceptor = HttpLoggingInterceptor()
                interceptor.level = HttpLoggingInterceptor.Level.BODY

                val httpBuilder = OkHttpClient.Builder()
                httpBuilder
                    .connectTimeout(120, TimeUnit.SECONDS)
                    .readTimeout(120, TimeUnit.SECONDS)
                    .addInterceptor(interceptor)  /// show all JSON in logCat
                    .addInterceptor { chain ->
                        val original = chain.request()

                        val requestBuilder = original.newBuilder()
//                        .addHeader("Authorization", AUTH)
                            .addHeader("Content-Type", "application/json")
//                            .method(original.method(), original.body())

                        val request = requestBuilder.build()
                        chain.proceed(request)
                    }
                mClient = httpBuilder.build()

            }
            return mClient!!
        }


    val gsonConverter: GsonConverterFactory
        get() {
            if (mGsonConverter == null) {
                mGsonConverter = GsonConverterFactory
                    .create(
                        GsonBuilder()
                            .setLenient()
                            .disableHtmlEscaping()
                            .create()
                    )
            }
            return mGsonConverter!!
        }
}

Screens Files

HomeActivity.kt

package com.hpos.loginregisterusingretrofit

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import android.widget.Toast
import com.hpos.loginregisterusingretrofit.api.ApiService
import com.hpos.loginregisterusingretrofit.models.User
import com.hpos.loginregisterusingretrofit.models.UserResponse
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class HomeActivity : AppCompatActivity() {

    var userId: String = "";

    private lateinit var txt_name: TextView
    private lateinit var txt_email: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)

        setTitle("Home")

        val intent = getIntent()
        userId = intent.getIntExtra("id", 0).toString()

        txt_name = findViewById(R.id.txt_name) as TextView
        txt_email = findViewById(R.id.txt_email) as TextView

        getUser()

    }

    private fun getUser() {
        ApiService.loginApiCall().getUser(userId).enqueue(object : Callback<UserResponse> {
            override fun onResponse(
                call: Call<UserResponse>,
                response: Response<UserResponse>) {
                Log.d("Response User ::::", response.body().toString())
                if (response.body()!!.status){
                    txt_name.setText(response.body()!!.data.username)
                    txt_email.setText(response.body()!!.data.email)
                }
            }

            override fun onFailure(call: Call<UserResponse>, t: Throwable) {
//                            Log.d("error::::",t?.message)
            }

        })
    }
}


activity_home.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".HomeActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_centerInParent="true">

        <androidx.appcompat.widget.AppCompatImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/my"
            android:layout_gravity="center_horizontal"/>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginTop="10dp"
            android:layout_gravity="center_horizontal">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Name : "
                android:textSize="20sp"
                android:textStyle="bold"/>

            <TextView
                android:id="@+id/txt_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Jainish Prajapati"
                android:textSize="20sp"/>

        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginTop="10dp"
            android:layout_gravity="center_horizontal">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Email : "
                android:textSize="20sp"
                android:textStyle="bold"/>

            <TextView
                android:id="@+id/txt_email"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="jainishprajapati17@gmail.com"
                android:textSize="20sp"/>

        </LinearLayout>

    </LinearLayout>

</RelativeLayout>

LoginActivity.kt

package com.hpos.loginregisterusingretrofit

import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.appcompat.widget.AppCompatTextView
import com.google.android.material.button.MaterialButton
import com.google.android.material.textfield.TextInputEditText
import com.hpos.loginregisterusingretrofit.api.ApiService
import com.hpos.loginregisterusingretrofit.models.SigninRequest
import com.hpos.loginregisterusingretrofit.models.SigninResponse
import org.json.JSONObject
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class LoginActivity : Activity(), View.OnClickListener {

    private lateinit var ed_email : TextInputEditText
    private lateinit var ed_password : TextInputEditText
    private lateinit var btn_signin : MaterialButton
    private lateinit var txt_sign_up : AppCompatTextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        ed_email = findViewById(R.id.ed_email) as TextInputEditText
        ed_password = findViewById(R.id.ed_password) as TextInputEditText
        btn_signin = findViewById(R.id.btn_signin) as MaterialButton
        txt_sign_up = findViewById(R.id.txt_sign_up) as AppCompatTextView

        btn_signin.setOnClickListener(this)
        txt_sign_up.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        when(v?.id){
            R.id.txt_sign_up -> {
                startActivity(Intent(this@LoginActivity, RegisterActivity::class.java))
            }
            R.id.btn_signin -> {
                if (validation()) {
                    val json = JSONObject()
                    json.put("email", ed_email.text.toString())
                    json.put("password", ed_password.text.toString())

                    ApiService.loginApiCall().doLogin(
                        SigninRequest(
                            ed_email.text.toString(),ed_password.text.toString()
                        )
                    ).enqueue(object : Callback<SigninResponse> {
                        override fun onResponse(
                            call: Call<SigninResponse>,
                            response: Response<SigninResponse>) {

                            Log.d("Response::::", response.body().toString())
                            if (response.body()!!.status){
                                finish()
                                val intent = Intent(this@LoginActivity, HomeActivity::class.java)
                                intent.putExtra("id",response.body()!!.data.id)
                                startActivity(intent)
                            }else{
                                Toast.makeText(applicationContext, response.body()!!.message, Toast.LENGTH_LONG).show()
                            }
                        }

                        override fun onFailure(call: Call<SigninResponse>, t: Throwable) {
                        }

                    })
                }
            }
        }
    }

    fun validation(): Boolean {
        var value = true

        val password = ed_password.text.toString().trim()
        val name = ed_email.text.toString().trim()

        if (password.isEmpty()) {
            ed_password.error = "Password required"
            ed_password.requestFocus()
            value = false
        }

        if (name.isEmpty()) {
            ed_email.error = "Email required"
            ed_email.requestFocus()
            value = false
        }

        return value;
    }
}


activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LoginActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_margin="20dp"
        android:layout_centerInParent="true">

        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/signin"
            android:textColor="@android:color/black"
            android:textStyle="bold"
            android:textSize="36sp"/>

        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/welcome_back"
            android:textSize="20sp"
            android:textColor="@android:color/darker_gray"/>

        <com.google.android.material.textfield.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/email"
            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
            android:layout_marginTop="30dp">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/ed_email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawablePadding="5dp"
                android:inputType="textEmailAddress"/>
        </com.google.android.material.textfield.TextInputLayout>

        <com.google.android.material.textfield.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/password"
            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
            android:layout_marginTop="10dp">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/ed_password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawablePadding="5dp"
                android:inputType="textPassword"/>

        </com.google.android.material.textfield.TextInputLayout>

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btn_signin"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="@string/sign_in"
            android:padding="15dp"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_horizontal"
            android:layout_marginTop="20dp">
            <androidx.appcompat.widget.AppCompatTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/don_t_have_an_account"
                android:textSize="20sp"
                android:textColor="@android:color/darker_gray"/>
            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/txt_sign_up"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/sign_up_here"
                android:textSize="20sp"
                android:textColor="@android:color/black"
                android:layout_marginStart="20dp"/>
        </LinearLayout>



    </LinearLayout>

</RelativeLayout>

RegisterActivity.kt

package com.hpos.loginregisterusingretrofit

import android.app.Activity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import com.google.android.material.button.MaterialButton
import com.google.android.material.textfield.TextInputEditText
import com.hpos.loginregisterusingretrofit.api.ApiService
import com.hpos.loginregisterusingretrofit.models.SignupRequest
import com.hpos.loginregisterusingretrofit.models.SignupResponse
import org.json.JSONObject
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class RegisterActivity : Activity(), View.OnClickListener {

    private lateinit var ed_username: TextInputEditText
    private lateinit var ed_email: TextInputEditText
    private lateinit var ed_password: TextInputEditText
    private lateinit var btn_signup: MaterialButton

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)

        ed_username = findViewById(R.id.ed_username) as TextInputEditText
        ed_email = findViewById(R.id.ed_email) as TextInputEditText
        ed_password = findViewById(R.id.ed_password) as TextInputEditText
        btn_signup = findViewById(R.id.btn_signup) as MaterialButton

        btn_signup.setOnClickListener(this)

    }

    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.btn_signup -> {
                if (validation()) {
                    val json = JSONObject()
                    json.put("email", ed_email.text.toString())
                    json.put("username", ed_username.text.toString())
                    json.put("password", ed_password.text.toString())

                    ApiService.loginApiCall().doRegister(
                        SignupRequest(
                            ed_email.text.toString(),
                            ed_username.text.toString(), ed_password.text.toString()
                        )
                    ).enqueue(object : Callback<SignupResponse> {
                        override fun onResponse(
                            call: Call<SignupResponse>,
                            response: Response<SignupResponse>
                        ) {

                            Log.d("Response::::", response.body().toString())
                            val loginResponse :  SignupResponse
                            loginResponse = response.body()!!
                            if (loginResponse.status){
                                finish()
                            }else{
                                Toast.makeText(applicationContext, response.body()!!.message, Toast.LENGTH_LONG).show()
                            }
                        }

                        override fun onFailure(call: Call<SignupResponse>, t: Throwable) {
                        }

                    })
                }
            }
        }
    }


    fun validation(): Boolean {
        var value = true

        val email = ed_email.text.toString().trim()
        val password = ed_password.text.toString().trim()
        val name = ed_username.text.toString().trim()

        if (email.isEmpty()) {
            ed_email.error = "Email required"
            ed_email.requestFocus()
            value = false
        }


        if (password.isEmpty()) {
            ed_password.error = "Password required"
            ed_password.requestFocus()
            value = false
        }

        if (name.isEmpty()) {
            ed_username.error = "Name required"
            ed_username.requestFocus()
            value = false
        }

        return value;
    }
}


activity_register.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LoginActivity">

    <androidx.appcompat.widget.AppCompatImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_margin="20dp"
        android:layout_centerInParent="true">

        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/signup"
            android:textColor="@android:color/black"
            android:textStyle="bold"
            android:textSize="36sp"/>

        <com.google.android.material.textfield.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/user_name"
            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
            android:layout_marginTop="30dp">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/ed_username"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawablePadding="5dp" />
        </com.google.android.material.textfield.TextInputLayout>

        <com.google.android.material.textfield.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/email"
            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
            android:layout_marginTop="10dp">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/ed_email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawablePadding="5dp" />
        </com.google.android.material.textfield.TextInputLayout>

        <com.google.android.material.textfield.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/password"
            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
            android:layout_marginTop="10dp">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/ed_password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawablePadding="5dp"
                android:inputType="textPassword"/>

        </com.google.android.material.textfield.TextInputLayout>

        <com.google.android.material.button.MaterialButton
            android:id="@+id/btn_signup"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="@string/sign_up"
            android:padding="15dp"/>

    </LinearLayout>

</RelativeLayout>

style.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>

string.xml

<resources>
    <string name="app_name">LoginRegisterUsingRetrofit</string>
    <string name="user_name">User Name</string>
    <string name="password">Password</string>
    <string name="sign_in">Sign In</string>
    <string name="signin">Signin</string>
    <string name="welcome_back">Welcome back</string>
    <string name="sign_up">Sign Up</string>
    <string name="email">Email</string>
    <string name="signup">Signup</string>
    <string name="don_t_have_an_account">Don\'t have an account?</string>
    <string name="sign_up_here">Sign up here</string>
</resources>


color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#5edb92</color>
    <color name="colorPrimaryDark">#5edb92</color>
    <color name="colorAccent">#5edb92</color>

    <color name="colorPrimaryBackground">#0886c7</color>
    <color name="colorFormBackground">#e4e4e4</color>
</resources>