From 232fdf02695da9f2afcea023d2e74939021a8b64 Mon Sep 17 00:00:00 2001 From: machiav3lli Date: Sun, 24 Oct 2021 16:47:55 +0200 Subject: [PATCH] Update: Multilevel Fragments with Screen- and BaseFragment --- .../looker/droidify/screen/BaseFragment.kt | 10 ++++++ .../droidify/screen/EditRepositoryFragment.kt | 36 +++++-------------- .../looker/droidify/screen/ProductFragment.kt | 14 -------- .../droidify/screen/ProductsFragment.kt | 2 +- .../droidify/screen/RepositoriesFragment.kt | 16 ++++----- .../droidify/screen/RepositoryFragment.kt | 15 ++------ .../looker/droidify/screen/ScreenFragment.kt | 22 +++++++++--- .../droidify/screen/SettingsFragment.kt | 11 +----- .../looker/droidify/screen/TabsFragment.kt | 11 ------ 9 files changed, 48 insertions(+), 89 deletions(-) create mode 100644 src/main/kotlin/com/looker/droidify/screen/BaseFragment.kt diff --git a/src/main/kotlin/com/looker/droidify/screen/BaseFragment.kt b/src/main/kotlin/com/looker/droidify/screen/BaseFragment.kt new file mode 100644 index 00000000..e0ca5456 --- /dev/null +++ b/src/main/kotlin/com/looker/droidify/screen/BaseFragment.kt @@ -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 +} diff --git a/src/main/kotlin/com/looker/droidify/screen/EditRepositoryFragment.kt b/src/main/kotlin/com/looker/droidify/screen/EditRepositoryFragment.kt index 7d35aaa6..c0a6d62d 100644 --- a/src/main/kotlin/com/looker/droidify/screen/EditRepositoryFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/EditRepositoryFragment.kt @@ -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() - 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(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(R.id.fragment_content)!! errorColorFilter = PorterDuffColorFilter( diff --git a/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt index 6a1666a5..b96f70d0 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt @@ -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(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() diff --git a/src/main/kotlin/com/looker/droidify/screen/ProductsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ProductsFragment.kt index e74689dd..70a5dc63 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductsFragment.kt @@ -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" diff --git a/src/main/kotlin/com/looker/droidify/screen/RepositoriesFragment.kt b/src/main/kotlin/com/looker/droidify/screen/RepositoriesFragment.kt index fc6c38f3..90791a95 100644 --- a/src/main/kotlin/com/looker/droidify/screen/RepositoriesFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/RepositoriesFragment.kt @@ -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(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(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() } diff --git a/src/main/kotlin/com/looker/droidify/screen/RepositoryFragment.kt b/src/main/kotlin/com/looker/droidify/screen/RepositoryFragment.kt index a05dc94a..310769c2 100644 --- a/src/main/kotlin/com/looker/droidify/screen/RepositoryFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/RepositoryFragment.kt @@ -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(R.id.toolbar)!! screenActivity.onToolbarCreated(toolbar) toolbar.setTitle(R.string.repository) diff --git a/src/main/kotlin/com/looker/droidify/screen/ScreenFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ScreenFragment.kt index 88fea135..a7372490 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ScreenFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ScreenFragment.kt @@ -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 + } } diff --git a/src/main/kotlin/com/looker/droidify/screen/SettingsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/SettingsFragment.kt index 3ee766ae..0747fc29 100644 --- a/src/main/kotlin/com/looker/droidify/screen/SettingsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/SettingsFragment.kt @@ -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, 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) diff --git a/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt index 81f8af2b..4db6f18f 100644 --- a/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt @@ -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(R.id.toolbar)!! screenActivity.onToolbarCreated(toolbar) toolbar.setTitle(R.string.application_name) // Move focus from SearchView to Toolbar