Skip to content

Commit

Permalink
Merge pull request #1 from ahmedhrayyan/register-and-login
Browse files Browse the repository at this point in the history
Finish Login And Register.
  • Loading branch information
ahmedhrayyan committed Oct 1, 2021
2 parents 48de11b + af406bd commit d775a04
Show file tree
Hide file tree
Showing 30 changed files with 597 additions and 97 deletions.
6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 10 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,15 @@ dependencies {

// retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.8.0'

// Gson
implementation "com.google.code.gson:gson:2.8.6"

// Kotlin Android Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0"
implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'

}
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<uses-permission android:name="android.permission.INTERNET" />

<application
android:name=".MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
Expand Down
60 changes: 60 additions & 0 deletions app/src/main/java/com/ahmed/contactbook/BaseFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.ahmed.contactbook

import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.viewbinding.ViewBinding


abstract class BaseFragment<T : ViewBinding> : Fragment() {


//Binding View
private var _binding: ViewBinding? = null
abstract val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> T

//this will be used in child classes
protected val binding: T
get() = _binding as T


lateinit var mDialog: Dialog
fun showProgressDialog(context: Context) {
mDialog = Dialog(context)
mDialog.setContentView(R.layout.fragment_base)
mDialog.show()
}

fun hideProgressDialog() {
mDialog.dismiss()
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = bindingInflater.invoke(layoutInflater, container, false)
return _binding!!.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupOnViewCreated(view)
}

override fun onDestroy() {
super.onDestroy()
_binding = null
hideProgressDialog()
}


//Implemented into the child class
abstract fun setupOnViewCreated(view: View)

}
15 changes: 15 additions & 0 deletions app/src/main/java/com/ahmed/contactbook/MyApp.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.ahmed.contactbook

import android.app.Application
import android.content.Context

class MyApp:Application() {

override fun onCreate() {
super.onCreate()
appContext =applicationContext
}
companion object{
lateinit var appContext: Context
}
}
3 changes: 3 additions & 0 deletions app/src/main/java/com/ahmed/contactbook/data/db/UserDao.kt
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@



package com.ahmed.contactbook.data.db

import androidx.room.Dao
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
package com.ahmed.contactbook.data.model

