diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0724e24..c7f3960 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,10 +1,12 @@ + xmlns:tools="http://schemas.android.com/tools"> + + + tools:targetApi="31"> + + + - + android:foregroundServiceType="mediaPlayback" + android:permission="TODO" /> + android:exported="true"> @@ -36,8 +45,7 @@ android:name="com.example.umc_9th.MainActivity" android:exported="true" android:label="@string/app_name" - android:theme="@style/Theme.UMC_9th" > - + android:theme="@style/Theme.UMC_9th" /> diff --git a/app/src/main/java/com/example/umc_9th/AlbumFragment.kt b/app/src/main/java/com/example/umc_9th/AlbumFragment.kt index 4875c80..4fca795 100644 --- a/app/src/main/java/com/example/umc_9th/AlbumFragment.kt +++ b/app/src/main/java/com/example/umc_9th/AlbumFragment.kt @@ -7,11 +7,15 @@ import android.view.View import android.view.ViewGroup import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayoutMediator +import com.google.firebase.database.DatabaseReference +import com.google.firebase.database.FirebaseDatabase import umc.study.umc_9th.R import umc.study.umc_9th.databinding.FragmentAlbumBinding class AlbumFragment : Fragment() { private lateinit var binding : FragmentAlbumBinding + private lateinit var uid: String + private lateinit var userAlbumRef : DatabaseReference override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -39,7 +43,13 @@ class AlbumFragment : Fragment() { else -> "" } }.attach() - + uid = loginStorage(requireContext()).getUid().toString() + userAlbumRef = FirebaseDatabase.getInstance().getReference("users").child(uid).child("albums") + binding.albumLike.setOnClickListener { + userAlbumRef.child(binding.albumTitle.text.toString()).child("title").setValue(binding.albumTitle.text.toString()) + userAlbumRef.child(binding.albumTitle.text.toString()).child("singer").setValue(binding.albumSinger.text.toString()) + binding.albumLike.setImageResource(R.drawable.ic_my_like_on) + } return binding.root } diff --git a/app/src/main/java/com/example/umc_9th/LockerFragment.kt b/app/src/main/java/com/example/umc_9th/LockerFragment.kt index 8d6cdbb..70f98b9 100644 --- a/app/src/main/java/com/example/umc_9th/LockerFragment.kt +++ b/app/src/main/java/com/example/umc_9th/LockerFragment.kt @@ -1,16 +1,20 @@ package com.example.umc_9th +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.viewpager2.widget.ViewPager2 +import com.example.umc_9th.HomeFragment.OnAlbumButtonClickListener import com.google.android.material.tabs.TabLayoutMediator import umc.study.umc_9th.databinding.FragmentLockerBinding class LockerFragment : Fragment() { private lateinit var binding : FragmentLockerBinding + private var listener: OnAlbumButtonClickListener? = null + private lateinit var uidStorage : loginStorage override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -27,6 +31,21 @@ class LockerFragment : Fragment() { else -> "" } }.attach() + uidStorage = loginStorage(requireContext()) + if(uidStorage.getUid() != "") { + binding.gotoLogin.text = "로그아웃" + } + else { + binding.gotoLogin.text = "로그인" + } + binding.gotoLogin.setOnClickListener { + if(uidStorage.getUid() == "") startActivity(Intent(requireActivity(), LoginActivity::class.java)) + else { + uidStorage.setUid("") + binding.gotoLogin.text = "로그인" + } + } + return binding.root } diff --git a/app/src/main/java/com/example/umc_9th/LoginActivity.kt b/app/src/main/java/com/example/umc_9th/LoginActivity.kt new file mode 100644 index 0000000..8471775 --- /dev/null +++ b/app/src/main/java/com/example/umc_9th/LoginActivity.kt @@ -0,0 +1,70 @@ +package com.example.umc_9th + +import android.content.Intent +import android.os.Bundle +import android.text.InputType +import android.util.Log +import android.widget.Toast +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import com.google.firebase.database.DataSnapshot +import com.google.firebase.database.DatabaseError +import com.google.firebase.database.FirebaseDatabase +import com.google.firebase.database.ValueEventListener +import com.google.firebase.database.getValue +import umc.study.umc_9th.R +import umc.study.umc_9th.databinding.ActivityLoginBinding +import umc.study.umc_9th.databinding.ActivitySignUpBinding + +class LoginActivity : AppCompatActivity() { + private val userRef = FirebaseDatabase.getInstance().getReference("users") + private lateinit var binding : ActivityLoginBinding + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityLoginBinding.inflate(layoutInflater) + setContentView(binding.root) + + binding.loginButton.setOnClickListener { + val inpId = binding.idToLogin.text.toString() + var inpPwd = binding.PwdToLogin.text.toString() + val query = userRef.orderByChild("id").equalTo(inpId) + + query.addListenerForSingleValueEvent(object : ValueEventListener { + override fun onDataChange(snapshot: DataSnapshot) { + if (snapshot.exists()) { + for (child in snapshot.children) { + if(child.child("password").value == inpPwd) Login(child.key.toString()) + else Toast.makeText(applicationContext, "사용자 데이터가 없습니다", Toast.LENGTH_SHORT).show() + } + } else { + Toast.makeText(applicationContext, "사용자 데이터가 없습니다", Toast.LENGTH_SHORT).show() + } + } + override fun onCancelled(error: DatabaseError) { + Log.e("RealtimeDB", "쿼리 실패", error.toException()) + } + }) + + } + binding.lookPwd.setOnClickListener { + if(binding.PwdToLogin.inputType == InputType.TYPE_TEXT_VARIATION_PASSWORD) { + binding.PwdToLogin.inputType = InputType.TYPE_CLASS_TEXT + binding.lookPwd.setImageResource(R.drawable.btn_input_password_off) + } + else { + binding.PwdToLogin.inputType = InputType.TYPE_TEXT_VARIATION_PASSWORD + binding.lookPwd.setImageResource(R.drawable.btn_input_password) + } + } + binding.gotoSignup.setOnClickListener { + startActivity(Intent(this, SignUpActivity::class.java)) + } + } + fun Login(id : String) { + val uidStorage = loginStorage(this) + uidStorage.setUid(id) + finish(); + } +} diff --git a/app/src/main/java/com/example/umc_9th/MainActivity.kt b/app/src/main/java/com/example/umc_9th/MainActivity.kt index 85faa95..fe203cc 100644 --- a/app/src/main/java/com/example/umc_9th/MainActivity.kt +++ b/app/src/main/java/com/example/umc_9th/MainActivity.kt @@ -110,7 +110,12 @@ class MainActivity : AppCompatActivity(), HomeFragment.OnAlbumButtonClickListene .commit() true } - + R.id.Search -> { + supportFragmentManager.beginTransaction() + .replace(R.id.fragmentContainerView, SearchFragment()) + .commit() + true + } R.id.Locker -> { supportFragmentManager.beginTransaction() .replace(R.id.fragmentContainerView, LockerFragment()) diff --git a/app/src/main/java/com/example/umc_9th/SearchFragment.kt b/app/src/main/java/com/example/umc_9th/SearchFragment.kt new file mode 100644 index 0000000..4c90be9 --- /dev/null +++ b/app/src/main/java/com/example/umc_9th/SearchFragment.kt @@ -0,0 +1,26 @@ +package com.example.umc_9th + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.viewpager2.widget.ViewPager2 +import com.google.android.material.tabs.TabLayoutMediator +import com.google.firebase.database.DatabaseReference +import com.google.firebase.database.FirebaseDatabase +import umc.study.umc_9th.R +import umc.study.umc_9th.databinding.FragmentAlbumBinding +import umc.study.umc_9th.databinding.FragmentSearchBinding + +class SearchFragment : Fragment() { + private lateinit var binding : FragmentSearchBinding + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentSearchBinding.inflate(layoutInflater) + return binding.root + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/umc_9th/SignUpActivity.kt b/app/src/main/java/com/example/umc_9th/SignUpActivity.kt new file mode 100644 index 0000000..c8e0fec --- /dev/null +++ b/app/src/main/java/com/example/umc_9th/SignUpActivity.kt @@ -0,0 +1,56 @@ +package com.example.umc_9th + +import android.os.Bundle +import android.text.InputType +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import com.google.firebase.database.FirebaseDatabase +import umc.study.umc_9th.R +import umc.study.umc_9th.databinding.ActivitySignUpBinding + +class SignUpActivity : AppCompatActivity() { + + private val userRef = FirebaseDatabase.getInstance().getReference("users") + private lateinit var binding : ActivitySignUpBinding + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivitySignUpBinding.inflate(layoutInflater) + setContentView(binding.root) + + binding.signinBtn.setOnClickListener { + if(binding.idToSignup.text.toString() != "") { + if(binding.pwdToSignup.text.toString() == binding.pwdVerify.text.toString()) { + CreateNewAccount(binding.idToSignup.text.toString(),binding.pwdToSignup.text.toString() ) + } + } + } + binding.lookPwda.setOnClickListener { + if(binding.pwdToSignup.inputType == InputType.TYPE_TEXT_VARIATION_PASSWORD) { + binding.pwdToSignup.inputType = InputType.TYPE_CLASS_TEXT + binding.lookPwda.setImageResource(R.drawable.btn_input_password_off) + } + else { + binding.pwdToSignup.inputType = InputType.TYPE_TEXT_VARIATION_PASSWORD + binding.lookPwda.setImageResource(R.drawable.btn_input_password) + } + } + binding.lookPwdb.setOnClickListener { + if(binding.pwdVerify.inputType == InputType.TYPE_TEXT_VARIATION_PASSWORD) { + binding.pwdVerify.inputType = InputType.TYPE_CLASS_TEXT + binding.lookPwdb.setImageResource(R.drawable.btn_input_password_off) + } + else { + binding.pwdVerify.inputType = InputType.TYPE_TEXT_VARIATION_PASSWORD + binding.lookPwdb.setImageResource(R.drawable.btn_input_password) + } + } + + } + fun CreateNewAccount(id : String, password : String) { + userRef.child("sampleID").child("id").setValue(id) + userRef.child("sampleID").child("password").setValue(password) + finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/umc_9th/SongActivity.kt b/app/src/main/java/com/example/umc_9th/SongActivity.kt index 6cce79c..1487af2 100644 --- a/app/src/main/java/com/example/umc_9th/SongActivity.kt +++ b/app/src/main/java/com/example/umc_9th/SongActivity.kt @@ -21,8 +21,8 @@ import umc.study.umc_9th.databinding.ActivitySongBinding class SongActivity : AppCompatActivity() { - private val uid = "asdfqwer1234" - private val userSongsRef = FirebaseDatabase.getInstance().getReference("songs").child(uid) + private val uid: String = loginStorage(this).getUid().toString() + private val userSongsRef = FirebaseDatabase.getInstance().getReference(uid).child("songs") private lateinit var binding: ActivitySongBinding private var songID: Int = 0 diff --git a/app/src/main/java/com/example/umc_9th/entitiy/UserEntity.kt b/app/src/main/java/com/example/umc_9th/entitiy/UserEntity.kt new file mode 100644 index 0000000..a54c02f --- /dev/null +++ b/app/src/main/java/com/example/umc_9th/entitiy/UserEntity.kt @@ -0,0 +1,6 @@ +package com.example.umc_9th.entitiy + +data class UserEntity( + var id: String, + var password: String +) diff --git a/app/src/main/java/com/example/umc_9th/loginStorage.kt b/app/src/main/java/com/example/umc_9th/loginStorage.kt new file mode 100644 index 0000000..14d089f --- /dev/null +++ b/app/src/main/java/com/example/umc_9th/loginStorage.kt @@ -0,0 +1,20 @@ +package com.example.umc_9th + +import android.content.Context + +class loginStorage(context: Context) { + private val preferences = context.getSharedPreferences("uid", + Context.MODE_PRIVATE) + + companion object { + private const val uid = "uid" + } + + fun getUid(): String? { + return preferences.getString(uid, "") + } + + fun setUid(_uid : String) { + preferences.edit().putString(uid, _uid).apply() + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..3a3ea7a --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_sign_up.xml b/app/src/main/res/layout/activity_sign_up.xml new file mode 100644 index 0000000..98dff3c --- /dev/null +++ b/app/src/main/res/layout/activity_sign_up.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_album.xml b/app/src/main/res/layout/fragment_album.xml index 650d842..f7448b3 100644 --- a/app/src/main/res/layout/fragment_album.xml +++ b/app/src/main/res/layout/fragment_album.xml @@ -28,7 +28,7 @@ app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@+id/albumLike" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_locker.xml b/app/src/main/res/layout/fragment_locker.xml index bef8efd..c322e58 100644 --- a/app/src/main/res/layout/fragment_locker.xml +++ b/app/src/main/res/layout/fragment_locker.xml @@ -19,7 +19,7 @@ app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph2.xml b/app/src/main/res/navigation/nav_graph2.xml new file mode 100644 index 0000000..7769fe7 --- /dev/null +++ b/app/src/main/res/navigation/nav_graph2.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0ca98a9..9924921 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -19,6 +19,7 @@ activity = "1.8.0" constraintlayoutCompose = "1.0.1" googleGmsGoogleServices = "4.4.4" firebaseDatabase = "22.0.1" +firebaseDatabaseKtx = "22.0.1" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -45,6 +46,7 @@ androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } androidx-constraintlayout-compose = { group = "androidx.constraintlayout", name = "constraintlayout-compose", version.ref = "constraintlayoutCompose" } firebase-database = { group = "com.google.firebase", name = "firebase-database", version.ref = "firebaseDatabase" } +firebase-database-ktx = { group = "com.google.firebase", name = "firebase-database-ktx", version.ref = "firebaseDatabaseKtx" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }