Update: Multilevel Fragments with Screen- and BaseFragment

This commit is contained in:
machiav3lli 2021-10-24 16:47:55 +02:00
parent e95ef29e42
commit 232fdf0269
9 changed files with 48 additions and 89 deletions

View File

@ -0,0 +1,10 @@
package com.looker.droidify.screen
import androidx.fragment.app.Fragment
open class BaseFragment : Fragment() {
val screenActivity: ScreenActivity
get() = requireActivity() as ScreenActivity
open fun onBackPressed(): Boolean = false
}

View File

@ -10,14 +10,12 @@ import android.text.Editable
import android.text.Selection import android.text.Selection
import android.text.TextWatcher import android.text.TextWatcher
import android.util.Base64 import android.util.Base64
import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.EditText import android.widget.EditText
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.looker.droidify.R import com.looker.droidify.R
@ -85,29 +83,14 @@ class EditRepositoryFragment() : ScreenFragment() {
private var takenAddresses = emptySet<String>() private var takenAddresses = emptySet<String>()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return inflater.inflate(R.layout.fragment, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
syncConnection.bind(requireContext()) syncConnection.bind(requireContext())
val toolbar = view.findViewById<Toolbar>(R.id.toolbar)!!
screenActivity.onToolbarCreated(toolbar) screenActivity.onToolbarCreated(toolbar)
if (repositoryId != null) { toolbar.setTitle(if (repositoryId != null) R.string.edit_repository else R.string.add_repository)
toolbar.setTitle(R.string.edit_repository)
} else {
toolbar.setTitle(R.string.add_repository)
}
toolbar.menu.apply { saveMenuItem = toolbar.menu.add(R.string.save)
saveMenuItem = add(R.string.save)
.setIcon(Utils.getToolbarIcon(toolbar.context, R.drawable.ic_save)) .setIcon(Utils.getToolbarIcon(toolbar.context, R.drawable.ic_save))
.setEnabled(false) .setEnabled(false)
.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS)
@ -115,7 +98,6 @@ class EditRepositoryFragment() : ScreenFragment() {
onSaveRepositoryClick(true) onSaveRepositoryClick(true)
true true
} }
}
val content = view.findViewById<FrameLayout>(R.id.fragment_content)!! val content = view.findViewById<FrameLayout>(R.id.fragment_content)!!
errorColorFilter = PorterDuffColorFilter( errorColorFilter = PorterDuffColorFilter(

View File

@ -81,7 +81,6 @@ class ProductFragment() : ScreenFragment(), ProductAdapter.Callbacks {
private var installed: Installed? = null private var installed: Installed? = null
private var downloading = false private var downloading = false
private var toolbar: Toolbar? = null
private var recyclerView: RecyclerView? = null private var recyclerView: RecyclerView? = null
private var productDisposable: Disposable? = null private var productDisposable: Disposable? = null
@ -94,21 +93,10 @@ class ProductFragment() : ScreenFragment(), ProductAdapter.Callbacks {
downloadDisposable = null downloadDisposable = null
}) })
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val toolbar = view.findViewById<Toolbar>(R.id.toolbar)!!
screenActivity.onToolbarCreated(toolbar) screenActivity.onToolbarCreated(toolbar)
this.toolbar = toolbar
toolbar.menu.apply { toolbar.menu.apply {
for (action in Action.values()) { for (action in Action.values()) {
add(0, action.id, 0, action.adapterAction.titleResId) add(0, action.id, 0, action.adapterAction.titleResId)
@ -253,8 +241,6 @@ class ProductFragment() : ScreenFragment(), ProductAdapter.Callbacks {
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
toolbar = null
recyclerView = null recyclerView = null
productDisposable?.dispose() productDisposable?.dispose()

View File

@ -19,7 +19,7 @@ import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
class ProductsFragment() : ScreenFragment(), CursorOwner.Callback { class ProductsFragment() : BaseFragment(), CursorOwner.Callback {
companion object { companion object {
private const val EXTRA_SOURCE = "source" private const val EXTRA_SOURCE = "source"

View File

@ -7,7 +7,6 @@ import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.appcompat.widget.Toolbar
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.looker.droidify.R import com.looker.droidify.R
@ -26,7 +25,7 @@ class RepositoriesFragment : ScreenFragment(), CursorOwner.Callback {
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
return inflater.inflate(R.layout.fragment, container, false).apply { val view = inflater.inflate(R.layout.fragment, container, false).apply {
val content = findViewById<FrameLayout>(R.id.fragment_content)!! val content = findViewById<FrameLayout>(R.id.fragment_content)!!
content.addView(RecyclerView(content.context).apply { content.addView(RecyclerView(content.context).apply {
id = android.R.id.list id = android.R.id.list
@ -41,6 +40,8 @@ class RepositoriesFragment : ScreenFragment(), CursorOwner.Callback {
recyclerView = this recyclerView = this
}, FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT) }, FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)
} }
this.toolbar = view.findViewById(R.id.toolbar)
return view
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -49,13 +50,12 @@ class RepositoriesFragment : ScreenFragment(), CursorOwner.Callback {
syncConnection.bind(requireContext()) syncConnection.bind(requireContext())
screenActivity.cursorOwner.attach(this, CursorOwner.Request.Repositories) screenActivity.cursorOwner.attach(this, CursorOwner.Request.Repositories)
val toolbar = view.findViewById<Toolbar>(R.id.toolbar)!! toolbar.apply {
screenActivity.onToolbarCreated(toolbar) screenActivity.onToolbarCreated(this)
toolbar.setTitle(R.string.repositories) setTitle(R.string.repositories)
toolbar.menu.apply { menu.add(R.string.add_repository)
add(R.string.add_repository) .setIcon(Utils.getToolbarIcon(this.context, R.drawable.ic_add))
.setIcon(Utils.getToolbarIcon(toolbar.context, R.drawable.ic_add))
.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS)
.setOnMenuItemClickListener { .setOnMenuItemClickListener {
view.post { screenActivity.navigateAddRepository() } view.post { screenActivity.navigateAddRepository() }

View File

@ -5,15 +5,13 @@ import android.text.SpannableStringBuilder
import android.text.format.DateUtils import android.text.format.DateUtils
import android.text.style.ForegroundColorSpan import android.text.style.ForegroundColorSpan
import android.text.style.TypefaceSpan import android.text.style.TypefaceSpan
import android.view.LayoutInflater
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.ScrollView
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.widget.Toolbar import androidx.core.widget.NestedScrollView
import com.looker.droidify.R import com.looker.droidify.R
import com.looker.droidify.database.Database import com.looker.droidify.database.Database
import com.looker.droidify.service.Connection import com.looker.droidify.service.Connection
@ -46,24 +44,15 @@ class RepositoryFragment() : ScreenFragment() {
private val syncConnection = Connection(SyncService::class.java) private val syncConnection = Connection(SyncService::class.java)
private var repositoryDisposable: Disposable? = null private var repositoryDisposable: Disposable? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return inflater.inflate(R.layout.fragment, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
syncConnection.bind(requireContext()) syncConnection.bind(requireContext())
repositoryDisposable = Observable.just(Unit) repositoryDisposable = Observable.just(Unit)
.concatWith(Database.observable(Database.Subject.Repository(repositoryId))) .concatWith(Database.observable(Database.Subject.Repository(repositoryId)))
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe { updateRepositoryView() } .subscribe { updateRepositoryView() }
val toolbar = view.findViewById<Toolbar>(R.id.toolbar)!!
screenActivity.onToolbarCreated(toolbar) screenActivity.onToolbarCreated(toolbar)
toolbar.setTitle(R.string.repository) toolbar.setTitle(R.string.repository)

View File

@ -1,10 +1,22 @@
package com.looker.droidify.screen package com.looker.droidify.screen
import androidx.fragment.app.Fragment import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar
import com.looker.droidify.R
open class ScreenFragment : Fragment() { open class ScreenFragment : BaseFragment() {
val screenActivity: ScreenActivity lateinit var toolbar: Toolbar
get() = requireActivity() as ScreenActivity
open fun onBackPressed(): Boolean = false override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment, container, false)
this.toolbar = view.findViewById(R.id.toolbar)
return view
}
} }

View File

@ -6,14 +6,13 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.text.InputFilter import android.text.InputFilter
import android.text.InputType import android.text.InputType
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager import android.view.WindowManager
import android.widget.* import android.widget.*
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.Toolbar
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.widget.NestedScrollView
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
@ -29,14 +28,6 @@ class SettingsFragment : ScreenFragment() {
private val preferences = mutableMapOf<Preferences.Key<*>, Preference<*>>() private val preferences = mutableMapOf<Preferences.Key<*>, Preference<*>>()
private var disposable: Disposable? = null private var disposable: Disposable? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return inflater.inflate(R.layout.fragment, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)

View File

@ -13,7 +13,6 @@ import android.view.animation.AccelerateInterpolator
import android.view.animation.DecelerateInterpolator import android.view.animation.DecelerateInterpolator
import android.widget.* import android.widget.*
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -103,20 +102,10 @@ class TabsFragment : ScreenFragment() {
get() = if (host == null) emptySequence() else get() = if (host == null) emptySequence() else
childFragmentManager.fragments.asSequence().mapNotNull { it as? ProductsFragment } childFragmentManager.fragments.asSequence().mapNotNull { it as? ProductsFragment }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return inflater.inflate(R.layout.fragment, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
syncConnection.bind(requireContext()) syncConnection.bind(requireContext())
val toolbar = view.findViewById<Toolbar>(R.id.toolbar)!!
screenActivity.onToolbarCreated(toolbar) screenActivity.onToolbarCreated(toolbar)
toolbar.setTitle(R.string.application_name) toolbar.setTitle(R.string.application_name)
// Move focus from SearchView to Toolbar // Move focus from SearchView to Toolbar