data class LoginResponse (var toekn:String)
data class LoginResponse (var token:String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ahmed.contactbook.data.model

data class UserRegister(
var name:String,
var email:String,
var password:String
)
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.ahmed.contactbook.data.remote

import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
Expand All @@ -15,6 +16,7 @@ object ApiSettings {
Retrofit.Builder()
.baseUrl("https://phonebook-be.herokuapp.com/api/")
.client(client)
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.addConverterFactory(GsonConverterFactory.create())
.build()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,20 @@ package com.ahmed.contactbook.data.remote

import com.ahmed.contactbook.data.model.LoginResponse
import com.ahmed.contactbook.data.model.UserData
import retrofit2.Call
import com.ahmed.contactbook.data.model.UserRegister
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.POST

interface ContactApi {

@POST("login")
fun loginUser(
suspend fun loginUser(
@Body user: UserData
): Call<LoginResponse>
): Response<LoginResponse>

@POST("register")
suspend fun registerUser(
@Body user: UserRegister
): Response<LoginResponse>
}
36 changes: 5 additions & 31 deletions app/src/main/java/com/ahmed/contactbook/data/repo/Repo.kt
Original file line number Diff line number Diff line change
@@ -1,42 +1,16 @@
package com.ahmed.contactbook.data.repo

import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.ahmed.contactbook.data.model.LoginResponse
import com.ahmed.contactbook.data.model.UserData
import com.ahmed.contactbook.data.model.UserRegister
import com.ahmed.contactbook.data.remote.ApiSettings
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class Repo {
val liveData: MutableLiveData<String> = MutableLiveData()
fun loginUser(email: String, password: String): LiveData<String> {
val user = UserData(email, password)
ApiSettings.apiInstance.loginUser(user)
.enqueue(object : Callback<LoginResponse> {
override fun onResponse(
call: Call<LoginResponse>,
response: Response<LoginResponse>
) {

try {
if (response.isSuccessful)
liveData.value = response.body()!!.toString() + "01097203910"
else
liveData.value = response.message()
} catch (t: Exception) {
Log.d("error", response.errorBody().toString())
}
}

override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
liveData.value = t.message
Log.d("Error", t.message.toString())
}
suspend fun loginUser(user: UserData): Response<LoginResponse> =
ApiSettings.apiInstance.loginUser(user)

})
return liveData
}
suspend fun registerUser(user: UserRegister): Response<LoginResponse> =
ApiSettings.apiInstance.registerUser(user)
}
22 changes: 22 additions & 0 deletions app/src/main/java/com/ahmed/contactbook/ui/home/HomeFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.ahmed.contactbook.ui.home

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import com.ahmed.contactbook.BaseFragment
import com.ahmed.contactbook.databinding.HomeFragmentBinding

class HomeFragment : BaseFragment<HomeFragmentBinding>() {


private lateinit var viewModel: HomeViewModel
override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> HomeFragmentBinding
get() = HomeFragmentBinding::inflate

override fun setupOnViewCreated(view: View) {
viewModel = ViewModelProvider(this).get(HomeViewModel::class.java)
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ahmed.contactbook.ui.home

import androidx.lifecycle.ViewModel

class HomeViewModel : ViewModel() {
// TODO: Implement the ViewModel
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData

interface AuthListener {
fun onStarted()
fun onSuccess(liveData: LiveData<String>)
fun onSuccess()
fun onFailure(msg:String)
fun isConnection():Boolean
}
42 changes: 22 additions & 20 deletions app/src/main/java/com/ahmed/contactbook/ui/login/LoginFragment.kt
Original file line number Diff line number Diff line change
@@ -1,53 +1,55 @@
package com.ahmed.contactbook.ui.login

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.NavController
import androidx.navigation.Navigation
import com.ahmed.contactbook.BaseFragment
import com.ahmed.contactbook.R
import com.ahmed.contactbook.databinding.LoginFragmentBinding
import com.ahmed.contactbook.utils.ChechInternetConnection

class LoginFragment : Fragment(R.layout.login_fragment), AuthListener {
lateinit var binding: LoginFragmentBinding
lateinit var viewModel: LoginViewModel
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = LoginFragmentBinding.bind(view)
viewModel = ViewModelProvider(requireActivity()).get(LoginViewModel::class.java)
class LoginFragment : BaseFragment<LoginFragmentBinding>(), AuthListener {
private lateinit var viewModel: LoginViewModel
private lateinit var navController: NavController

override fun setupOnViewCreated(view: View) {
viewModel = ViewModelProvider(requireActivity()).get(LoginViewModel::class.java)
navController = Navigation.findNavController(view)
viewModel.authListener = this
binding.btnLogin.setOnClickListener {
val email = binding.etEmail.text.toString()
val password = binding.etPassword.text.toString()
viewModel.sendLoginRequest(email, password)
}

binding.tvRegister.setOnClickListener { navController.navigate(R.id.action_loginFragment_to_registerFragment) }

}

override fun onStarted() {
Toast.makeText(requireContext(), "started", Toast.LENGTH_SHORT).show()
binding.progressBar.visibility = View.VISIBLE

showProgressDialog(requireContext())
}

override fun onSuccess(liveData: LiveData<String>) {
liveData.observe(requireActivity(), { result ->
Toast.makeText(requireContext(), result, Toast.LENGTH_SHORT).show()
})
binding.progressBar.visibility = View.GONE
override fun onSuccess() {
hideProgressDialog()
navController.navigate(R.id.action_loginFragment_to_homeFragment)
}

override fun onFailure(msg: String) {
hideProgressDialog()
Toast.makeText(requireContext(), msg, Toast.LENGTH_SHORT).show()
binding.progressBar.visibility = View.GONE

}

override fun isConnection(): Boolean {
return ChechInternetConnection(requireContext()).isConnection()
}

override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> LoginFragmentBinding
get() = LoginFragmentBinding::inflate


}
Loading

0 comments on commit d775a04

Please sign in to comment.