From 5f5b58567f6e5c093fd4fcdfbed3b3dcde0a6796 Mon Sep 17 00:00:00 2001 From: Insaf Date: Mon, 1 Nov 2021 23:25:35 +0300 Subject: [PATCH 1/3] semi-hw-5 --- app/build.gradle | 11 +- app/src/main/AndroidManifest.xml | 2 + .../itis/androidlabproject/MainActivity.kt | 14 ++- .../adapters/PlanetAdapter.kt | 25 +++++ .../adapters/PlanetHolder.kt | 48 +++++++++ .../fragments/DetailsFragment.kt | 43 ++++++++ .../fragments/ListFragment.kt | 48 +++++++++ .../itis/androidlabproject/models/Planet.kt | 11 ++ .../repositories/PlanetRepository.kt | 17 +++ app/src/main/res/layout/activity_main.xml | 12 ++- app/src/main/res/layout/fragment_details.xml | 100 ++++++++++++++++++ app/src/main/res/layout/fragment_list.xml | 21 ++++ app/src/main/res/layout/item_planet.xml | 59 +++++++++++ app/src/main/res/navigation/nav_graph.xml | 26 +++++ 14 files changed, 428 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/itis/androidlabproject/adapters/PlanetAdapter.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/adapters/PlanetHolder.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/fragments/DetailsFragment.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/fragments/ListFragment.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/models/Planet.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/repositories/PlanetRepository.kt create mode 100644 app/src/main/res/layout/fragment_details.xml create mode 100644 app/src/main/res/layout/fragment_list.xml create mode 100644 app/src/main/res/layout/item_planet.xml create mode 100644 app/src/main/res/navigation/nav_graph.xml diff --git a/app/build.gradle b/app/build.gradle index 9bb293e..b315d5f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,13 +36,20 @@ android { } dependencies { + // Navigation + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' + + //Glide + implementation 'com.github.bumptech.glide:glide:4.12.0' + implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.2" implementation 'androidx.core:core-ktx:1.6.0' implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.1' - implementation 'android.arch.navigation:navigation-fragment:2.3.5' - implementation 'android.arch.navigation:navigation-ui:2.3.5' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 69ebd0a..890d1cc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,8 @@ + + , + private val glide: RequestManager, + private val action: (Int) -> Unit +) : RecyclerView.Adapter() { + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): PlanetHolder = PlanetHolder.create(parent, glide, action) + + override fun onBindViewHolder(holder: PlanetHolder, position: Int) { + holder.bind(list[position]) + } + + override fun getItemCount(): Int = list.size; + +} diff --git a/app/src/main/java/com/itis/androidlabproject/adapters/PlanetHolder.kt b/app/src/main/java/com/itis/androidlabproject/adapters/PlanetHolder.kt new file mode 100644 index 0000000..7740cf5 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/adapters/PlanetHolder.kt @@ -0,0 +1,48 @@ +package com.itis.androidlabproject.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.RequestManager +import com.itis.androidlabproject.databinding.ItemPlanetBinding +import com.itis.androidlabproject.models.Planet + +class PlanetHolder( + private val binding: ItemPlanetBinding, + private val action: (Int) -> Unit, + private val glige: RequestManager +) : RecyclerView.ViewHolder(binding.root) { + private var planet: Planet? = null + + init { + itemView.setOnClickListener { + planet?.id?.also(action) + } + } + + fun bind(item: Planet) { + this.planet = item + with(binding) { + tvName.text = item.name + tvAge.text = item.age.toString() + tvDescription.text = item.description + glige.load(item.imageUrl).into(ivImage) + } + } + + companion object { + fun create( + parent: ViewGroup, + glige: RequestManager, + action: (Int) -> Unit + ) = PlanetHolder( + ItemPlanetBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), + action, + glige + ) + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/fragments/DetailsFragment.kt b/app/src/main/java/com/itis/androidlabproject/fragments/DetailsFragment.kt new file mode 100644 index 0000000..790a62b --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/fragments/DetailsFragment.kt @@ -0,0 +1,43 @@ +package com.itis.androidlabproject.fragments + +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.RequiresApi +import androidx.fragment.app.Fragment +import com.itis.androidlabproject.databinding.FragmentDetailsBinding +import com.itis.androidlabproject.models.Planet +import com.itis.androidlabproject.repositories.PlanetRepository +import java.util.* + +class DetailsFragment : Fragment() { + private lateinit var binding: FragmentDetailsBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentDetailsBinding.inflate(inflater, container, false) + + return binding.root + } + + @RequiresApi(Build.VERSION_CODES.N) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + var planet: Optional? = null + arguments?.getInt("id").also { id -> + planet = PlanetRepository.planets.stream().filter { + it.id == id + }.findFirst() + } + if (planet?.isPresent == true) { + binding.tvDetName.text = planet?.get()?.name + binding.tvDetAge.text = planet?.get()?.age.toString() + binding.tvDetDescription.text = planet?.get()?.description + } + } + +} diff --git a/app/src/main/java/com/itis/androidlabproject/fragments/ListFragment.kt b/app/src/main/java/com/itis/androidlabproject/fragments/ListFragment.kt new file mode 100644 index 0000000..dfa9049 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/fragments/ListFragment.kt @@ -0,0 +1,48 @@ +package com.itis.androidlabproject.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import com.bumptech.glide.Glide +import com.google.android.material.snackbar.Snackbar +import com.itis.androidlabproject.R +import com.itis.androidlabproject.adapters.PlanetAdapter +import com.itis.androidlabproject.databinding.FragmentListBinding +import com.itis.androidlabproject.repositories.PlanetRepository + +class ListFragment: Fragment() { + private lateinit var binding: FragmentListBinding + private lateinit var adapter: PlanetAdapter + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentListBinding.inflate(inflater, container, false) + adapter = PlanetAdapter(PlanetRepository.planets, Glide.with(this)) { + showDetails(it); + } + binding.rvPlanets.adapter = adapter + + return binding.root + } + + private fun showDetails(id: Int) { + val bundle = Bundle() + bundle.putInt("id", id) + findNavController().navigate(R.id.action_listFragment_to_detailsFragment) + } + + + private fun showName(name: String) { + Snackbar.make( + binding.root, + "Name: $name", + Snackbar.LENGTH_LONG + ).show() + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/models/Planet.kt b/app/src/main/java/com/itis/androidlabproject/models/Planet.kt new file mode 100644 index 0000000..3ecbcd5 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/models/Planet.kt @@ -0,0 +1,11 @@ +package com.itis.androidlabproject.models + +data class Planet( + var id: Int, + var name: String, + var age: Int, + var imageUrl: String = "", + var description: String = "" +) { + +} diff --git a/app/src/main/java/com/itis/androidlabproject/repositories/PlanetRepository.kt b/app/src/main/java/com/itis/androidlabproject/repositories/PlanetRepository.kt new file mode 100644 index 0000000..b5a7204 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/repositories/PlanetRepository.kt @@ -0,0 +1,17 @@ +package com.itis.androidlabproject.repositories + +import com.itis.androidlabproject.models.Planet + +object PlanetRepository { + val planets = arrayListOf( + Planet(1,"Земля", 434334, "//Glide\n" + + " implementation 'com.github.bumptech.glide:glide:4.12.0'\n" + + " implementation \"com.squareup.okhttp3:okhttp:5.0.0-alpha.2\""), + Planet(2,"Венера", 27455), + Planet(3,"Меркурий", 623532) + ) + + fun getRabbitById(id: Int): Planet { + return this.planets[id-1] + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4fa45b0..ec423e8 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,13 +6,15 @@ android:layout_height="match_parent" tools:context=".MainActivity"> - + /> diff --git a/app/src/main/res/layout/fragment_details.xml b/app/src/main/res/layout/fragment_details.xml new file mode 100644 index 0000000..4caa5e5 --- /dev/null +++ b/app/src/main/res/layout/fragment_details.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_list.xml b/app/src/main/res/layout/fragment_list.xml new file mode 100644 index 0000000..e4536c7 --- /dev/null +++ b/app/src/main/res/layout/fragment_list.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/app/src/main/res/layout/item_planet.xml b/app/src/main/res/layout/item_planet.xml new file mode 100644 index 0000000..d731213 --- /dev/null +++ b/app/src/main/res/layout/item_planet.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml new file mode 100644 index 0000000..adbb849 --- /dev/null +++ b/app/src/main/res/navigation/nav_graph.xml @@ -0,0 +1,26 @@ + + + + + + + + + + From 9d0924799b732a689ec4ec7e8eca9523054b4007 Mon Sep 17 00:00:00 2001 From: Insaf Date: Mon, 15 Nov 2021 15:51:21 +0300 Subject: [PATCH 2/3] hw-5 2.0 --- app/build.gradle | 15 +++- app/src/main/AndroidManifest.xml | 2 +- .../itis/androidlabproject/MainActivity.kt | 21 ----- .../activity/MainActivity.kt | 22 +++++ .../{adapters => adapter}/PlanetAdapter.kt | 4 +- .../{adapters => adapter}/PlanetHolder.kt | 35 +++++--- .../extension/ActivityExt.kt | 9 +++ .../fragment/DetailsFragment.kt | 49 +++++++++++ .../{fragments => fragment}/ListFragment.kt | 37 ++++----- .../fragments/DetailsFragment.kt | 43 ---------- .../itis/androidlabproject/model/Planet.kt | 9 +++ .../itis/androidlabproject/models/Planet.kt | 11 --- .../repositories/PlanetRepository.kt | 17 ---- .../repository/PlanetRepository.kt | 81 +++++++++++++++++++ app/src/main/res/anim/enter_from_right.xml | 8 ++ app/src/main/res/anim/exit_to_right.xml | 8 ++ app/src/main/res/anim/fade_in.xml | 8 ++ app/src/main/res/anim/fade_out.xml | 8 ++ app/src/main/res/layout/activity_main.xml | 11 +-- app/src/main/res/layout/fragment_details.xml | 54 +++++++------ app/src/main/res/layout/fragment_list.xml | 16 ++-- app/src/main/res/layout/item_planet.xml | 33 +++----- app/src/main/res/navigation/nav_graph.xml | 4 +- app/src/main/res/values/strings.xml | 4 +- build.gradle | 3 +- 25 files changed, 319 insertions(+), 193 deletions(-) delete mode 100644 app/src/main/java/com/itis/androidlabproject/MainActivity.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/activity/MainActivity.kt rename app/src/main/java/com/itis/androidlabproject/{adapters => adapter}/PlanetAdapter.kt (87%) rename app/src/main/java/com/itis/androidlabproject/{adapters => adapter}/PlanetHolder.kt (50%) create mode 100644 app/src/main/java/com/itis/androidlabproject/extension/ActivityExt.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/fragment/DetailsFragment.kt rename app/src/main/java/com/itis/androidlabproject/{fragments => fragment}/ListFragment.kt (54%) delete mode 100644 app/src/main/java/com/itis/androidlabproject/fragments/DetailsFragment.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/model/Planet.kt delete mode 100644 app/src/main/java/com/itis/androidlabproject/models/Planet.kt delete mode 100644 app/src/main/java/com/itis/androidlabproject/repositories/PlanetRepository.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/repository/PlanetRepository.kt create mode 100644 app/src/main/res/anim/enter_from_right.xml create mode 100644 app/src/main/res/anim/exit_to_right.xml create mode 100644 app/src/main/res/anim/fade_in.xml create mode 100644 app/src/main/res/anim/fade_out.xml diff --git a/app/build.gradle b/app/build.gradle index b315d5f..5b5890e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,17 @@ plugins { id 'com.android.application' id 'kotlin-android' + id 'kotlin-parcelize' + id 'androidx.navigation.safeargs.kotlin' } android { - compileSdk 30 + compileSdk 31 defaultConfig { applicationId "com.itis.androidlabproject" minSdk 23 - targetSdk 30 + targetSdk 31 versionCode 1 versionName "1.0" @@ -44,12 +46,17 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.12.0' implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.2" - implementation 'androidx.core:core-ktx:1.6.0' + implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.1' - implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' + + implementation 'androidx.recyclerview:recyclerview:1.2.1' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' + implementation 'de.hdodenhof:circleimageview:3.1.0' + implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0' + testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 890d1cc..c1e31fd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:supportsRtl="true" android:theme="@style/Theme.AndroidLabProject"> diff --git a/app/src/main/java/com/itis/androidlabproject/MainActivity.kt b/app/src/main/java/com/itis/androidlabproject/MainActivity.kt deleted file mode 100644 index 24f15e3..0000000 --- a/app/src/main/java/com/itis/androidlabproject/MainActivity.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.itis.androidlabproject - -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle -import com.itis.androidlabproject.databinding.ActivityMainBinding -import com.itis.androidlabproject.fragments.ListFragment - -class MainActivity : AppCompatActivity() { - private lateinit var binding: ActivityMainBinding - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - binding = ActivityMainBinding.inflate(layoutInflater) - setContentView(binding.root) - - supportFragmentManager.beginTransaction().run { - add(R.id.fragment_container, ListFragment()) - addToBackStack(null) - commit() - } - } -} diff --git a/app/src/main/java/com/itis/androidlabproject/activity/MainActivity.kt b/app/src/main/java/com/itis/androidlabproject/activity/MainActivity.kt new file mode 100644 index 0000000..a8a5013 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/activity/MainActivity.kt @@ -0,0 +1,22 @@ +package com.itis.androidlabproject.activity + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.navigation.NavController +import com.itis.androidlabproject.R +import com.itis.androidlabproject.databinding.ActivityMainBinding +import com.itis.androidlabproject.extension.findNavController + +class MainActivity : AppCompatActivity() { + private lateinit var binding: ActivityMainBinding + private lateinit var navController: NavController + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityMainBinding.inflate(layoutInflater).also { + setContentView(it.root) + } + + navController = findNavController(R.id.fragment_container) + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/adapters/PlanetAdapter.kt b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetAdapter.kt similarity index 87% rename from app/src/main/java/com/itis/androidlabproject/adapters/PlanetAdapter.kt rename to app/src/main/java/com/itis/androidlabproject/adapter/PlanetAdapter.kt index 4a57bb8..6eb7e05 100644 --- a/app/src/main/java/com/itis/androidlabproject/adapters/PlanetAdapter.kt +++ b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetAdapter.kt @@ -1,9 +1,9 @@ -package com.itis.androidlabproject.adapters +package com.itis.androidlabproject.adapter import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.RequestManager -import com.itis.androidlabproject.models.Planet +import com.itis.androidlabproject.model.Planet class PlanetAdapter( private val list: List, diff --git a/app/src/main/java/com/itis/androidlabproject/adapters/PlanetHolder.kt b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetHolder.kt similarity index 50% rename from app/src/main/java/com/itis/androidlabproject/adapters/PlanetHolder.kt rename to app/src/main/java/com/itis/androidlabproject/adapter/PlanetHolder.kt index 7740cf5..136e13e 100644 --- a/app/src/main/java/com/itis/androidlabproject/adapters/PlanetHolder.kt +++ b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetHolder.kt @@ -1,32 +1,45 @@ -package com.itis.androidlabproject.adapters +package com.itis.androidlabproject.adapter +import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Priority import com.bumptech.glide.RequestManager +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.RequestOptions import com.itis.androidlabproject.databinding.ItemPlanetBinding -import com.itis.androidlabproject.models.Planet +import com.itis.androidlabproject.model.Planet class PlanetHolder( private val binding: ItemPlanetBinding, - private val action: (Int) -> Unit, - private val glige: RequestManager + private val glige: RequestManager, + private val action: (Int) -> Unit ) : RecyclerView.ViewHolder(binding.root) { private var planet: Planet? = null + private val options = RequestOptions() + .priority(Priority.HIGH) + .diskCacheStrategy(DiskCacheStrategy.ALL) + init { itemView.setOnClickListener { - planet?.id?.also(action) + planet?.run { + action(this.id) + } } } + @SuppressLint("SetTextI18n") fun bind(item: Planet) { this.planet = item with(binding) { - tvName.text = item.name - tvAge.text = item.age.toString() - tvDescription.text = item.description - glige.load(item.imageUrl).into(ivImage) + tvDetName.text = item.name + tvNumberOfSatellite.text = "Количество спутников: ${item.numberOfSatellite}" + + glige.load(item.url) + .apply(options) + .into(ivImage) } } @@ -41,8 +54,8 @@ class PlanetHolder( parent, false ), - action, - glige + glige, + action ) } } diff --git a/app/src/main/java/com/itis/androidlabproject/extension/ActivityExt.kt b/app/src/main/java/com/itis/androidlabproject/extension/ActivityExt.kt new file mode 100644 index 0000000..8fc4c5c --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/extension/ActivityExt.kt @@ -0,0 +1,9 @@ +package com.itis.androidlabproject.extension + +import androidx.appcompat.app.AppCompatActivity +import androidx.navigation.NavController +import androidx.navigation.fragment.NavHostFragment + +fun AppCompatActivity.findNavController(id: Int): NavController { + return (supportFragmentManager.findFragmentById(id) as NavHostFragment).navController +} diff --git a/app/src/main/java/com/itis/androidlabproject/fragment/DetailsFragment.kt b/app/src/main/java/com/itis/androidlabproject/fragment/DetailsFragment.kt new file mode 100644 index 0000000..89d82f5 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/fragment/DetailsFragment.kt @@ -0,0 +1,49 @@ +package com.itis.androidlabproject.fragment + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.bumptech.glide.Glide +import com.itis.androidlabproject.databinding.FragmentDetailsBinding +import com.itis.androidlabproject.model.Planet +import com.itis.androidlabproject.repository.PlanetRepository + +class DetailsFragment : Fragment() { + private lateinit var binding: FragmentDetailsBinding + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.run { + arguments?.getInt("planetId")?.let { planetId -> + PlanetRepository.getPlanetById(planetId).let { + showChosenPlanet(it) + } + } + } + + } + + @SuppressLint("SetTextI18n") + private fun showChosenPlanet(planet: Planet) { + with(binding) { + Glide.with(this.root).load(planet.url).into(ivPhoto) + tvDetName.text = "Название планеты: ${planet.name}" + tvDetNumberOfSatellite.text = "Количество спутников ${planet.numberOfSatellite}" + tvDetDescription.text = "Описание: ${planet.description}" + collapsingToolbar.title = planet.name + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentDetailsBinding.inflate(inflater, container, false) + return binding.root + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/fragments/ListFragment.kt b/app/src/main/java/com/itis/androidlabproject/fragment/ListFragment.kt similarity index 54% rename from app/src/main/java/com/itis/androidlabproject/fragments/ListFragment.kt rename to app/src/main/java/com/itis/androidlabproject/fragment/ListFragment.kt index dfa9049..6cf414a 100644 --- a/app/src/main/java/com/itis/androidlabproject/fragments/ListFragment.kt +++ b/app/src/main/java/com/itis/androidlabproject/fragment/ListFragment.kt @@ -1,19 +1,20 @@ -package com.itis.androidlabproject.fragments +package com.itis.androidlabproject.fragment import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.os.bundleOf import androidx.fragment.app.Fragment +import androidx.navigation.NavOptions import androidx.navigation.fragment.findNavController import com.bumptech.glide.Glide -import com.google.android.material.snackbar.Snackbar import com.itis.androidlabproject.R -import com.itis.androidlabproject.adapters.PlanetAdapter +import com.itis.androidlabproject.adapter.PlanetAdapter import com.itis.androidlabproject.databinding.FragmentListBinding -import com.itis.androidlabproject.repositories.PlanetRepository +import com.itis.androidlabproject.repository.PlanetRepository -class ListFragment: Fragment() { +class ListFragment : Fragment(R.layout.fragment_list) { private lateinit var binding: FragmentListBinding private lateinit var adapter: PlanetAdapter @@ -24,25 +25,25 @@ class ListFragment: Fragment() { ): View { binding = FragmentListBinding.inflate(inflater, container, false) adapter = PlanetAdapter(PlanetRepository.planets, Glide.with(this)) { - showDetails(it); + showPlanetDetails(it); } binding.rvPlanets.adapter = adapter return binding.root } - private fun showDetails(id: Int) { - val bundle = Bundle() - bundle.putInt("id", id) - findNavController().navigate(R.id.action_listFragment_to_detailsFragment) - } - + private fun showPlanetDetails(id: Int) { + val bundle = bundleOf( + "planetId" to id + ) - private fun showName(name: String) { - Snackbar.make( - binding.root, - "Name: $name", - Snackbar.LENGTH_LONG - ).show() + val options = NavOptions.Builder() + .setLaunchSingleTop(false) + .setEnterAnim(R.anim.enter_from_right) + .setExitAnim(R.anim.fade_out) + .setPopEnterAnim(R.anim.fade_in) + .setPopExitAnim(R.anim.exit_to_right) + .build() + findNavController().navigate(R.id.action_listFragment_to_detailsFragment, bundle, options) } } diff --git a/app/src/main/java/com/itis/androidlabproject/fragments/DetailsFragment.kt b/app/src/main/java/com/itis/androidlabproject/fragments/DetailsFragment.kt deleted file mode 100644 index 790a62b..0000000 --- a/app/src/main/java/com/itis/androidlabproject/fragments/DetailsFragment.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.itis.androidlabproject.fragments - -import android.os.Build -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.annotation.RequiresApi -import androidx.fragment.app.Fragment -import com.itis.androidlabproject.databinding.FragmentDetailsBinding -import com.itis.androidlabproject.models.Planet -import com.itis.androidlabproject.repositories.PlanetRepository -import java.util.* - -class DetailsFragment : Fragment() { - private lateinit var binding: FragmentDetailsBinding - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - binding = FragmentDetailsBinding.inflate(inflater, container, false) - - return binding.root - } - - @RequiresApi(Build.VERSION_CODES.N) - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - var planet: Optional? = null - arguments?.getInt("id").also { id -> - planet = PlanetRepository.planets.stream().filter { - it.id == id - }.findFirst() - } - if (planet?.isPresent == true) { - binding.tvDetName.text = planet?.get()?.name - binding.tvDetAge.text = planet?.get()?.age.toString() - binding.tvDetDescription.text = planet?.get()?.description - } - } - -} diff --git a/app/src/main/java/com/itis/androidlabproject/model/Planet.kt b/app/src/main/java/com/itis/androidlabproject/model/Planet.kt new file mode 100644 index 0000000..0d874fd --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/model/Planet.kt @@ -0,0 +1,9 @@ +package com.itis.androidlabproject.model + +data class Planet( + var id: Int, + var name: String, + val numberOfSatellite: Int = 0, + var url: String, + var description: String +) diff --git a/app/src/main/java/com/itis/androidlabproject/models/Planet.kt b/app/src/main/java/com/itis/androidlabproject/models/Planet.kt deleted file mode 100644 index 3ecbcd5..0000000 --- a/app/src/main/java/com/itis/androidlabproject/models/Planet.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.itis.androidlabproject.models - -data class Planet( - var id: Int, - var name: String, - var age: Int, - var imageUrl: String = "", - var description: String = "" -) { - -} diff --git a/app/src/main/java/com/itis/androidlabproject/repositories/PlanetRepository.kt b/app/src/main/java/com/itis/androidlabproject/repositories/PlanetRepository.kt deleted file mode 100644 index b5a7204..0000000 --- a/app/src/main/java/com/itis/androidlabproject/repositories/PlanetRepository.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.itis.androidlabproject.repositories - -import com.itis.androidlabproject.models.Planet - -object PlanetRepository { - val planets = arrayListOf( - Planet(1,"Земля", 434334, "//Glide\n" + - " implementation 'com.github.bumptech.glide:glide:4.12.0'\n" + - " implementation \"com.squareup.okhttp3:okhttp:5.0.0-alpha.2\""), - Planet(2,"Венера", 27455), - Planet(3,"Меркурий", 623532) - ) - - fun getRabbitById(id: Int): Planet { - return this.planets[id-1] - } -} diff --git a/app/src/main/java/com/itis/androidlabproject/repository/PlanetRepository.kt b/app/src/main/java/com/itis/androidlabproject/repository/PlanetRepository.kt new file mode 100644 index 0000000..6ace681 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/repository/PlanetRepository.kt @@ -0,0 +1,81 @@ +package com.itis.androidlabproject.repository + +import com.itis.androidlabproject.model.Planet + +object PlanetRepository { + var autoIncId = 0; + val planets = arrayListOf( + Planet( + id = autoIncId++, + name = "Меркурий", + url = "https://cosmos.agency/wp-content/uploads/2015/08/pluto_heart_colored.png", + description = "Меркурий — самая близкая к Солнцу планета Солнечной системы, обращающаяся вокруг Солнца за 88 земных суток. Продолжительность одних звёздных суток на Меркурии составляет 58,65 земных[, а солнечных — 176 земных. Планета названа в честь древнеримского бога торговли — быстроногого Меркурия, поскольку она движется по небу быстрее других планет. Меркурий относится к планетам земной группы. После лишения Плутона в 2006 году статуса планеты к Меркурию перешло звание самой маленькой планеты Солнечной системы. Снимок сделан межпланетной станцией «Мессенджер»" + ), + Planet( + id = autoIncId++, + name = "Венера", + url = "https://cosmos.agency/wp-content/uploads/2015/08/venus_magellan.png", + description = "Венера — самая горячая планета Солнечной системы. В глубокой древности Венера, как полагают, настолько разогрелась, что подобные земным океаны, которыми, как считается, она обладала, полностью испарились, оставив после себя пустынный пейзаж с множеством плитоподобных скал. По структуре и размеру Венера подобна Земле. Ее толстая, токсичная атмосфера удерживает тепло, держа температуру поверхности достаточно горячей, для того, чтобы плавился свинец. Сфотографированна с межпланетной станции Магеллан." + ), + Planet( + id = autoIncId++, + name = "Земля", + numberOfSatellite = 1, + url = "https://cosmos.agency/wp-content/uploads/2015/08/earth.png", + description = "Земля — третья от Солнца планета. Пятая по размеру среди всех планет Солнечной системы. Она является также крупнейшей по диаметру, массе и плотности среди планет земной группы. Мы все на ней живем." + ), + Planet( + id = autoIncId++, + name = "Марс", + numberOfSatellite = 2, + url = "https://cosmos.agency/wp-content/uploads/2015/08/mars-globe-valles-marineris-enhanced-800.png", + description = "Марс — четвёртая по удалённости от Солнца (после Меркурия, Венеры и Земли) и седьмая по размерам планета Солнечной системы. Рельеф Марса обладает многими уникальными чертами. Марсианский потухший вулкан гора Олимп — самая высокая известная гора на планетах Солнечной системы, а долины Маринер — самый крупный известный каньон. Долины имеют длину 4500 км (четверть окружности планеты), ширину — 200 км и глубину — до 11 км. Эта система каньонов превышает знаменитый Большой каньон в 10 раз по длине, в 7 — по ширине и в 7 — по глубине. Композитная фотография планеты Марс с видом на долины Маринер." + ), + Planet( + id = autoIncId++, + name = "Юпитер", + numberOfSatellite = 79, + url = "https://cosmos.agency/wp-content/uploads/2015/08/planet_jupiter_mid_cosmos_agency.png", + description = "Юпитер — пятая планета от Солнца, располагается между Марсом и Сатурном. Отдалена от Солнца на 778.5 миллионов километров. Газовый гигант (три других газовых гиганта: Сатурн, Уран, Нептун), самая большая планета в Солнечной системе. Сутки на Юпитере длятся почти 10 часов, а год — 4333 земных дней, т.е. 11,8 лет." + ), + Planet( + id = autoIncId++, + name = "Сатурн", + numberOfSatellite = 62, + url = "https://cosmos.agency/wp-content/uploads/2015/08/saturn.png", + description = "Украшенный тысячами красивых колец, Сатурн является уникальной планетой. Все четыре газовых гиганта (Нептун, Уран, Сатурн, Юпитер) имеют кольца из глыбин льда и камней, но только Сатурн может похвастаться такой зрелищностью. Как и другие газовые гиганты, Сатурн в основном состоит из водорода и гелия. Планета находится в 1430 млн км от солнца, в 10 раз дальше чем Земля. Вокруг планеты обращается 62 известных на данный момент спутника. Титан — самый крупный из них, а также второй по размерам спутник в Солнечной системе (после спутника Юпитера, Ганимеда), который превосходит по своим размерам Меркурий и обладает единственной среди спутников Солнечной системы плотной атмосферой. Этот портрет Сатурна и его колец скомпонован любителем и фанатом Кассини Горданом Угарковичем из изображений полученных с космического аппарата NASA Кассини 10 октября 2013." + ), + Planet( + id = autoIncId++, + name = "Уран", + numberOfSatellite = 0, + url = "https://cosmos.agency/wp-content/uploads/2015/08/768px-Uranus2.png", + description = "Уран — седьмая планета Солнечной системы по удалённости от Солнца, третья по диаметру и четвёртая по массе. Была открыта в 1781 году английским астрономом Уильямом Гершелем и названа в честь греческого бога неба Урана, отца Кроноса (в римской мифологии Сатурна) и, соответственно, деда Зевса (у римлян — Юпитер). Фотография планеты Уран сделанная космическим аппаратом «Вояджер-2» в 1986" + ), + Planet( + id = autoIncId++, + name = "Нептун", + numberOfSatellite = 0, + url = "https://cosmos.agency/wp-content/uploads/2015/08/neptune_800.png", + description = "Темная, холодная, овеваемая сверхзвуковыми ветрами, планета Нептун, состоит из водорода и гелия и является самой дальней из газовых гигантов в нашей солнечной системе. Она находится на расстоянии в 4.5 миллиарда километров (что в 30 раз дальше чем Земля) от Солнца. Один год на Нептуне длится 165 земных лет, в 2011 году завершился первый год с момента его открытия в 1846. Нептун — восьмая планета Солнечной системы. Нептун также является четвёртой по диаметру и третьей по массе планетой. Масса Нептуна в 17,2 раза, а диаметр экватора в 3,9 раза больше таковых у Земли. Планета была названа в честь римского бога морей. Фотография планеты Нептун. Сделана космическим аппаратом «Вояджер 2» в 1989" + ), + Planet( + id = autoIncId++, + name = "Плутон", + numberOfSatellite = 0, + url = "https://cosmos.agency/wp-content/uploads/2015/08/pluto_heart_colored.png", + description = "Плутон — крупнейшая по размеру известная карликовая планета Солнечной системы, транснептуновый объект (ТНО) и десятое по массе (без учёта спутников) небесное тело, обращающееся вокруг Солнца — после восьми планет Солнечной системы и Эриды. Первоначально Плутон классифицировался как классическая планета, однако сейчас он считается карликовой планетой и самым крупным объектом в поясе Койпера. Цветное изображение Плутона, полученное автоматической межпланетной станцией «Новые горизонты» 14 июля 2015 года с расстояния 450 000 км" + ), + Planet( + id = autoIncId++, + name = "Ио", + numberOfSatellite = 0, + url = "https://cosmos.agency/wp-content/uploads/2015/08/Io_highest_resolution_true_color1.png", + description = "Фото Ио, сделанное аппаратом «Галилео» в 1999 году. Желтоватый цвет говорит о высоком содержании серы. Тёмное пятно левее центра — извергающийся вулкан Прометей, его окружают светлые равнины, покрытые оксидом серы. Хоть Ио и спутник Юпитера и не подходит для нашей подборки фотографий планет (в т.ч. одной карликовой) Солнечной системы от NASA, он весьма необычен и заслуживает место в списке." + ) + ) + + fun getPlanetById(id: Int): Planet { + return this.planets[id] + } +} diff --git a/app/src/main/res/anim/enter_from_right.xml b/app/src/main/res/anim/enter_from_right.xml new file mode 100644 index 0000000..d424f42 --- /dev/null +++ b/app/src/main/res/anim/enter_from_right.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/anim/exit_to_right.xml b/app/src/main/res/anim/exit_to_right.xml new file mode 100644 index 0000000..7becffd --- /dev/null +++ b/app/src/main/res/anim/exit_to_right.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/anim/fade_in.xml b/app/src/main/res/anim/fade_in.xml new file mode 100644 index 0000000..2f74325 --- /dev/null +++ b/app/src/main/res/anim/fade_in.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/anim/fade_out.xml b/app/src/main/res/anim/fade_out.xml new file mode 100644 index 0000000..678a617 --- /dev/null +++ b/app/src/main/res/anim/fade_out.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ec423e8..7c0b9e9 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,17 +4,18 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity"> + tools:context=".activity.MainActivity"> + app:layout_constraintTop_toTopOf="parent" + app:navGraph="@navigation/nav_graph" /> diff --git a/app/src/main/res/layout/fragment_details.xml b/app/src/main/res/layout/fragment_details.xml index 4caa5e5..e571860 100644 --- a/app/src/main/res/layout/fragment_details.xml +++ b/app/src/main/res/layout/fragment_details.xml @@ -1,44 +1,45 @@ - + tools:context=".fragment.DetailsFragment"> + android:fitsSystemWindows="true" + android:theme="@style/Theme.AndroidLabProject"> + app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"> + app:layout_collapseMode="parallax" + tools:src="@mipmap/ic_launcher" /> + app:titleTextColor="@android:color/white" /> @@ -47,7 +48,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - app:layout_behavior="@string/appbar_scrolling_view_behavior" > + app:layout_behavior="@string/appbar_scrolling_view_behavior"> + app:layout_constraintTop_toBottomOf="@id/tv_det_name"/> + + app:layout_constraintStart_toStartOf="@id/tv_det_name" + app:layout_constraintTop_toBottomOf="@id/tv_det_number_of_satellite" /> diff --git a/app/src/main/res/layout/fragment_list.xml b/app/src/main/res/layout/fragment_list.xml index e4536c7..37cbb9b 100644 --- a/app/src/main/res/layout/fragment_list.xml +++ b/app/src/main/res/layout/fragment_list.xml @@ -1,21 +1,21 @@ + tools:context=".fragment.ListFragment"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:itemCount="20" + tools:listitem="@layout/item_planet" /> diff --git a/app/src/main/res/layout/item_planet.xml b/app/src/main/res/layout/item_planet.xml index d731213..0d533a6 100644 --- a/app/src/main/res/layout/item_planet.xml +++ b/app/src/main/res/layout/item_planet.xml @@ -10,50 +10,39 @@ android:paddingHorizontal="16dp" android:paddingVertical="12dp"> - + tools:text="@string/planet_name" /> - - + app:layout_constraintTop_toBottomOf="@id/tv_det_name" + tools:text="@string/planet_number_of_satellite" /> diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index adbb849..466805e 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -7,7 +7,7 @@ AndroidLabProject - \ No newline at end of file + Название планеты + Количество спутников + diff --git a/build.gradle b/build.gradle index 12f1d4c..4afb132 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,9 @@ buildscript { mavenCentral() } dependencies { - classpath "com.android.tools.build:gradle:7.0.2" + classpath 'com.android.tools.build:gradle:7.0.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30" + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From e9c2ba9083b0c709f8a4ee9fcc5d30276d73d870 Mon Sep 17 00:00:00 2001 From: Insaf Date: Fri, 19 Nov 2021 23:45:27 +0300 Subject: [PATCH 3/3] hw-6 btn nav card view --- .../activity/MainActivity.kt | 3 + .../adapter/PlanetAdapter.kt | 11 +- .../adapter/PlanetCardViewAdapter.kt | 23 ++++ .../adapter/PlanetCardViewHolder.kt | 52 +++++++++ .../adapter/PlanetDiffItemCallback.kt | 36 ++++++ .../adapter/PlanetDiffUtils.kt | 49 ++++++++ .../androidlabproject/adapter/PlanetHolder.kt | 48 ++++++-- .../adapter/PlanetListAdapter.kt | 44 ++++++++ .../adapter/SwipeToDelete.kt | 14 +++ .../adapter/ViewPagerAdapter.kt | 40 +++++++ .../decorator/SpaceItemDecorator.kt | 45 ++++++++ .../androidlabproject/dialogs/AddDialog.kt | 60 ++++++++++ .../fragment/CardViewFragment.kt | 45 ++++++++ .../fragment/DetailsFragment.kt | 3 +- .../fragment/FirstFragment.kt | 7 ++ .../fragment/ListFragment.kt | 106 +++++++++++++++--- .../repository/PlanetRepository.kt | 25 +++++ app/src/main/res/drawable/ic_round_delete.xml | 10 ++ app/src/main/res/drawable/icon_add.xml | 10 ++ app/src/main/res/drawable/icon_cards.xml | 10 ++ app/src/main/res/drawable/icon_home.xml | 10 ++ app/src/main/res/drawable/icon_list.xml | 10 ++ app/src/main/res/layout/activity_main.xml | 10 ++ app/src/main/res/layout/dialog_add.xml | 79 +++++++++++++ app/src/main/res/layout/fragment_card.xml | 22 ++++ app/src/main/res/layout/fragment_first.xml | 17 +++ app/src/main/res/layout/fragment_list.xml | 16 ++- app/src/main/res/layout/fragment_third.xml | 6 + app/src/main/res/layout/item_cv_planet.xml | 95 ++++++++++++++++ app/src/main/res/layout/item_planet.xml | 28 +++-- app/src/main/res/layout/item_viewpager.xml | 20 ++++ app/src/main/res/menu/menu.xml | 16 +++ app/src/main/res/navigation/nav_graph.xml | 21 ++++ 33 files changed, 954 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/com/itis/androidlabproject/adapter/PlanetCardViewAdapter.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/adapter/PlanetCardViewHolder.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/adapter/PlanetDiffItemCallback.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/adapter/PlanetDiffUtils.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/adapter/PlanetListAdapter.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/adapter/SwipeToDelete.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/adapter/ViewPagerAdapter.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/decorator/SpaceItemDecorator.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/dialogs/AddDialog.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/fragment/CardViewFragment.kt create mode 100644 app/src/main/java/com/itis/androidlabproject/fragment/FirstFragment.kt create mode 100644 app/src/main/res/drawable/ic_round_delete.xml create mode 100644 app/src/main/res/drawable/icon_add.xml create mode 100644 app/src/main/res/drawable/icon_cards.xml create mode 100644 app/src/main/res/drawable/icon_home.xml create mode 100644 app/src/main/res/drawable/icon_list.xml create mode 100644 app/src/main/res/layout/dialog_add.xml create mode 100644 app/src/main/res/layout/fragment_card.xml create mode 100644 app/src/main/res/layout/fragment_first.xml create mode 100644 app/src/main/res/layout/fragment_third.xml create mode 100644 app/src/main/res/layout/item_cv_planet.xml create mode 100644 app/src/main/res/layout/item_viewpager.xml create mode 100644 app/src/main/res/menu/menu.xml diff --git a/app/src/main/java/com/itis/androidlabproject/activity/MainActivity.kt b/app/src/main/java/com/itis/androidlabproject/activity/MainActivity.kt index a8a5013..47d6b65 100644 --- a/app/src/main/java/com/itis/androidlabproject/activity/MainActivity.kt +++ b/app/src/main/java/com/itis/androidlabproject/activity/MainActivity.kt @@ -3,6 +3,7 @@ package com.itis.androidlabproject.activity import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.navigation.NavController +import androidx.navigation.ui.setupWithNavController import com.itis.androidlabproject.R import com.itis.androidlabproject.databinding.ActivityMainBinding import com.itis.androidlabproject.extension.findNavController @@ -18,5 +19,7 @@ class MainActivity : AppCompatActivity() { } navController = findNavController(R.id.fragment_container) + + binding.btnNavView.setupWithNavController(navController) } } diff --git a/app/src/main/java/com/itis/androidlabproject/adapter/PlanetAdapter.kt b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetAdapter.kt index 6eb7e05..8ad3f6b 100644 --- a/app/src/main/java/com/itis/androidlabproject/adapter/PlanetAdapter.kt +++ b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetAdapter.kt @@ -1,12 +1,13 @@ package com.itis.androidlabproject.adapter import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.RequestManager import com.itis.androidlabproject.model.Planet class PlanetAdapter( - private val list: List, + private val list: ArrayList, private val glide: RequestManager, private val action: (Int) -> Unit ) : RecyclerView.Adapter() { @@ -22,4 +23,12 @@ class PlanetAdapter( override fun getItemCount(): Int = list.size; + fun updateData(newData: List) { + val callback = PlanetDiffUtils(list, newData) + val diffResult = DiffUtil.calculateDiff(callback) + diffResult.dispatchUpdatesTo(this) + + list.clear() + list.addAll(newData) + } } diff --git a/app/src/main/java/com/itis/androidlabproject/adapter/PlanetCardViewAdapter.kt b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetCardViewAdapter.kt new file mode 100644 index 0000000..9e8b150 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetCardViewAdapter.kt @@ -0,0 +1,23 @@ +package com.itis.androidlabproject.adapter + +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.RequestManager +import com.itis.androidlabproject.model.Planet + +class PlanetCardViewAdapter( + private val list: List, + private val glide: RequestManager, +) : RecyclerView.Adapter() { + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): PlanetCardViewHolder = PlanetCardViewHolder.create(parent, glide) + + override fun onBindViewHolder(holder: PlanetCardViewHolder, position: Int) { + holder.bind(list[position]) + } + + override fun getItemCount(): Int = list.size +} diff --git a/app/src/main/java/com/itis/androidlabproject/adapter/PlanetCardViewHolder.kt b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetCardViewHolder.kt new file mode 100644 index 0000000..2766d99 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetCardViewHolder.kt @@ -0,0 +1,52 @@ +package com.itis.androidlabproject.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Priority +import com.bumptech.glide.RequestManager +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.RequestOptions +import com.itis.androidlabproject.databinding.ItemCvPlanetBinding +import com.itis.androidlabproject.model.Planet + +class PlanetCardViewHolder( + private val binding: ItemCvPlanetBinding, + private val glide: RequestManager, +) : RecyclerView.ViewHolder(binding.root) { + + private var album: Planet? = null + + private val options = RequestOptions() + .priority(Priority.HIGH) + .diskCacheStrategy(DiskCacheStrategy.ALL) + + fun bind(item: Planet) { + this.album = item + with(binding) { + tvName1.text = item.name + tvName2.text = item.name + tvNumberOfSatellite.text = "Количество спутников: ${item.numberOfSatellite}" + tvDesc.text = item.description + + glide.load(item.url) + .apply(options) + .into(ivImage1) + vp2Images.adapter = ViewPagerAdapter(item.url, glide) + } + + } + + companion object { + fun create( + parent: ViewGroup, + glide: RequestManager, + ) = PlanetCardViewHolder( + ItemCvPlanetBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), glide + ) + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/adapter/PlanetDiffItemCallback.kt b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetDiffItemCallback.kt new file mode 100644 index 0000000..a1ecd29 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetDiffItemCallback.kt @@ -0,0 +1,36 @@ +package com.itis.androidlabproject.adapter + +import android.os.Bundle +import androidx.recyclerview.widget.DiffUtil +import com.itis.androidlabproject.model.Planet + +class PlanetDiffItemCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: Planet, + newItem: Planet + ): Boolean = oldItem.id == newItem.id + + override fun areContentsTheSame( + oldItem: Planet, + newItem: Planet + ): Boolean = oldItem == newItem + + override fun getChangePayload(oldItem: Planet, newItem: Planet): Any? { + var bundle = Bundle() + + if (oldItem.name != newItem.name) { + bundle.putString("NAME", newItem.name) + } + if (oldItem.numberOfSatellite != newItem.numberOfSatellite) { + bundle.putInt("NUMBER_OF_SATELLITE", newItem.numberOfSatellite) + } + if (oldItem.description != newItem.description) { + bundle.putString("DESCRIPTION", newItem.description) + } + if (oldItem.url != newItem.url) { + bundle.putString("URL", newItem.url) + } + if (bundle.isEmpty) return null + return bundle + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/adapter/PlanetDiffUtils.kt b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetDiffUtils.kt new file mode 100644 index 0000000..0516b8d --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetDiffUtils.kt @@ -0,0 +1,49 @@ +package com.itis.androidlabproject.adapter + +import android.os.Bundle +import androidx.core.os.bundleOf +import androidx.recyclerview.widget.DiffUtil +import com.itis.androidlabproject.model.Planet + +class PlanetDiffUtils( + private var oldList: List, + private var newList: List +) : DiffUtil.Callback() { + override fun getOldListSize(): Int = oldList.size + + override fun getNewListSize(): Int = newList.size + + override fun areItemsTheSame( + oldItemPosition: Int, + newItemPosition: Int, + ): Boolean = + oldList[oldItemPosition].id == newList[newItemPosition].id + + override fun areContentsTheSame( + oldItemPosition: Int, + newItemPosition: Int, + ): Boolean = oldList[oldItemPosition] == newList[newItemPosition] + + override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? { + var oldPlanet = oldList[oldItemPosition] + var newPlanet = newList[newItemPosition] + + var bundle = Bundle() + + if (oldPlanet.name != newPlanet.name) { + bundle.putString("NAME", newPlanet.name) + } + if (oldPlanet.numberOfSatellite != newPlanet.numberOfSatellite) { + bundle.putInt("NUMBER_OF_SATELLITE", newPlanet.numberOfSatellite) + } + if (oldPlanet.description != newPlanet.description) { + bundle.putString("DESCRIPTION", newPlanet.description) + } + if (oldPlanet.url != newPlanet.url) { + bundle.putString("URL", newPlanet.url) + } + if (bundle.isEmpty) return null + + return bundle + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/adapter/PlanetHolder.kt b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetHolder.kt index 136e13e..824f8f5 100644 --- a/app/src/main/java/com/itis/androidlabproject/adapter/PlanetHolder.kt +++ b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetHolder.kt @@ -1,6 +1,7 @@ package com.itis.androidlabproject.adapter import android.annotation.SuppressLint +import android.os.Bundle import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView @@ -10,10 +11,11 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.RequestOptions import com.itis.androidlabproject.databinding.ItemPlanetBinding import com.itis.androidlabproject.model.Planet +import com.itis.androidlabproject.repository.PlanetRepository class PlanetHolder( private val binding: ItemPlanetBinding, - private val glige: RequestManager, + private val glide: RequestManager, private val action: (Int) -> Unit ) : RecyclerView.ViewHolder(binding.root) { private var planet: Planet? = null @@ -22,13 +24,13 @@ class PlanetHolder( .priority(Priority.HIGH) .diskCacheStrategy(DiskCacheStrategy.ALL) - init { - itemView.setOnClickListener { - planet?.run { - action(this.id) - } - } - } +// init { +// itemView.setOnClickListener { +// planet?.run { +// action(this.id) +// } +// } +// } @SuppressLint("SetTextI18n") fun bind(item: Planet) { @@ -37,16 +39,40 @@ class PlanetHolder( tvDetName.text = item.name tvNumberOfSatellite.text = "Количество спутников: ${item.numberOfSatellite}" - glige.load(item.url) + glide.load(item.url) .apply(options) .into(ivImage) + + btnDelete.setOnClickListener { + action(PlanetRepository.getIndex(item)) + } } } + fun updateFields(bundle: Bundle) { + bundle.run { + getString("NAME")?.also { + updateName(it) + } + getInt("NUMBER_OF_SATELLITE").also { + updateNumberOfSatellite(it) + } + } + } + + fun updateName(newName: String) { + binding.tvDetName.text = newName + } + + @SuppressLint("SetTextI18n") + fun updateNumberOfSatellite(newNumberOfSatellite: Int) { + binding.tvNumberOfSatellite.text = "Количество спутников: $newNumberOfSatellite" + } + companion object { fun create( parent: ViewGroup, - glige: RequestManager, + glide: RequestManager, action: (Int) -> Unit ) = PlanetHolder( ItemPlanetBinding.inflate( @@ -54,7 +80,7 @@ class PlanetHolder( parent, false ), - glige, + glide, action ) } diff --git a/app/src/main/java/com/itis/androidlabproject/adapter/PlanetListAdapter.kt b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetListAdapter.kt new file mode 100644 index 0000000..3f13758 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/adapter/PlanetListAdapter.kt @@ -0,0 +1,44 @@ +package com.itis.androidlabproject.adapter + +import android.os.Bundle +import android.view.ViewGroup +import androidx.recyclerview.widget.ListAdapter +import com.bumptech.glide.RequestManager +import com.itis.androidlabproject.model.Planet +import java.util.ArrayList + +class PlanetListAdapter( + private val glide: RequestManager, + private val action: (Int) -> Unit +) : ListAdapter(PlanetDiffItemCallback()) { + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): PlanetHolder = PlanetHolder.create(parent, glide, action) + + override fun onBindViewHolder( + holder: PlanetHolder, + position: Int + ) { + holder.bind(getItem(position)) + } + + override fun onBindViewHolder( + holder: PlanetHolder, + position: Int, + payloads: MutableList + ) { + if (payloads.isEmpty()) { + super.onBindViewHolder(holder, position, payloads) + } else { + payloads.last().takeIf { it is Bundle }?.let { + holder.updateFields(it as Bundle) + } + } + } + + override fun submitList(list: MutableList?) { + super.submitList(if (list == null) null else ArrayList(list)) + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/adapter/SwipeToDelete.kt b/app/src/main/java/com/itis/androidlabproject/adapter/SwipeToDelete.kt new file mode 100644 index 0000000..f10e3b8 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/adapter/SwipeToDelete.kt @@ -0,0 +1,14 @@ +package com.itis.androidlabproject.adapter + +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView + +abstract class SwipeToDelete : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) { + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ): Boolean { + return false + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/itis/androidlabproject/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..3284ca2 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/adapter/ViewPagerAdapter.kt @@ -0,0 +1,40 @@ +package com.itis.androidlabproject.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.RequestManager +import com.itis.androidlabproject.databinding.ItemViewpagerBinding + + +class ViewPagerAdapter( + private val url: String, + private val glide: RequestManager, +) : RecyclerView.Adapter() { + + + inner class ViewPagerViewHolder( + private val binding: ItemViewpagerBinding, + ) : RecyclerView.ViewHolder(binding.root) { + + fun bind(pos: Int) { + with(binding) { + glide.load(url).into(ivImage) + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewPagerViewHolder { + return ViewPagerViewHolder( + ItemViewpagerBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ) + ) + } + + override fun onBindViewHolder(holder: ViewPagerViewHolder, position: Int) { + holder.bind(position) + } + + override fun getItemCount() = 1 +} diff --git a/app/src/main/java/com/itis/androidlabproject/decorator/SpaceItemDecorator.kt b/app/src/main/java/com/itis/androidlabproject/decorator/SpaceItemDecorator.kt new file mode 100644 index 0000000..072a6f6 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/decorator/SpaceItemDecorator.kt @@ -0,0 +1,45 @@ +package com.itis.androidlabproject.decorator + +import android.content.Context +import android.graphics.Rect +import android.util.TypedValue +import android.view.View +import androidx.recyclerview.widget.RecyclerView + +class SpaceItemDecorator( + context: Context, + spacing: Float = 16f, +) : RecyclerView.ItemDecoration() { + + private val spacingPx: Int = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + spacing, + context.resources.displayMetrics + ).toInt() + + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + val position = parent.getChildAdapterPosition(view) + val spacingMiddle: Int = spacingPx / 2 + when (position) { + 0 -> { + outRect.top = spacingPx + outRect.bottom = spacingMiddle + } + state.itemCount - 1 -> { + outRect.top = spacingMiddle + outRect.bottom = spacingPx + } + else -> { + outRect.top = spacingMiddle + outRect.bottom = spacingMiddle + } + } + outRect.left = spacingPx + outRect.right = spacingPx + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/dialogs/AddDialog.kt b/app/src/main/java/com/itis/androidlabproject/dialogs/AddDialog.kt new file mode 100644 index 0000000..a30acb1 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/dialogs/AddDialog.kt @@ -0,0 +1,60 @@ +package com.example.androidsemthree.dialogs + +import android.app.AlertDialog +import android.app.Dialog +import android.os.Bundle +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.FragmentManager +import com.itis.androidlabproject.databinding.DialogAddBinding + +class AddDialog : DialogFragment() { + private lateinit var binding: DialogAddBinding + + var positiveCallBack: ((Array) -> Unit)? = null + var positiveNotFullCallBack: ((Boolean) -> Unit)? = null + + override fun onCreateDialog( + savedInstanceState: Bundle? + ): Dialog = AlertDialog.Builder(requireContext()) + .setView(DialogAddBinding.inflate(layoutInflater).let { + binding = it + it.root + }) + .setTitle("Добавление планеты") + .setMessage("Введите данные") + .setPositiveButton("OK") { _, _ -> + var flag = false; + val name = binding.etName.text?.toString() ?: "" + val desc = binding.etDescription.text?.toString() ?: "" + val pos = binding.etPosition.text?.toString() ?: "" + val numberOfSatellite = binding.etDetNumberOfSatellite.text?.toString() ?: "0" + if (name.isNotEmpty()) { + if (desc.isNotEmpty()) { + flag = true + val array = arrayOf(name, numberOfSatellite, desc, pos) + positiveCallBack?.invoke(array) + } + } + if (!flag) { + positiveNotFullCallBack?.invoke(flag) + } + } + .setNegativeButton("Cancel") { dialog, _ -> + dialog.dismiss() + }.create() + + companion object { + fun show( + fragmentManager: FragmentManager, + positive: (Array) -> Unit, + notFull: (Boolean) -> Unit + ) { + AddDialog().apply { + positiveNotFullCallBack = notFull + positiveCallBack = positive + show(fragmentManager, AddDialog::class.java.name) + } + } + } +} + diff --git a/app/src/main/java/com/itis/androidlabproject/fragment/CardViewFragment.kt b/app/src/main/java/com/itis/androidlabproject/fragment/CardViewFragment.kt new file mode 100644 index 0000000..0da1383 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/fragment/CardViewFragment.kt @@ -0,0 +1,45 @@ +package com.itis.androidlabproject.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.itis.androidlabproject.R +import com.itis.androidlabproject.adapter.PlanetCardViewAdapter +import com.itis.androidlabproject.databinding.FragmentCardBinding +import com.itis.androidlabproject.decorator.SpaceItemDecorator +import com.itis.androidlabproject.repository.PlanetRepository + +class CardViewFragment : Fragment() { + private lateinit var binding: FragmentCardBinding + private lateinit var albumCardViewAdapter: PlanetCardViewAdapter + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentCardBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + albumCardViewAdapter = PlanetCardViewAdapter(PlanetRepository.planets, Glide.with(this)) + + val decorator = DividerItemDecoration(requireContext(), RecyclerView.VERTICAL) + val spacing = SpaceItemDecorator(requireContext()) + + with(binding) { + rvPlanets.run { + adapter = albumCardViewAdapter + addItemDecoration(decorator) + addItemDecoration(spacing) + } + } + } +} diff --git a/app/src/main/java/com/itis/androidlabproject/fragment/DetailsFragment.kt b/app/src/main/java/com/itis/androidlabproject/fragment/DetailsFragment.kt index 89d82f5..d205520 100644 --- a/app/src/main/java/com/itis/androidlabproject/fragment/DetailsFragment.kt +++ b/app/src/main/java/com/itis/androidlabproject/fragment/DetailsFragment.kt @@ -7,11 +7,12 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.bumptech.glide.Glide +import com.itis.androidlabproject.R import com.itis.androidlabproject.databinding.FragmentDetailsBinding import com.itis.androidlabproject.model.Planet import com.itis.androidlabproject.repository.PlanetRepository -class DetailsFragment : Fragment() { +class DetailsFragment : Fragment(R.layout.fragment_details) { private lateinit var binding: FragmentDetailsBinding override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/itis/androidlabproject/fragment/FirstFragment.kt b/app/src/main/java/com/itis/androidlabproject/fragment/FirstFragment.kt new file mode 100644 index 0000000..c9628d0 --- /dev/null +++ b/app/src/main/java/com/itis/androidlabproject/fragment/FirstFragment.kt @@ -0,0 +1,7 @@ +package com.itis.androidlabproject.fragment + +import androidx.fragment.app.Fragment +import com.itis.androidlabproject.R + +class FirstFragment : Fragment(R.layout.fragment_first) { +} diff --git a/app/src/main/java/com/itis/androidlabproject/fragment/ListFragment.kt b/app/src/main/java/com/itis/androidlabproject/fragment/ListFragment.kt index 6cf414a..065f534 100644 --- a/app/src/main/java/com/itis/androidlabproject/fragment/ListFragment.kt +++ b/app/src/main/java/com/itis/androidlabproject/fragment/ListFragment.kt @@ -1,35 +1,64 @@ package com.itis.androidlabproject.fragment import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import androidx.navigation.NavOptions import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide +import com.example.androidsemthree.dialogs.AddDialog +import com.google.android.material.snackbar.Snackbar import com.itis.androidlabproject.R -import com.itis.androidlabproject.adapter.PlanetAdapter +import com.itis.androidlabproject.adapter.PlanetListAdapter +import com.itis.androidlabproject.adapter.SwipeToDelete import com.itis.androidlabproject.databinding.FragmentListBinding +import com.itis.androidlabproject.decorator.SpaceItemDecorator import com.itis.androidlabproject.repository.PlanetRepository class ListFragment : Fragment(R.layout.fragment_list) { - private lateinit var binding: FragmentListBinding - private lateinit var adapter: PlanetAdapter + private var binding: FragmentListBinding? = null + private var planetListAdapter: PlanetListAdapter? = null - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, + override fun onViewCreated( + view: View, savedInstanceState: Bundle? - ): View { - binding = FragmentListBinding.inflate(inflater, container, false) - adapter = PlanetAdapter(PlanetRepository.planets, Glide.with(this)) { - showPlanetDetails(it); + ) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentListBinding.bind(view) + + planetListAdapter = PlanetListAdapter(Glide.with(this)) { +// showPlanetDetails(it) + PlanetRepository.delete(it) + refresh() } - binding.rvPlanets.adapter = adapter - return binding.root + val decorator = DividerItemDecoration(requireContext(), RecyclerView.VERTICAL) + val spacing = SpaceItemDecorator(requireContext(), 24f) + binding?.run { + rvPlanets.run { + adapter = planetListAdapter + addItemDecoration(decorator) + addItemDecoration(spacing) + swipeToDelete(this) + } + refresh() + btnAdd.setOnClickListener { + showDialog() + } + + } + + planetListAdapter?.submitList(PlanetRepository.planets) + } + + private fun refresh() { + planetListAdapter?.submitList(PlanetRepository.planets) { + binding?.rvPlanets?.scrollToPosition(0); + } } private fun showPlanetDetails(id: Int) { @@ -46,4 +75,53 @@ class ListFragment : Fragment(R.layout.fragment_list) { .build() findNavController().navigate(R.id.action_listFragment_to_detailsFragment, bundle, options) } + + private fun swipeToDelete(recyclerView: RecyclerView) { + val swipeToDeleteCallback = object : SwipeToDelete() { + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + val item = planetListAdapter?.currentList?.get(viewHolder.absoluteAdapterPosition) + PlanetRepository.delete(item) + refresh() + } + } + val itemTouchHelper = ItemTouchHelper(swipeToDeleteCallback) + itemTouchHelper.attachToRecyclerView(recyclerView) + } + + private fun showDialog() { + AddDialog.show( + childFragmentManager, + positive = { positiveAddDialog(it) }, + notFull = { notFullAlert(it) }) + } + + private fun positiveAddDialog(array: Array) { + val name = array[0] + val numberOfSatellite = Integer.parseInt(array[1]) + val desc = array[2] + val pos: Int? = if (array[3].isEmpty()) { + null + } else { + array[3].toInt() + } + PlanetRepository.add(pos, name, numberOfSatellite, desc) + refresh() + } + + private fun notFullAlert(flag: Boolean) { + if (!flag) { + binding?.root?.let { + Snackbar.make( + it, + "Please, enter all data and try again", + Snackbar.LENGTH_LONG + ).show() + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + binding = null + } } diff --git a/app/src/main/java/com/itis/androidlabproject/repository/PlanetRepository.kt b/app/src/main/java/com/itis/androidlabproject/repository/PlanetRepository.kt index 6ace681..f8aeda6 100644 --- a/app/src/main/java/com/itis/androidlabproject/repository/PlanetRepository.kt +++ b/app/src/main/java/com/itis/androidlabproject/repository/PlanetRepository.kt @@ -1,8 +1,10 @@ package com.itis.androidlabproject.repository +import android.media.Image import com.itis.androidlabproject.model.Planet object PlanetRepository { + var autoUrl = "https://cosmos.agency/wp-content/uploads/2015/08/pluto_heart_colored.png" var autoIncId = 0; val planets = arrayListOf( Planet( @@ -78,4 +80,27 @@ object PlanetRepository { fun getPlanetById(id: Int): Planet { return this.planets[id] } + + fun delete(id: Int) { + planets.removeAt(id) + } + + fun delete(planet: Planet?) { + planets.remove(planet) + } + + fun getIndex(planet: Planet) : Int { + return planets.indexOf(planet) + } + + fun add(pos: Int?, name: String, numberOfSatellite: Int, description: String) { + if (pos == null || pos > planets.size || pos < 0) { + planets.add(Planet(autoIncId++, name, numberOfSatellite, autoUrl, description)) + } else update(pos, name, description) + } + + fun update(pos: Int, name: String, description: String) { + planets[pos].name = name + planets[pos].description = description + } } diff --git a/app/src/main/res/drawable/ic_round_delete.xml b/app/src/main/res/drawable/ic_round_delete.xml new file mode 100644 index 0000000..72870fe --- /dev/null +++ b/app/src/main/res/drawable/ic_round_delete.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/icon_add.xml b/app/src/main/res/drawable/icon_add.xml new file mode 100644 index 0000000..eb23254 --- /dev/null +++ b/app/src/main/res/drawable/icon_add.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/icon_cards.xml b/app/src/main/res/drawable/icon_cards.xml new file mode 100644 index 0000000..238ff4d --- /dev/null +++ b/app/src/main/res/drawable/icon_cards.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/icon_home.xml b/app/src/main/res/drawable/icon_home.xml new file mode 100644 index 0000000..3a4c7da --- /dev/null +++ b/app/src/main/res/drawable/icon_home.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/icon_list.xml b/app/src/main/res/drawable/icon_list.xml new file mode 100644 index 0000000..9884aeb --- /dev/null +++ b/app/src/main/res/drawable/icon_list.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 7c0b9e9..20731b2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -18,4 +18,14 @@ app:layout_constraintTop_toTopOf="parent" app:navGraph="@navigation/nav_graph" /> + + diff --git a/app/src/main/res/layout/dialog_add.xml b/app/src/main/res/layout/dialog_add.xml new file mode 100644 index 0000000..9d9d446 --- /dev/null +++ b/app/src/main/res/layout/dialog_add.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_card.xml b/app/src/main/res/layout/fragment_card.xml new file mode 100644 index 0000000..1a8b89f --- /dev/null +++ b/app/src/main/res/layout/fragment_card.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_first.xml b/app/src/main/res/layout/fragment_first.xml new file mode 100644 index 0000000..1d090cb --- /dev/null +++ b/app/src/main/res/layout/fragment_first.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_list.xml b/app/src/main/res/layout/fragment_list.xml index 37cbb9b..548a560 100644 --- a/app/src/main/res/layout/fragment_list.xml +++ b/app/src/main/res/layout/fragment_list.xml @@ -8,8 +8,9 @@ + + diff --git a/app/src/main/res/layout/fragment_third.xml b/app/src/main/res/layout/fragment_third.xml new file mode 100644 index 0000000..1354408 --- /dev/null +++ b/app/src/main/res/layout/fragment_third.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/layout/item_cv_planet.xml b/app/src/main/res/layout/item_cv_planet.xml new file mode 100644 index 0000000..391b1fd --- /dev/null +++ b/app/src/main/res/layout/item_cv_planet.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_planet.xml b/app/src/main/res/layout/item_planet.xml index 0d533a6..02bb365 100644 --- a/app/src/main/res/layout/item_planet.xml +++ b/app/src/main/res/layout/item_planet.xml @@ -7,13 +7,13 @@ android:clickable="true" android:focusable="true" android:foreground="?android:attr/selectableItemBackground" - android:paddingHorizontal="16dp" - android:paddingVertical="12dp"> + tools:paddingHorizontal="16dp" + tools:paddingVertical="12dp"> @@ -36,13 +36,25 @@ android:id="@+id/tv_number_of_satellite" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="16dp" + android:layout_marginHorizontal="16dp" android:textSize="14sp" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@id/btn_delete" app:layout_constraintStart_toEndOf="@id/iv_image" app:layout_constraintTop_toBottomOf="@id/tv_det_name" tools:text="@string/planet_number_of_satellite" /> + + diff --git a/app/src/main/res/layout/item_viewpager.xml b/app/src/main/res/layout/item_viewpager.xml new file mode 100644 index 0000000..9b819dd --- /dev/null +++ b/app/src/main/res/layout/item_viewpager.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml new file mode 100644 index 0000000..1905e99 --- /dev/null +++ b/app/src/main/res/menu/menu.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 466805e..35da2c4 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -13,7 +13,28 @@ + + + + + + + + +