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.

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

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

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.

10 changes: 9 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ android {

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildFeatures {
viewBinding = true
}
buildTypes {
release {
minifyEnabled false
Expand All @@ -29,6 +31,9 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
viewBinding true
}
}

dependencies {
Expand All @@ -37,6 +42,9 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.annotation:annotation:1.2.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
android:supportsRtl="true"
android:theme="@style/Theme.AndroidD20"
tools:targetApi="31">
<activity
android:name=".SecondActivity"
android:exported="false" />
<activity
android:name=".MainActivity"
android:exported="true">
Expand Down
100 changes: 100 additions & 0 deletions app/src/main/java/com/sudo/androidd20/LoginFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package com.sudo.androidd20

import android.content.Intent
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.fragment.app.FragmentResultListener
import com.sudo.androidd20.databinding.FragmentLoginBinding

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
* A simple [Fragment] subclass.
* Use the [LoginFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class LoginFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
private lateinit var binding: FragmentLoginBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}

}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentLoginBinding.inflate(inflater,container,false)
parentFragmentManager.apply {
setFragmentResultListener("result_to_fragment_login",
this@LoginFragment,
FragmentResultListener{_,bundle->
val result = bundle.getSerializable("userName") as User
binding.username.setText(result.email)
})
}
// arguments?.let {
// val result = it.getSerializable("userName") as User
// }
binding.tvSignUp.setOnClickListener{
changeFragment()
}
binding.login.setOnClickListener {
if(binding.username.text.isNullOrEmpty()||binding.password.text.isNullOrEmpty()){
Toast.makeText(context,"Please complete all information", Toast.LENGTH_SHORT).show()
}
else{

val intent = Intent(context,SecondActivity::class.java)
val bundle = Bundle()
bundle.putSerializable("userData",User(binding.username.text.toString(),binding.password.text.toString()))
intent.putExtras(bundle)
activity?.finish()
startActivity(intent)
Toast.makeText(context,"Logged in successfully", Toast.LENGTH_SHORT).show()


}
}
return binding.root
}

private fun changeFragment() {
parentFragmentManager.beginTransaction().replace(R.id.frame_container,RegisterFragment()).addToBackStack(null).commit()
}


companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment LoginFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
LoginFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
}
20 changes: 19 additions & 1 deletion app/src/main/java/com/sudo/androidd20/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,29 @@
package com.sudo.androidd20

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction

class MainActivity : AppCompatActivity() {
private var fragmentManager: FragmentManager? = null
private var fragmentTransaction: FragmentTransaction? = null
Copy link
Owner

Choose a reason for hiding this comment

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

Không cần thiết phải tạo 2 biến này vì mạc định activity đã có rồi

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
addFragment()
}

private fun addFragment() {
val fragment = LoginFragment()
fragmentManager = supportFragmentManager
fragmentTransaction = fragmentManager?.beginTransaction()
fragmentTransaction?.add(
R.id.frame_container,
fragment
)
fragmentTransaction?.commit()
}


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

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 com.sudo.androidd20.databinding.FragmentRegisterBinding

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
* A simple [Fragment] subclass.
* Use the [RegisterFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class RegisterFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
private lateinit var binding: FragmentRegisterBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout for this fragment
binding = FragmentRegisterBinding.inflate(inflater,container,false)
binding.register.setOnClickListener {

signup(binding.username.text.toString(),binding.password.text.toString(),binding.confirmedPassword.text.toString())
}
binding.tvSignIn.setOnClickListener {
parentFragmentManager.popBackStack()
}
return binding.root
}

private fun signup(username: String?, password: String?, confirmedPassword: String?) {
if (username.isNullOrEmpty() || password.isNullOrEmpty() || confirmedPassword.isNullOrEmpty() ) {
Toast.makeText(context,"Please complete all information",Toast.LENGTH_SHORT).show()
}
else if(password.compareTo(confirmedPassword)!=0){
Toast.makeText(context,"Password does not match",Toast.LENGTH_SHORT).show()
}
else{
// (activity as MainActivity).updateUsersList(User(username,password))
Toast.makeText(context,"Create account success",Toast.LENGTH_SHORT).show()
parentFragmentManager.apply {
val bundle = Bundle()
bundle.putSerializable("userName",User(username,password))
setFragmentResult("result_to_fragment_login", bundle)
popBackStack()
}
// val fragmentLogin = LoginFragment()
// val bundle = Bundle()
// fragmentLogin.arguments = bundle
// bundle.putSerializable("userName",User(username,password))
}
}

companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment RegisterFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
RegisterFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
}
17 changes: 17 additions & 0 deletions app/src/main/java/com/sudo/androidd20/SecondActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.sudo.androidd20

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.sudo.androidd20.databinding.ActivitySecondBinding

class SecondActivity : AppCompatActivity() {
private lateinit var binding: ActivitySecondBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
binding = ActivitySecondBinding.inflate(layoutInflater)
setContentView(binding.root)
val user = intent?.extras?.get("userData") as User
binding.username.setText(user.email)
}
}
8 changes: 8 additions & 0 deletions app/src/main/java/com/sudo/androidd20/User.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.sudo.androidd20

import java.io.Serializable

data class User(
var email:String,
var password:String
):Serializable
8 changes: 8 additions & 0 deletions app/src/main/res/drawable/ic_login_background.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="64dp"/>
<solid android:color="@color/teal_200"/>


</shape>
10 changes: 10 additions & 0 deletions app/src/main/res/drawable/login_background.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="90"
android:endColor="#3cdcf3"
android:startColor="@color/white"
/>

</shape>
13 changes: 5 additions & 8 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,10 @@
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />

</androidx.constraintlayout.widget.ConstraintLayout>
Loading