From f854ad4286f8988c870c3ed160e0b500d46e17dc Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Mon, 13 Jul 2020 18:25:23 +0100 Subject: [PATCH 1/7] Add LiveData and ViewModel to fragments --- app/build.gradle.kts | 2 + .../guide/graphql/toc/ChaptersFragment.kt | 80 ------------- .../java/guide/graphql/toc/MainActivity.kt | 18 +++ .../main/java/guide/graphql/toc/Resource.kt | 24 ++++ .../guide/graphql/toc/SectionsFragment.kt | 103 ----------------- .../toc/{ => ui/chapters}/ChaptersAdapter.kt | 11 +- .../toc/ui/chapters/ChaptersFragment.kt | 77 +++++++++++++ .../toc/ui/chapters/ChaptersViewModel.kt | 38 +++++++ .../toc/{ => ui/sections}/SectionsAdapter.kt | 11 +- .../toc/ui/sections/SectionsFragment.kt | 107 ++++++++++++++++++ .../toc/ui/sections/SectionsViewModel.kt | 53 +++++++++ .../drawable/ic_baseline_arrow_back_24.xml | 10 ++ app/src/main/res/layout/chapters_fragment.xml | 1 - app/src/main/res/navigation/main.xml | 11 +- build.gradle.kts | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 16 files changed, 359 insertions(+), 193 deletions(-) delete mode 100644 app/src/main/java/guide/graphql/toc/ChaptersFragment.kt create mode 100644 app/src/main/java/guide/graphql/toc/Resource.kt delete mode 100644 app/src/main/java/guide/graphql/toc/SectionsFragment.kt rename app/src/main/java/guide/graphql/toc/{ => ui/chapters}/ChaptersAdapter.kt (83%) create mode 100644 app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersFragment.kt create mode 100644 app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersViewModel.kt rename app/src/main/java/guide/graphql/toc/{ => ui/sections}/SectionsAdapter.kt (79%) create mode 100644 app/src/main/java/guide/graphql/toc/ui/sections/SectionsFragment.kt create mode 100644 app/src/main/java/guide/graphql/toc/ui/sections/SectionsViewModel.kt create mode 100644 app/src/main/res/drawable/ic_baseline_arrow_back_24.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d920e44..f2cdfae 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -45,6 +45,8 @@ dependencies { implementation("com.google.android.material:material:1.3.0-alpha01") implementation("com.apollographql.apollo:apollo-runtime:2.2.2") implementation("com.apollographql.apollo:apollo-coroutines-support:2.2.2") + implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.2.0") + } apollo { diff --git a/app/src/main/java/guide/graphql/toc/ChaptersFragment.kt b/app/src/main/java/guide/graphql/toc/ChaptersFragment.kt deleted file mode 100644 index 70099e5..0000000 --- a/app/src/main/java/guide/graphql/toc/ChaptersFragment.kt +++ /dev/null @@ -1,80 +0,0 @@ -package guide.graphql.toc - -import android.os.Bundle -import android.util.Log -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.Fragment -import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.findNavController -import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.apollographql.apollo.coroutines.toDeferred -import com.apollographql.apollo.exception.ApolloException -import com.google.android.material.transition.MaterialSharedAxis -import guide.graphql.toc.databinding.ChaptersFragmentBinding - -class ChaptersFragment : Fragment() { - private lateinit var binding: ChaptersFragmentBinding - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - binding = ChaptersFragmentBinding.inflate(inflater) - return binding.root - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - - val backward = MaterialSharedAxis(MaterialSharedAxis.Z, false) - reenterTransition = backward - - val forward = MaterialSharedAxis(MaterialSharedAxis.Z, true) - exitTransition = forward - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - (requireActivity() as AppCompatActivity).setSupportActionBar(binding.bookHeader) - - lifecycleScope.launchWhenResumed { - val response = try { - apolloClient.query( - ChaptersQuery() - ).toDeferred().await() - } catch (e: ApolloException) { - Log.d("ChaptersQuery", "GraphQL request failed", e) - return@launchWhenResumed - } - - if (response.hasErrors()) { - return@launchWhenResumed - } - - response.data?.chapters?.let { chapters -> - val adapter = - ChaptersAdapter(chapters, requireContext()) { chapter -> - findNavController().navigate( - ChaptersFragmentDirections.viewSections( - chapterId = chapter.id - ) - ) - } - val layoutManager = LinearLayoutManager(requireContext()) - binding.chapters.layoutManager = layoutManager - val itemDivider = DividerItemDecoration(requireContext(), layoutManager.orientation) - binding.chapters.addItemDecoration(itemDivider) - binding.chapters.adapter = adapter - } - - } - } -} \ No newline at end of file diff --git a/app/src/main/java/guide/graphql/toc/MainActivity.kt b/app/src/main/java/guide/graphql/toc/MainActivity.kt index 99b5760..43eef63 100644 --- a/app/src/main/java/guide/graphql/toc/MainActivity.kt +++ b/app/src/main/java/guide/graphql/toc/MainActivity.kt @@ -2,12 +2,30 @@ package guide.graphql.toc import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import androidx.navigation.NavController +import androidx.navigation.findNavController class MainActivity : AppCompatActivity() { + private val navigationListener = NavController.OnDestinationChangedListener { controller, destination, arguments -> + if (destination.id == R.id.chapters_fragment) { + this.setTitle(R.string.app_name) + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } + + override fun onResume() { + super.onResume() + findNavController(R.id.nav_host_fragment).addOnDestinationChangedListener(navigationListener) + } + + override fun onPause() { + super.onPause() + findNavController(R.id.nav_host_fragment).removeOnDestinationChangedListener(navigationListener) + } } diff --git a/app/src/main/java/guide/graphql/toc/Resource.kt b/app/src/main/java/guide/graphql/toc/Resource.kt new file mode 100644 index 0000000..5dd963b --- /dev/null +++ b/app/src/main/java/guide/graphql/toc/Resource.kt @@ -0,0 +1,24 @@ +package guide.graphql.toc + +//https://github.com/android/architecture-components-samples/blob/master/GithubBrowserSample/app/src/main/java/com/android/example/github/vo/Resource.kt + +data class Resource(val status: Status, val data: T?, val message: String?) { + companion object { + fun success(data: T?): Resource { + return Resource(Status.SUCCESS, data, null) + } + + fun error(msg: String, data: T?): Resource { + return Resource(Status.ERROR, data, msg) + } + + fun loading(data: T?): Resource { + return Resource(Status.LOADING, data, null) + } + } +} +enum class Status { + SUCCESS, + ERROR, + LOADING +} \ No newline at end of file diff --git a/app/src/main/java/guide/graphql/toc/SectionsFragment.kt b/app/src/main/java/guide/graphql/toc/SectionsFragment.kt deleted file mode 100644 index 20e0a69..0000000 --- a/app/src/main/java/guide/graphql/toc/SectionsFragment.kt +++ /dev/null @@ -1,103 +0,0 @@ -package guide.graphql.toc - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.Fragment -import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.findNavController -import androidx.navigation.fragment.navArgs -import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager -import com.apollographql.apollo.coroutines.toDeferred -import com.apollographql.apollo.exception.ApolloException -import com.google.android.material.transition.MaterialSharedAxis -import guide.graphql.toc.databinding.SectionsFragmentBinding - -class SectionsFragment : Fragment() { - - private lateinit var binding: SectionsFragmentBinding - val args: SectionsFragmentArgs by navArgs() - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - binding = SectionsFragmentBinding.inflate(inflater) - return binding.root - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val forward = MaterialSharedAxis(MaterialSharedAxis.Z, true) - enterTransition = forward - - val backward = MaterialSharedAxis(MaterialSharedAxis.Z, false) - returnTransition = backward - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - (requireActivity() as AppCompatActivity).setSupportActionBar(binding.chapterHeader) - (requireActivity() as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) - binding.chapterHeader.setNavigationOnClickListener { - findNavController().navigateUp() - } - - lifecycleScope.launchWhenResumed { - binding.spinner.visibility = View.VISIBLE - binding.error.visibility = View.GONE - - val response = try { - apolloClient.query( - SectionsQuery(id = args.chapterId) - ).toDeferred().await() - } catch (e: ApolloException) { - showErrorMessage(getString(R.string.graphql_error, e.message)) - return@launchWhenResumed - } - - if (response.hasErrors()) { - showErrorMessage(response.errors?.get(0)?.message ?: getString(R.string.error)) - return@launchWhenResumed - } - - response.data?.chapter?.let { chapter -> - val chapterNumber = chapter.number?.toInt() - binding.spinner.visibility = View.GONE - binding.chapterHeader.title = - if (chapter.number == null) chapter.title else getString( - R.string.chapter_title, - chapter.number.toString(), - chapter.title - ) - - if (chapter.sections.size > 1) { - val adapter = - SectionsAdapter(chapterNumber, chapter.sections, requireContext()) - val layoutManager = LinearLayoutManager(requireContext()) - binding.sections.layoutManager = layoutManager - val itemDivider = - DividerItemDecoration(requireContext(), layoutManager.orientation) - binding.sections.addItemDecoration(itemDivider) - binding.sections.adapter = adapter - } else { - binding.error.text = getString(R.string.no_sections) - binding.error.visibility = View.VISIBLE - } - } - - - } - } - - private fun showErrorMessage(error: String) { - binding.spinner.visibility = View.GONE - binding.error.text = error - binding.error.visibility = View.VISIBLE - } -} \ No newline at end of file diff --git a/app/src/main/java/guide/graphql/toc/ChaptersAdapter.kt b/app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersAdapter.kt similarity index 83% rename from app/src/main/java/guide/graphql/toc/ChaptersAdapter.kt rename to app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersAdapter.kt index 0eec207..82d8bf6 100644 --- a/app/src/main/java/guide/graphql/toc/ChaptersAdapter.kt +++ b/app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersAdapter.kt @@ -1,14 +1,16 @@ -package guide.graphql.toc +package guide.graphql.toc.ui.chapters import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import guide.graphql.toc.ChaptersQuery +import guide.graphql.toc.R import guide.graphql.toc.databinding.ChapterBinding class ChaptersAdapter( - private val chapters: List, + private var chapters: List, private val context: Context, private val onItemClicked: ((ChaptersQuery.Chapter) -> Unit) ) : @@ -16,6 +18,11 @@ class ChaptersAdapter( class ViewHolder(val binding: ChapterBinding) : RecyclerView.ViewHolder(binding.root) + fun updateChapters(chapters: List) { + this.chapters = chapters + notifyDataSetChanged() + } + override fun getItemCount(): Int { return chapters.size } diff --git a/app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersFragment.kt b/app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersFragment.kt new file mode 100644 index 0000000..a256c52 --- /dev/null +++ b/app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersFragment.kt @@ -0,0 +1,77 @@ +package guide.graphql.toc.ui.chapters + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.Observer +import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.transition.MaterialFade +import guide.graphql.toc.Status +import guide.graphql.toc.databinding.ChaptersFragmentBinding + +class ChaptersFragment : Fragment() { + + private val viewModel: ChaptersViewModel by viewModels() + + private lateinit var binding: ChaptersFragmentBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = ChaptersFragmentBinding.inflate(inflater) + return binding.root + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val materialFade = MaterialFade() + exitTransition = materialFade + + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + (requireActivity() as AppCompatActivity).setSupportActionBar(binding.bookHeader) + + val adapter = + ChaptersAdapter( + listOf(), + requireContext() + ) { chapter -> + findNavController().navigate( + ChaptersFragmentDirections.viewSections( + chapterId = chapter.id, + chapterNumber = chapter.number?.toInt() ?: -1, + chapterTitle = chapter.title + ) + ) + } + val layoutManager = LinearLayoutManager(requireContext()) + binding.chapters.layoutManager = layoutManager + val itemDivider = DividerItemDecoration(requireContext(), layoutManager.orientation) + binding.chapters.addItemDecoration(itemDivider) + binding.chapters.adapter = adapter + + viewModel.chapterList.observe(viewLifecycleOwner, Observer { chapterListResponse -> + when (chapterListResponse.status) { + Status.SUCCESS -> { + chapterListResponse.data?.let { + adapter.updateChapters(it) + } + } + Status.ERROR -> Toast.makeText(requireContext(), "Error: ${chapterListResponse.message}", Toast.LENGTH_SHORT).show() + } + }) + + } +} \ No newline at end of file diff --git a/app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersViewModel.kt b/app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersViewModel.kt new file mode 100644 index 0000000..9f898fa --- /dev/null +++ b/app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersViewModel.kt @@ -0,0 +1,38 @@ +package guide.graphql.toc.ui.chapters + +import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.liveData +import com.apollographql.apollo.coroutines.toDeferred +import com.apollographql.apollo.exception.ApolloException +import guide.graphql.toc.ChaptersQuery +import guide.graphql.toc.Resource +import guide.graphql.toc.apolloClient + +class ChaptersViewModel : ViewModel() { + + val bookId: LiveData = MutableLiveData(0) + + val chapterList: LiveData>> = liveData { + emit(Resource.loading(null)) + try { + val response = apolloClient.query( + ChaptersQuery() + ).toDeferred().await() + + if (response.hasErrors()) { + emit(Resource.error("Response has errors" ,null)) + } + if (response.data?.chapters != null) { + emit(Resource.success(response.data!!.chapters)) + } else { + emit(Resource.error("Data is null" ,null)) + } + } catch (e: ApolloException) { + Log.d("ChaptersQuery", "GraphQL request failed", e) + emit(Resource.error("GraphQL request failed", null)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/guide/graphql/toc/SectionsAdapter.kt b/app/src/main/java/guide/graphql/toc/ui/sections/SectionsAdapter.kt similarity index 79% rename from app/src/main/java/guide/graphql/toc/SectionsAdapter.kt rename to app/src/main/java/guide/graphql/toc/ui/sections/SectionsAdapter.kt index 0323bf9..a648fd6 100644 --- a/app/src/main/java/guide/graphql/toc/SectionsAdapter.kt +++ b/app/src/main/java/guide/graphql/toc/ui/sections/SectionsAdapter.kt @@ -1,18 +1,25 @@ -package guide.graphql.toc +package guide.graphql.toc.ui.sections import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import guide.graphql.toc.R +import guide.graphql.toc.SectionsQuery import guide.graphql.toc.databinding.SectionBinding class SectionsAdapter( private val chapterNumber: Int?, - private val sections: List, + private var sections: List, private val context: Context ) : RecyclerView.Adapter() { + fun updateSections(sections: List) { + this.sections = sections + notifyDataSetChanged() + } + class ViewHolder(val binding: SectionBinding) : RecyclerView.ViewHolder(binding.root) override fun getItemCount(): Int { diff --git a/app/src/main/java/guide/graphql/toc/ui/sections/SectionsFragment.kt b/app/src/main/java/guide/graphql/toc/ui/sections/SectionsFragment.kt new file mode 100644 index 0000000..33cbbba --- /dev/null +++ b/app/src/main/java/guide/graphql/toc/ui/sections/SectionsFragment.kt @@ -0,0 +1,107 @@ +package guide.graphql.toc.ui.sections + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.lifecycle.Observer +import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import com.apollographql.apollo.coroutines.toDeferred +import com.apollographql.apollo.exception.ApolloException +import com.google.android.material.transition.MaterialFade +import com.google.android.material.transition.MaterialFadeThrough +import guide.graphql.toc.* +import guide.graphql.toc.databinding.SectionsFragmentBinding + +class SectionsFragment : Fragment() { + + private val viewModel: SectionsViewModel by viewModels() + + private lateinit var binding: SectionsFragmentBinding + val args: SectionsFragmentArgs by navArgs() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = SectionsFragmentBinding.inflate(inflater) + return binding.root + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enterTransition = MaterialFade() + exitTransition = MaterialFade().apply { + duration = 0 + } + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val activity = (requireActivity() as AppCompatActivity) + activity.setSupportActionBar(binding.chapterHeader) + activity.supportActionBar?.setDisplayHomeAsUpEnabled(true) + + binding.chapterHeader.setNavigationOnClickListener { + findNavController().navigateUp() + } + + binding.chapterHeader.setNavigationIcon(R.drawable.ic_baseline_arrow_back_24) + activity.title = + if (args.chapterNumber == -1) args.chapterTitle else getString( + R.string.chapter_title, + args.chapterNumber.toString(), + args.chapterTitle + ) + + val adapter = + SectionsAdapter( + args.chapterNumber, + listOf(), + requireContext() + ) + val layoutManager = LinearLayoutManager(requireContext()) + binding.sections.layoutManager = layoutManager + val itemDivider = + DividerItemDecoration(requireContext(), layoutManager.orientation) + binding.sections.addItemDecoration(itemDivider) + binding.sections.adapter = adapter + + viewModel.sectionsList.observe(viewLifecycleOwner, Observer { sectionsResource -> + when (sectionsResource.status) { + Status.SUCCESS -> { + sectionsResource.data?.let { + adapter.updateSections(it) + binding.spinner.visibility = View.GONE + binding.error.visibility = View.GONE + } + } + Status.ERROR -> { + showErrorMessage(sectionsResource.message?: "") + } + Status.LOADING -> { + binding.spinner.visibility = View.VISIBLE + binding.error.visibility = View.GONE + } + } + }) + + + viewModel.chapterId = args.chapterId + + } + + private fun showErrorMessage(error: String) { + binding.spinner.visibility = View.GONE + binding.error.text = error + binding.error.visibility = View.VISIBLE + } +} \ No newline at end of file diff --git a/app/src/main/java/guide/graphql/toc/ui/sections/SectionsViewModel.kt b/app/src/main/java/guide/graphql/toc/ui/sections/SectionsViewModel.kt new file mode 100644 index 0000000..39fc987 --- /dev/null +++ b/app/src/main/java/guide/graphql/toc/ui/sections/SectionsViewModel.kt @@ -0,0 +1,53 @@ +package guide.graphql.toc.ui.sections + +import android.util.Log +import androidx.lifecycle.* +import com.apollographql.apollo.coroutines.toDeferred +import com.apollographql.apollo.exception.ApolloException +import guide.graphql.toc.Resource +import guide.graphql.toc.SectionsQuery +import guide.graphql.toc.apolloClient + +class SectionsViewModel: ViewModel() { + + private val _chapterId: MutableLiveData = MutableLiveData() + + var chapterId: Int + get() { + return _chapterId.value ?: -1 + } + set(value) { + if (value != _chapterId.value) { + _chapterId.value = value + } + } + + val sectionsList: LiveData>> = _chapterId.switchMap { sectionId -> + return@switchMap liveData { + emit(Resource.loading(null)) + try { + val response = apolloClient.query( + SectionsQuery(id = sectionId) + ).toDeferred().await() + + if (response.hasErrors()) { + emit(Resource.error("Response has errors" ,null)) + } + if (response.data?.chapter != null) { + val sections = response.data!!.chapter!!.sections + if (sections.size > 1) { + emit(Resource.success(sections)) + } else { + emit(Resource.error("Empty sections", null)) + } + } else { + emit(Resource.error("Data is empty" ,null)) + } + } catch (e: ApolloException) { + Log.d("ChaptersQuery", "GraphQL request failed", e) + emit(Resource.error("GraphQL request failed", null)) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml b/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml new file mode 100644 index 0000000..a6ae313 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/chapters_fragment.xml b/app/src/main/res/layout/chapters_fragment.xml index ba1e932..7035ee9 100644 --- a/app/src/main/res/layout/chapters_fragment.xml +++ b/app/src/main/res/layout/chapters_fragment.xml @@ -17,7 +17,6 @@ android:id="@+id/book_header" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" - android:title="@string/app_name" app:titleTextColor="?attr/colorOnPrimary" /> diff --git a/app/src/main/res/navigation/main.xml b/app/src/main/res/navigation/main.xml index 8dbb1e1..9e48d8c 100644 --- a/app/src/main/res/navigation/main.xml +++ b/app/src/main/res/navigation/main.xml @@ -7,7 +7,7 @@ + + diff --git a/build.gradle.kts b/build.gradle.kts index 0e99cb8..bb4f840 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath("com.android.tools.build:gradle:4.0.0") + classpath("com.android.tools.build:gradle:4.1.0-beta03") classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.2.2") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72") } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 63f5ab9..6b5f1c3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon May 25 17:51:09 CEST 2020 +#Mon Jul 13 16:43:48 BST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip From 14746ff7e210162c2114db24bd501094fc23b977 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Mon, 13 Jul 2020 19:25:29 +0100 Subject: [PATCH 2/7] Move toolbar to activity --- app/build.gradle.kts | 1 + .../java/guide/graphql/toc/MainActivity.kt | 16 +++++++++- .../main/java/guide/graphql/toc/Resource.kt | 1 - .../toc/ui/chapters/ChaptersFragment.kt | 3 +- .../toc/ui/sections/SectionsFragment.kt | 30 +++++++++---------- app/src/main/res/layout/activity_main.xml | 24 +++++++++++++-- app/src/main/res/layout/chapters_fragment.xml | 18 +---------- app/src/main/res/layout/sections_fragment.xml | 19 +----------- app/src/main/res/values/styles.xml | 3 ++ 9 files changed, 58 insertions(+), 57 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f2cdfae..0a0c85d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -40,6 +40,7 @@ dependencies { implementation("androidx.constraintlayout:constraintlayout:1.1.3") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.2.0") implementation("androidx.recyclerview:recyclerview:1.1.0") + implementation("androidx.navigation:navigation-runtime-ktx:2.3.0") implementation("androidx.navigation:navigation-fragment-ktx:2.3.0") implementation("androidx.navigation:navigation-ui-ktx:2.3.0") implementation("com.google.android.material:material:1.3.0-alpha01") diff --git a/app/src/main/java/guide/graphql/toc/MainActivity.kt b/app/src/main/java/guide/graphql/toc/MainActivity.kt index 43eef63..5392911 100644 --- a/app/src/main/java/guide/graphql/toc/MainActivity.kt +++ b/app/src/main/java/guide/graphql/toc/MainActivity.kt @@ -4,9 +4,14 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.navigation.NavController import androidx.navigation.findNavController +import androidx.navigation.ui.AppBarConfiguration +import androidx.navigation.ui.NavigationUI +import guide.graphql.toc.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { + private lateinit var binding: ActivityMainBinding + private val navigationListener = NavController.OnDestinationChangedListener { controller, destination, arguments -> if (destination.id == R.id.chapters_fragment) { this.setTitle(R.string.app_name) @@ -15,8 +20,17 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + binding = ActivityMainBinding.inflate(layoutInflater) + val view = binding.root + setContentView(view) + + setSupportActionBar(binding.toolbar) + NavigationUI.setupActionBarWithNavController(this, findNavController(R.id.nav_host_fragment)) + + } - setContentView(R.layout.activity_main) + override fun onSupportNavigateUp(): Boolean { + return findNavController(R.id.nav_host_fragment).navigateUp() || super.onSupportNavigateUp() } override fun onResume() { diff --git a/app/src/main/java/guide/graphql/toc/Resource.kt b/app/src/main/java/guide/graphql/toc/Resource.kt index 5dd963b..1cc68d9 100644 --- a/app/src/main/java/guide/graphql/toc/Resource.kt +++ b/app/src/main/java/guide/graphql/toc/Resource.kt @@ -1,7 +1,6 @@ package guide.graphql.toc //https://github.com/android/architecture-components-samples/blob/master/GithubBrowserSample/app/src/main/java/com/android/example/github/vo/Resource.kt - data class Resource(val status: Status, val data: T?, val message: String?) { companion object { fun success(data: T?): Resource { diff --git a/app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersFragment.kt b/app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersFragment.kt index a256c52..f8d62aa 100644 --- a/app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersFragment.kt +++ b/app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersFragment.kt @@ -41,8 +41,7 @@ class ChaptersFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - (requireActivity() as AppCompatActivity).setSupportActionBar(binding.bookHeader) - + requireActivity() val adapter = ChaptersAdapter( listOf(), diff --git a/app/src/main/java/guide/graphql/toc/ui/sections/SectionsFragment.kt b/app/src/main/java/guide/graphql/toc/ui/sections/SectionsFragment.kt index 33cbbba..152d853 100644 --- a/app/src/main/java/guide/graphql/toc/ui/sections/SectionsFragment.kt +++ b/app/src/main/java/guide/graphql/toc/ui/sections/SectionsFragment.kt @@ -46,21 +46,21 @@ class SectionsFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val activity = (requireActivity() as AppCompatActivity) - activity.setSupportActionBar(binding.chapterHeader) - activity.supportActionBar?.setDisplayHomeAsUpEnabled(true) - - binding.chapterHeader.setNavigationOnClickListener { - findNavController().navigateUp() - } - - binding.chapterHeader.setNavigationIcon(R.drawable.ic_baseline_arrow_back_24) - activity.title = - if (args.chapterNumber == -1) args.chapterTitle else getString( - R.string.chapter_title, - args.chapterNumber.toString(), - args.chapterTitle - ) +// val activity = (requireActivity() as AppCompatActivity) +// activity.setSupportActionBar(binding.chapterHeader) +// activity.supportActionBar?.setDisplayHomeAsUpEnabled(true) +// +// binding.chapterHeader.setNavigationOnClickListener { +// findNavController().navigateUp() +// } +// +// binding.chapterHeader.setNavigationIcon(R.drawable.ic_baseline_arrow_back_24) +// activity.title = +// if (args.chapterNumber == -1) args.chapterTitle else getString( +// R.string.chapter_title, +// args.chapterNumber.toString(), +// args.chapterTitle +// ) val adapter = SectionsAdapter( diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 20d20a1..ac96bcb 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,5 +1,5 @@ - - + + + + + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/chapters_fragment.xml b/app/src/main/res/layout/chapters_fragment.xml index 7035ee9..5c5388e 100644 --- a/app/src/main/res/layout/chapters_fragment.xml +++ b/app/src/main/res/layout/chapters_fragment.xml @@ -4,22 +4,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - - - - + app:layout_constraintTop_toTopOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/sections_fragment.xml b/app/src/main/res/layout/sections_fragment.xml index 00f805f..00425ab 100644 --- a/app/src/main/res/layout/sections_fragment.xml +++ b/app/src/main/res/layout/sections_fragment.xml @@ -5,23 +5,6 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - - - + app:layout_constraintTop_toTopOf="parent" /> + +