diff --git a/app/build.gradle b/app/build.gradle index 749a2cb..76066e7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,4 +49,14 @@ dependencies { testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + + // ConcatAdapter + implementation "androidx.recyclerview:recyclerview:1.3.0" + + // ViewModel 사용하기 + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1" + + // ViewModel 생성함수를 편하게 사용하고 싶다면? + implementation "androidx.fragment:fragment-ktx:1.5.7" + implementation "androidx.activity:activity-ktx:1.7.1" } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fcec636..7f65109 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> if (result.resultCode == RESULT_OK) { - user = result.data?.getParcelable(IntentKey.USER_DATA, User::class.java) - Log.d("user", "---------\n$user") showShortSnackbar(binding.root, getString(R.string.login_success_sign_up_msg)) } } @@ -68,28 +68,9 @@ class LoginActivity : AppCompatActivity() { } } - private fun saveUserInformation() { - val sharedPreference = getSharedPreferences(KEY_PREFS, 0) - val editor = sharedPreference.edit() - editor.putString(KEY_ID, user?.id) - editor.putString(KEY_PASSWORD, user?.password) - editor.putString(KEY_NAME, user?.name) - editor.putString(KEY_SPECIALTY, user?.specialty) - editor.apply() - } - private fun autoLogin() { - val sharedPreferences = getSharedPreferences(KEY_PREFS, 0) - - if (sharedPreferences.contains(KEY_ID) || sharedPreferences.contains(KEY_PASSWORD)) { - user = User( - sharedPreferences.getString(KEY_ID, ""), - sharedPreferences.getString(KEY_PASSWORD, ""), - sharedPreferences.getString(KEY_NAME, ""), - sharedPreferences.getString(KEY_SPECIALTY, "") - ) + if (SoptApplication.prefs.getBoolean(KEY_ISLOGIN, false)) { val intent = Intent(this, MainActivity::class.java) - intent.putExtra(IntentKey.USER_DATA, user) startActivity(intent) showShortToast(getString(R.string.login_success_login_msg)) if (!isFinishing) finish() @@ -97,10 +78,8 @@ class LoginActivity : AppCompatActivity() { } companion object { - private const val KEY_PREFS = "autoLogin" + private const val KEY_ISLOGIN = "isLogin" private const val KEY_ID = "id" private const val KEY_PASSWORD = "password" - private const val KEY_NAME = "name" - private const val KEY_SPECIALTY = "specialty" } } diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/MainActivity.kt b/app/src/main/java/org/android/go/sopt/presentation/main/MainActivity.kt index 4ccb2e1..2ba60e2 100644 --- a/app/src/main/java/org/android/go/sopt/presentation/main/MainActivity.kt +++ b/app/src/main/java/org/android/go/sopt/presentation/main/MainActivity.kt @@ -1,17 +1,14 @@ package org.android.go.sopt.presentation.main -import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.fragment.app.Fragment -import org.android.go.sopt.GalleryFragment -import org.android.go.sopt.HomeFragment import org.android.go.sopt.R -import org.android.go.sopt.SearchFragment -import org.android.go.sopt.data.User import org.android.go.sopt.databinding.ActivityMainBinding -import org.android.go.sopt.util.IntentKey -import org.android.go.sopt.util.getParcelable +import org.android.go.sopt.presentation.main.gallery.GalleryFragment +import org.android.go.sopt.presentation.main.home.HomeFragment +import org.android.go.sopt.presentation.main.mypage.MyPageFragment +import org.android.go.sopt.presentation.main.search.SearchFragment class MainActivity : AppCompatActivity() { @@ -21,41 +18,54 @@ class MainActivity : AppCompatActivity() { binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) -// val currentFragment = supportFragmentManager.findFragmentById(R.id.fcv_main) -// if (currentFragment == null) { -// supportFragmentManager.beginTransaction().add(R.id.fcv_main, HomeFragment()).commit() -// } -// binding.bnvMain.setOnItemSelectedListener { item -> -// when (item.itemId) { -// R.id.menu_home -> { -// HomeFragment() -// return@setOnItemSelectedListener true -// } -// R.id.menu_search -> { -// SearchFragment() -// return@setOnItemSelectedListener true -// } -// else -> { -// GalleryFragment() -// return@setOnItemSelectedListener true -// -// } -// } -// } - - this.getUserData() + this.initLayout() + this.goToTop() } - private fun getUserData() { - val user: User? = intent.getParcelable(IntentKey.USER_DATA, User::class.java) - binding.tvMainName.text = "이름 : ${user?.name}" - binding.tvMainSpecialty.text = "특기 : ${user?.specialty}" + + + private fun initLayout() { + val currentFragment = supportFragmentManager.findFragmentById(R.id.fcv_main) + if (currentFragment == null) { + supportFragmentManager.beginTransaction().add(R.id.fcv_main, HomeFragment()).commit() + } + binding.bnvMain.setOnItemSelectedListener { item -> + when (item.itemId) { + R.id.menu_home -> { + this.changeFragment(HomeFragment()) + } + R.id.menu_search -> { + this.changeFragment(SearchFragment()) + } + R.id.menu_gallery -> { + this.changeFragment(GalleryFragment()) + } + else -> { + this.changeFragment(MyPageFragment()) + } + } + return@setOnItemSelectedListener true + } + } + + + private fun changeFragment(fragment: Fragment) { + supportFragmentManager + .beginTransaction() + .replace(R.id.fcv_main, fragment) + .commit() } -// private fun changeFragment(fragment: Fragment) { -// supportFragmentManager -// .beginTransaction() -// .replace(R.id.fcv_main, fragment) -// .commit() -// } + private fun goToTop(){ + binding.bnvMain.setOnItemReselectedListener { + when(it.itemId){ + R.id.menu_home -> { + val currentFragment = supportFragmentManager.findFragmentById(R.id.fcv_main) + if(currentFragment is HomeFragment){ + currentFragment.scrollToTop() + } + } + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/gallery/GalleryFragment.kt b/app/src/main/java/org/android/go/sopt/presentation/main/gallery/GalleryFragment.kt new file mode 100644 index 0000000..2c57002 --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/presentation/main/gallery/GalleryFragment.kt @@ -0,0 +1,32 @@ +package org.android.go.sopt.presentation.main.gallery + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import org.android.go.sopt.databinding.FragmentGalleryBinding + +class GalleryFragment : Fragment() { + private var _binding: FragmentGalleryBinding? = null + private val binding: FragmentGalleryBinding + get() = requireNotNull(_binding) { "앗!_binding이 null이다!" } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentGalleryBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + } + + override fun onDestroy() { + super.onDestroy() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/home/DogAdapter.kt b/app/src/main/java/org/android/go/sopt/presentation/main/home/DogAdapter.kt new file mode 100644 index 0000000..cf5e31f --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/presentation/main/home/DogAdapter.kt @@ -0,0 +1,42 @@ +package org.android.go.sopt.presentation.main.home + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import org.android.go.sopt.data.Dog +import org.android.go.sopt.databinding.ItemDogBinding + +class DogAdapter(context: Context) : ListAdapter(DogDiffCallback()) { + private val inflater by lazy { LayoutInflater.from(context) } + + class DogViewHolder(private val binding: ItemDogBinding) : + RecyclerView.ViewHolder(binding.root) { + fun onBind(dog: Dog) { + binding.ivDogImage.setImageDrawable(binding.root.context.getDrawable(dog.image)) + binding.tvDogName.text = dog.name + binding.tvDogSize.text = dog.size + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DogViewHolder { + val binding = ItemDogBinding.inflate(inflater, parent, false) + return DogViewHolder(binding) + } + + override fun onBindViewHolder(holder: DogViewHolder, position: Int) { + holder.onBind(getItem(position)) + } +} + +class DogDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: Dog, newItem: Dog): Boolean { + return oldItem.name == newItem.name + } + + override fun areContentsTheSame(oldItem: Dog, newItem: Dog): Boolean { + return oldItem == newItem + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeFragment.kt b/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeFragment.kt new file mode 100644 index 0000000..e55429d --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeFragment.kt @@ -0,0 +1,44 @@ +package org.android.go.sopt.presentation.main.home + +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.viewModels +import androidx.recyclerview.widget.ConcatAdapter +import org.android.go.sopt.databinding.FragmentHomeBinding + +class HomeFragment : Fragment() { + private var _binding: FragmentHomeBinding? = null + private val binding: FragmentHomeBinding + get() = requireNotNull(_binding) { "앗!_binding이 null이다!" } + + private val viewModel by viewModels() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentHomeBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val titleAdapter = TitleAdapter(requireContext()) + val dogAdapter = DogAdapter(requireContext()) + dogAdapter.submitList(viewModel.mockDogList) + binding.rvHomeDog.adapter = ConcatAdapter(titleAdapter, dogAdapter) + } + + override fun onDestroy() { + super.onDestroy() + _binding = null + } + + fun scrollToTop() { + binding.rvHomeDog.smoothScrollToPosition(0) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeViewModel.kt b/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeViewModel.kt new file mode 100644 index 0000000..bfe4ad6 --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/presentation/main/home/HomeViewModel.kt @@ -0,0 +1,24 @@ +package org.android.go.sopt.presentation.main.home + +import androidx.lifecycle.ViewModel +import org.android.go.sopt.R +import org.android.go.sopt.data.Dog + +class HomeViewModel: ViewModel() { + val mockDogList = listOf( + Dog("포메라니안", R.drawable.img_pomeranian, SIZE_SMALL), + Dog("말티즈", R.drawable.img_maltese, SIZE_SMALL), + Dog("토이 푸들", R.drawable.img_toy_poodle, SIZE_SMALL), + Dog("웰시코기", R.drawable.img_welshi_corgi, SIZE_MEDIUM), + Dog("진돗개", R.drawable.img_jindo, SIZE_MEDIUM), + Dog("비글", R.drawable.img_beagle, SIZE_MEDIUM), + Dog("골든 리트리버", R.drawable.img_golden_retriever, SIZE_LARGE), + Dog("셰퍼드", R.drawable.img_shepherd, SIZE_LARGE) + ) + + companion object { + private const val SIZE_SMALL = "소형견" + private const val SIZE_MEDIUM = "중형견" + private const val SIZE_LARGE = "대형견" + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/home/TitleAdapter.kt b/app/src/main/java/org/android/go/sopt/presentation/main/home/TitleAdapter.kt new file mode 100644 index 0000000..a16cf34 --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/presentation/main/home/TitleAdapter.kt @@ -0,0 +1,25 @@ +package org.android.go.sopt.presentation.main.home + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.android.go.sopt.databinding.ItemTitleBinding + +class TitleAdapter(context: Context): RecyclerView.Adapter() { + private val inflater by lazy { LayoutInflater.from(context) } + + class TitleViewHolder(private val binding: ItemTitleBinding): RecyclerView.ViewHolder(binding.root) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TitleViewHolder { + val binding = ItemTitleBinding.inflate(inflater, parent, false) + return TitleViewHolder(binding) + } + + override fun getItemCount(): Int = 1 + + override fun onBindViewHolder(holder: TitleViewHolder, position: Int) { + + } +} + diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/mypage/MyPageFragment.kt b/app/src/main/java/org/android/go/sopt/presentation/main/mypage/MyPageFragment.kt new file mode 100644 index 0000000..b8ecd21 --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/presentation/main/mypage/MyPageFragment.kt @@ -0,0 +1,69 @@ +package org.android.go.sopt.presentation.main.mypage + +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 org.android.go.sopt.databinding.FragmentMyPageBinding +import org.android.go.sopt.SoptApplication +import org.android.go.sopt.presentation.login.LoginActivity + +class MyPageFragment : Fragment() { + private var _binding: FragmentMyPageBinding? = null + private val binding: FragmentMyPageBinding + get() = requireNotNull(_binding) { "binding이 null이다!" } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentMyPageBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + this.logout() + this.withdrawal() + + binding.tvMyPageName.text = "이름 : ${SoptApplication.prefs.getString(KEY_NAME, "")}" + binding.tvMyPageSpecialty.text = "특기 : ${SoptApplication.prefs.getString(KEY_SPECIALTY, "")}" + } + + override fun onDestroy() { + super.onDestroy() + _binding = null + } + + private fun logout() { + binding.btMyPageLogout.setOnClickListener { + val intent = Intent(activity, LoginActivity::class.java) + SoptApplication.prefs.setBoolean(KEY_ISLOGIN, false) + startActivity(intent) + finishFragment() + } + } + + private fun withdrawal() { + binding.btMyPageWithdrawal.setOnClickListener { + val intent = Intent(activity, LoginActivity::class.java) + SoptApplication.prefs.deleteUserInformation() + startActivity(intent) + finishFragment() + } + } + + private fun finishFragment(){ + if(!this.requireActivity().isFinishing) this.requireActivity().finish() + } + + companion object { + private const val KEY_ISLOGIN = "isLogin" + private const val KEY_NAME = "name" + private const val KEY_SPECIALTY = "specialty" + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/presentation/main/search/SearchFragment.kt b/app/src/main/java/org/android/go/sopt/presentation/main/search/SearchFragment.kt new file mode 100644 index 0000000..56415c6 --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/presentation/main/search/SearchFragment.kt @@ -0,0 +1,34 @@ +package org.android.go.sopt.presentation.main.search + +import android.content.Context +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import org.android.go.sopt.databinding.FragmentSearchBinding + +class SearchFragment : Fragment() { + private var _binding: FragmentSearchBinding? = null + private val binding: FragmentSearchBinding + get() = requireNotNull(_binding) { "앗! binding이 null이다!" } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + // fragment에서 binding은 activity랑 다름. 한 번 찾아보기 + _binding = FragmentSearchBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + } + + override fun onDestroy() { + super.onDestroy() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/presentation/signup/SignUpActivity.kt b/app/src/main/java/org/android/go/sopt/presentation/signup/SignUpActivity.kt index 13ec7c3..4f8b908 100644 --- a/app/src/main/java/org/android/go/sopt/presentation/signup/SignUpActivity.kt +++ b/app/src/main/java/org/android/go/sopt/presentation/signup/SignUpActivity.kt @@ -6,8 +6,8 @@ import android.os.Bundle import org.android.go.sopt.R import org.android.go.sopt.data.User import org.android.go.sopt.databinding.ActivitySignUpBinding +import org.android.go.sopt.SoptApplication import org.android.go.sopt.presentation.login.LoginActivity -import org.android.go.sopt.util.IntentKey import org.android.go.sopt.util.hideKeyboard import org.android.go.sopt.util.showShortToast @@ -30,28 +30,26 @@ class SignUpActivity : AppCompatActivity() { private fun onClickComplete() { with(binding) { btSignupComplete.setOnClickListener { - val id = etSignupId.text - val password = etSignupPassword.text - val name = etSignupName.text - val specialty = etSignupSpecialty.text - - if (id.length !in 6..10) { + val user = User( + etSignupId.text.toString(), + etSignupPassword.text.toString(), + etSignupName.text.toString(), + etSignupSpecialty.text.toString(), + ) + + if (user.id?.length !in 6..10) { showShortToast(getString(R.string.sign_up_id_err_msg)) - } else if (password.length !in 8..12) { + } else if (user.password?.length !in 8..12) { showShortToast(getString(R.string.sign_up_password_err_msg)) - } else if (name.isEmpty()) { + } else if (user.name?.isEmpty() == true) { showShortToast(getString(R.string.sign_up_name_err_msg)) - } else if (specialty.isEmpty()) { + } else if (user.specialty?.isEmpty() == true) { showShortToast(getString(R.string.sign_up_specialty_err_msg)) } else { val intent = Intent(this@SignUpActivity, LoginActivity::class.java) - intent.putExtra( - IntentKey.USER_DATA, User( - id.toString(), - password.toString(), - name.toString(), - specialty.toString() - ) + SoptApplication.prefs.saveUserInformation( + false, + user ) setResult(RESULT_OK, intent) // 만약 종료가 되지 않았다면 종료시키기 diff --git a/app/src/main/java/org/android/go/sopt/util/UserSharedPreferences.kt b/app/src/main/java/org/android/go/sopt/util/UserSharedPreferences.kt new file mode 100644 index 0000000..a70a5ab --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/util/UserSharedPreferences.kt @@ -0,0 +1,80 @@ +package org.android.go.sopt.util + +import android.annotation.SuppressLint +import android.content.Context +import android.content.SharedPreferences +import androidx.core.content.edit +import org.android.go.sopt.data.User + +class UserSharedPreferences(context: Context) { + private val prefs: SharedPreferences = context.getSharedPreferences(KEY_PREFS, 0) + + // 안드로이드 ktx 사용 + fun getString(key: String, defValue: String?): String { + return prefs.getString(key, defValue).toString() + } + + fun setString(key: String, value: String?) { + prefs.edit { setString(key, value) } + } + + fun getBoolean(key: String, defValue: Boolean): Boolean { + return prefs.getBoolean(key, defValue) + } + + fun setBoolean(key: String, value: Boolean) { + prefs.edit { setBoolean(key, value) } + } + + fun saveUserInformation( + isLogin: Boolean, + user: User + ) { + setBoolean(KEY_ISLOGIN, isLogin) + setString(KEY_ID, user.id) + setString(KEY_PASSWORD, user.password) + setString(KEY_NAME, user.name) + setString(KEY_SPECIALTY, user.specialty) + } + + fun deleteUserInformation() = prefs.edit { clear() } + + +// fun getString(key: String, defValue: String?): String { +// return prefs.getString(key, defValue).toString() +// } +// +// fun setString(key: String, value: String?) { +// prefs.edit().putString(key, value).apply() +// } +// +// fun getBoolean(key: String, defValue: Boolean): Boolean { +// return prefs.getBoolean(key, defValue) +// } +// +// fun setBoolean(key: String, value: Boolean) { +// prefs.edit().putBoolean(key, value).apply() +// } +// +// fun saveUserInformation( +// isLogin: Boolean, +// user: User +// ) { +// setBoolean(KEY_ISLOGIN, isLogin) +// setString(KEY_ID, user.id) +// setString(KEY_PASSWORD, user.password) +// setString(KEY_NAME, user.name) +// setString(KEY_SPECIALTY, user.specialty) +// } +// +// fun deleteUserInformation() = prefs.edit().clear().apply() + + companion object { + private const val KEY_PREFS = "userInfo" + private const val KEY_ISLOGIN = "isLogin" + private const val KEY_ID = "id" + private const val KEY_PASSWORD = "password" + private const val KEY_NAME = "name" + private const val KEY_SPECIALTY = "specialty" + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_gallery.xml b/app/src/main/res/drawable/ic_gallery.xml new file mode 100644 index 0000000..35960a0 --- /dev/null +++ b/app/src/main/res/drawable/ic_gallery.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_home.xml b/app/src/main/res/drawable/ic_home.xml new file mode 100644 index 0000000..5a870f5 --- /dev/null +++ b/app/src/main/res/drawable/ic_home.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_mypage.xml b/app/src/main/res/drawable/ic_mypage.xml new file mode 100644 index 0000000..98730cd --- /dev/null +++ b/app/src/main/res/drawable/ic_mypage.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000..a5687c6 --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/img_beagle.jpg b/app/src/main/res/drawable/img_beagle.jpg new file mode 100644 index 0000000..52d21c7 Binary files /dev/null and b/app/src/main/res/drawable/img_beagle.jpg differ diff --git a/app/src/main/res/drawable/img_golden_retriever.jpg b/app/src/main/res/drawable/img_golden_retriever.jpg new file mode 100644 index 0000000..a97d8c3 Binary files /dev/null and b/app/src/main/res/drawable/img_golden_retriever.jpg differ diff --git a/app/src/main/res/drawable/img_jindo.jpg b/app/src/main/res/drawable/img_jindo.jpg new file mode 100644 index 0000000..5186356 Binary files /dev/null and b/app/src/main/res/drawable/img_jindo.jpg differ diff --git a/app/src/main/res/drawable/img_maltese.jpg b/app/src/main/res/drawable/img_maltese.jpg new file mode 100644 index 0000000..258fa86 Binary files /dev/null and b/app/src/main/res/drawable/img_maltese.jpg differ diff --git a/app/src/main/res/drawable/img_pomeranian.jpeg b/app/src/main/res/drawable/img_pomeranian.jpeg new file mode 100644 index 0000000..4f5c587 Binary files /dev/null and b/app/src/main/res/drawable/img_pomeranian.jpeg differ diff --git a/app/src/main/res/drawable/img_samoyed.jpg b/app/src/main/res/drawable/img_samoyed.jpg new file mode 100644 index 0000000..9f2516d Binary files /dev/null and b/app/src/main/res/drawable/img_samoyed.jpg differ diff --git a/app/src/main/res/drawable/img_shepherd.jpg b/app/src/main/res/drawable/img_shepherd.jpg new file mode 100644 index 0000000..e74188e Binary files /dev/null and b/app/src/main/res/drawable/img_shepherd.jpg differ diff --git a/app/src/main/res/drawable/img_toy_poodle.jpeg b/app/src/main/res/drawable/img_toy_poodle.jpeg new file mode 100644 index 0000000..782ed95 Binary files /dev/null and b/app/src/main/res/drawable/img_toy_poodle.jpeg differ diff --git a/app/src/main/res/drawable/img_welshi_corgi.jpeg b/app/src/main/res/drawable/img_welshi_corgi.jpeg new file mode 100644 index 0000000..0204fb9 Binary files /dev/null and b/app/src/main/res/drawable/img_welshi_corgi.jpeg differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e025c6d..f07c763 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,37 +4,25 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingTop="30dp" tools:context=".presentation.main.MainActivity"> - - - + + - - + app:layout_constraintBottom_toBottomOf="parent" + app:menu="@menu/menu_main"/> + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_gallery.xml b/app/src/main/res/layout/fragment_gallery.xml new file mode 100644 index 0000000..8a3eb88 --- /dev/null +++ b/app/src/main/res/layout/fragment_gallery.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..7394746 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_my_page.xml b/app/src/main/res/layout/fragment_my_page.xml new file mode 100644 index 0000000..b05e39f --- /dev/null +++ b/app/src/main/res/layout/fragment_my_page.xml @@ -0,0 +1,57 @@ + + + + + + + +