Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .idea/gradle.xml

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

17 changes: 17 additions & 0 deletions .idea/misc.xml

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

7 changes: 7 additions & 0 deletions .idea/vcs.xml

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

18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# AndroidD20
## Màn hình khi mở App - LoginFragment (thuộc LoginActivity)

![image](https://user-images.githubusercontent.com/84552830/181234862-6ae26fbb-f0ee-46ac-a343-9da2a4b99728.png)


## Màn hình SignUp - SignUpFragment (Thuộc LoginActivity)
![image](https://user-images.githubusercontent.com/84552830/181235112-d327bcbc-9ead-4662-8173-8cf78de20fbf.png)

## Màn hình sau khi đăng ký thành công - LoginFragment (thuộc LoginActivity)
![image](https://user-images.githubusercontent.com/84552830/181235411-06fb8497-6789-4907-b10f-2b6c94521677.png)

## Màn hình sau khi đăng nhập thành công - MainActivity:
![image](https://user-images.githubusercontent.com/84552830/181235466-a57b2a58-3af2-4a73-81e9-fd22222aa33d.png)

//Sau khi đăng nhập thành công sẽ gọi `finish()` của `LoginActivity` để khi nhấn back không quay trở lại màn hình Login.

//Bấm `Logout` sẽ gọi `finish()` đóng App.
10 changes: 9 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,23 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}

buildFeatures {
viewBinding = true
}
}

dependencies {

implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.core:core-ktx:1.8.0'
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation "androidx.fragment:fragment-ktx:1.5.1"
implementation("androidx.room:room-ktx:2.4.2")
implementation("androidx.navigation:navigation-fragment-ktx:2.5.1")
implementation("androidx.navigation:navigation-ui-ktx:2.5.1")
}
9 changes: 9 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,15 @@
android:supportsRtl="true"
android:theme="@style/Theme.AndroidD20"
tools:targetApi="31">
<activity
android:name=".LoginActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="true">
Expand Down
66 changes: 66 additions & 0 deletions app/src/main/java/com/sudo/androidd20/LoginActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.sudo.androidd20

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.add
import androidx.fragment.app.commit
import com.sudo.androidd20.data.User
import com.sudo.androidd20.fragment.LogInFragment

class LoginActivity : AppCompatActivity()/*, LogInFragment.GetUsersListListener,
SignUpFragment.UpdateUsersListListener*/ {
//private val loginModel: LoginModel by viewModels()
private lateinit var listUser: MutableList<User>

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

linkToLoginFragment()
loadUsersData()
}

private fun linkToLoginFragment() {
supportFragmentManager.commit {
add<LogInFragment>(R.id.fragment_container)
}
}

//mục đích chính là load dữ liệu người dùng từ database nên em đặt tên thế này
private fun loadUsersData() {
// loginModel.add(
// User(
// email = "admin",
// userName = "admin",
// password = "admin"
// )
// )

listUser = mutableListOf(
User(
email = "admin",
userName = "admin",
password = "admin"
)
)

Log.i("LoginModel", "add S4ltF1sh!")
}

// override fun getUsersList(): MutableList<User> {
// return listUser
// }
//
// override fun addUser(user: User) {
// listUser.add(user)
// }

public fun getUsersList(): MutableList<User> {
return listUser
}

public fun updateUsersList(user: User) {
listUser.add(user)
}
}
29 changes: 28 additions & 1 deletion app/src/main/java/com/sudo/androidd20/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,37 @@ package com.sudo.androidd20

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.appcompat.app.AppCompatDelegate
import com.sudo.androidd20.data.User
import com.sudo.androidd20.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)

setDataDisplayed()
setOnClick()
}

private fun setDataDisplayed() {
val userReceived = intent?.extras?.get("userData") as User

binding.apply {
tvUsername.text = userReceived.userName
tvName.text = userReceived.name
tvAge.text = userReceived.age.toString()
}
}

private fun setOnClick() {
binding.btnLogOut.setOnClickListener {
finish()
}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nên tách hàm riêng, có thể dùng with(binding) hoặc binding.apply

}
}
11 changes: 11 additions & 0 deletions app/src/main/java/com/sudo/androidd20/data/User.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.sudo.androidd20.data

import java.io.Serializable

data class User(
var email: String,
var userName: String,
var password: String,
val name: String = "Lê Quang Dũng",
var age: Int = 19,
) : Serializable
14 changes: 14 additions & 0 deletions app/src/main/java/com/sudo/androidd20/data/UserDao.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.sudo.androidd20.data

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query

@Dao
interface UserDao {
@Insert
fun insertUser(vararg user: User)

@Query("SELECT * FROM User ")
fun getAllUsers(): List<User>
}
33 changes: 33 additions & 0 deletions app/src/main/java/com/sudo/androidd20/data/UserDataBase.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.sudo.androidd20.data

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(entities = [User::class], version = 1)
abstract class UserDataBase : RoomDatabase() {
abstract fun userDao(): UserDao

companion object {
// Singleton prevents multiple instances of database opening at the
// same time.
@Volatile
private var INSTANCE: UserDataBase? = null

fun getDatabase(context: Context): UserDataBase {
// if the INSTANCE is not null, then return it,
// if it is, then create the database
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
UserDataBase::class.java,
"word_database"
).build()
INSTANCE = instance
// return instance
instance
}
}
}
}
108 changes: 108 additions & 0 deletions app/src/main/java/com/sudo/androidd20/fragment/LogInFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package com.sudo.androidd20.fragment

import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.setFragmentResultListener
import com.sudo.androidd20.LoginActivity
import com.sudo.androidd20.MainActivity
import com.sudo.androidd20.R
import com.sudo.androidd20.data.User
import com.sudo.androidd20.databinding.FragmentLoginBinding

class LogInFragment : Fragment() {
private lateinit var binding: FragmentLoginBinding

// private val loginModel: LoginModel by activityViewModels()
private lateinit var listUser: MutableList<User>

// interface GetUsersListListener {
// fun getUsersList(): MutableList<User>
// }
//
// private lateinit var getUsersListListener: GetUsersListListener
//
// override fun onAttach(context: Context) {
// super.onAttach(context)
// getUsersListListener = context as GetUsersListListener
// }

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentLoginBinding.inflate(inflater, container, false)

//tạo setFragmentResultListener để lắng nghe kết quả trả về (dưới dạng Bundle)
setFragmentResultListener("result_to_fragment_login") { _, bundle ->
//Sau khi lấy được dữ liệu trả về sẽ xử lý và gán username cho phần ô nhập
val result = bundle.get("userName")
binding.edtEnterEmail.setText(result.toString())
}

setOnClick()

return binding.root
}

private fun setOnClick() {
binding.apply {
tvSignUp.setOnClickListener {
changeToSignUpFragment()
}

btnLogin.setOnClickListener {
login()
}
}
}

private fun changeToSignUpFragment() {
//với transaction
parentFragmentManager.apply {
beginTransaction()
.replace(R.id.fragment_container, SignUpFragment())
.addToBackStack(null)
.commit()
}

//Với nav graph
//findNavController().navigate(R.id.action_logInFragment_to_signUpFragment)
}

private fun login() {
// loginModel.users.observe(viewLifecycleOwner, Observer<MutableList<User>> {
// listUser = it
// Log.i("LoginModel", "$it")
// })

// listUser = getUsersListListener.getUsersList()
listUser = (activity as LoginActivity).getUsersList()

val enteredEmail = binding.edtEnterEmail.text.toString()
val enteredPassword = binding.edtEnterPassword.text.toString()

if (enteredEmail != "" && enteredPassword != "") {
for (user in listUser) {
try {
if ((user.userName == enteredEmail || user.email == enteredEmail) && user.password == enteredPassword) {
val intent = Intent(context, MainActivity::class.java)
val bundle = Bundle()

bundle.putSerializable("userData", user)
intent.putExtras(bundle)

startActivity(intent)

activity?.finish()
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Biết dùng activity để finish mà k biết biết dùng activity để lấy dữ liệu từ activity cha à?

}
} catch (e: Exception) {
throw e
}
}
}
}
}
Loading