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.TextWatcher
import android.util.Base64
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.FrameLayout
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.DialogFragment
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.looker.droidify.R
@ -85,37 +83,21 @@ class EditRepositoryFragment() : ScreenFragment() {
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?) {
super.onViewCreated(view, savedInstanceState)
syncConnection.bind(requireContext())
val toolbar = view.findViewById<Toolbar>(R.id.toolbar)!!
screenActivity.onToolbarCreated(toolbar)
if (repositoryId != null) {
toolbar.setTitle(R.string.edit_repository)
} else {
toolbar.setTitle(R.string.add_repository)
}
toolbar.setTitle(if (repositoryId != null) R.string.edit_repository else R.string.add_repository)
toolbar.menu.apply {
saveMenuItem = add(R.string.save)
.setIcon(Utils.getToolbarIcon(toolbar.context, R.drawable.ic_save))
.setEnabled(false)
.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS)
.setOnMenuItemClickListener {
onSaveRepositoryClick(true)
true
}
}
saveMenuItem = toolbar.menu.add(R.string.save)
.setIcon(Utils.getToolbarIcon(toolbar.context, R.drawable.ic_save))
.setEnabled(false)
.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS)
.setOnMenuItemClickListener {
onSaveRepositoryClick(true)
true
}
val content = view.findViewById<FrameLayout>(R.id.fragment_content)!!
errorColorFilter = PorterDuffColorFilter(

View File

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

View File

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

View File

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

View File

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

View File

@ -1,10 +1,22 @@
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() {
val screenActivity: ScreenActivity
get() = requireActivity() as ScreenActivity
open class ScreenFragment : BaseFragment() {
lateinit var toolbar: Toolbar
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.text.InputFilter
import android.text.InputType
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.*
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.Toolbar
import androidx.core.net.toUri
import androidx.core.widget.NestedScrollView
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import com.google.android.material.dialog.MaterialAlertDialogBuilder
@ -29,14 +28,6 @@ class SettingsFragment : ScreenFragment() {
private val preferences = mutableMapOf<Preferences.Key<*>, Preference<*>>()
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?) {
super.onViewCreated(view, savedInstanceState)

View File

@ -13,7 +13,6 @@ import android.view.animation.AccelerateInterpolator
import android.view.animation.DecelerateInterpolator
import android.widget.*
import androidx.appcompat.widget.SearchView
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
@ -103,20 +102,10 @@ class TabsFragment : ScreenFragment() {
get() = if (host == null) emptySequence() else
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?) {
super.onViewCreated(view, savedInstanceState)
syncConnection.bind(requireContext())
val toolbar = view.findViewById<Toolbar>(R.id.toolbar)!!
screenActivity.onToolbarCreated(toolbar)
toolbar.setTitle(R.string.application_name)
// Move focus from SearchView to Toolbar