diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/Common.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/Common.kt deleted file mode 100644 index 8bac67f..0000000 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/Common.kt +++ /dev/null @@ -1,6 +0,0 @@ -package nya.kitsunyan.foxydroid.screen - -import androidx.fragment.app.Fragment - -val Fragment.screenActivity: ScreenActivity - get() = requireActivity() as ScreenActivity diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/EditRepositoryFragment.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/EditRepositoryFragment.kt index acf78f8..13d2dc5 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/EditRepositoryFragment.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/EditRepositoryFragment.kt @@ -20,7 +20,6 @@ import android.widget.FrameLayout import android.widget.TextView import android.widget.Toolbar import androidx.fragment.app.DialogFragment -import androidx.fragment.app.Fragment import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single @@ -44,7 +43,7 @@ import java.nio.charset.Charset import java.util.Locale import kotlin.math.* -class EditRepositoryFragment(): Fragment() { +class EditRepositoryFragment(): ScreenFragment() { companion object { private const val EXTRA_REPOSITORY_ID = "repositoryId" @@ -95,8 +94,8 @@ class EditRepositoryFragment(): Fragment() { syncConnection.bind(requireContext()) - val toolbar = view.findViewById(R.id.toolbar) - screenActivity.onFragmentViewCreated(toolbar) + val toolbar = view.findViewById(R.id.toolbar)!! + screenActivity.onToolbarCreated(toolbar) if (repositoryId != null) { toolbar.setTitle(R.string.edit_repository) } else { @@ -114,7 +113,7 @@ class EditRepositoryFragment(): Fragment() { } } - val content = view.findViewById(R.id.fragment_content) + val content = view.findViewById(R.id.fragment_content)!! errorColorFilter = PorterDuffColorFilter(content.context .getColorFromAttr(R.attr.colorError).defaultColor, PorterDuff.Mode.SRC_IN) diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/PreferencesFragment.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/PreferencesFragment.kt index c295747..c5b0fd8 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/PreferencesFragment.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/PreferencesFragment.kt @@ -24,7 +24,7 @@ import nya.kitsunyan.foxydroid.R import nya.kitsunyan.foxydroid.content.Preferences import nya.kitsunyan.foxydroid.utility.extension.resources.* -class PreferencesFragment: Fragment() { +class PreferencesFragment: ScreenFragment() { private val preferences = mutableMapOf, Preference<*>>() private var disposable: Disposable? = null @@ -35,11 +35,11 @@ class PreferencesFragment: Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val toolbar = view.findViewById(R.id.toolbar) - screenActivity.onFragmentViewCreated(toolbar) + val toolbar = view.findViewById(R.id.toolbar)!! + screenActivity.onToolbarCreated(toolbar) toolbar.setTitle(R.string.preferences) - val content = view.findViewById(R.id.fragment_content) + val content = view.findViewById(R.id.fragment_content)!! val scroll = ScrollView(content.context) scroll.id = R.id.preferences_list scroll.isFillViewport = true diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductFragment.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductFragment.kt index a3bf67c..56b62fe 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductFragment.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductFragment.kt @@ -13,7 +13,6 @@ import android.view.View import android.view.ViewGroup import android.widget.FrameLayout import android.widget.Toolbar -import androidx.fragment.app.Fragment import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -35,7 +34,7 @@ import nya.kitsunyan.foxydroid.utility.RxUtils import nya.kitsunyan.foxydroid.utility.Utils import nya.kitsunyan.foxydroid.widget.DividerItemDecoration -class ProductFragment(): Fragment(), ProductAdapter.Callbacks { +class ProductFragment(): ScreenFragment(), ProductAdapter.Callbacks { companion object { private const val EXTRA_PACKAGE_NAME = "packageName" @@ -87,8 +86,8 @@ class ProductFragment(): Fragment(), ProductAdapter.Callbacks { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val toolbar = view.findViewById(R.id.toolbar) - screenActivity.onFragmentViewCreated(toolbar) + val toolbar = view.findViewById(R.id.toolbar)!! + screenActivity.onToolbarCreated(toolbar) toolbar.setTitle(R.string.application) this.toolbar = toolbar @@ -105,7 +104,7 @@ class ProductFragment(): Fragment(), ProductAdapter.Callbacks { } } - val content = view.findViewById(R.id.fragment_content) + val content = view.findViewById(R.id.fragment_content)!! content.addView(RecyclerView(content.context).apply { id = android.R.id.list val columns = (resources.configuration.screenWidthDp / 120).coerceIn(3, 5) diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductsFragment.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductsFragment.kt index e75c37c..df44eb7 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductsFragment.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductsFragment.kt @@ -6,7 +6,6 @@ import android.os.Parcelable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers @@ -22,7 +21,7 @@ import nya.kitsunyan.foxydroid.utility.extension.resources.* import nya.kitsunyan.foxydroid.widget.DividerItemDecoration import nya.kitsunyan.foxydroid.widget.RecyclerFastScroller -class ProductsFragment(): Fragment(), CursorOwner.Callback { +class ProductsFragment(): ScreenFragment(), CursorOwner.Callback { companion object { private const val EXTRA_SOURCE = "source" diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/RepositoriesFragment.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/RepositoriesFragment.kt index d130649..88db686 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/RepositoriesFragment.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/RepositoriesFragment.kt @@ -8,7 +8,6 @@ import android.view.View import android.view.ViewGroup import android.widget.FrameLayout import android.widget.Toolbar -import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import nya.kitsunyan.foxydroid.R @@ -17,14 +16,14 @@ import nya.kitsunyan.foxydroid.service.Connection import nya.kitsunyan.foxydroid.service.SyncService import nya.kitsunyan.foxydroid.utility.Utils -class RepositoriesFragment: Fragment(), CursorOwner.Callback { +class RepositoriesFragment: ScreenFragment(), CursorOwner.Callback { private var recyclerView: RecyclerView? = null private val syncConnection = Connection(SyncService::class.java) override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return inflater.inflate(R.layout.fragment, container, false).apply { - val content = findViewById(R.id.fragment_content) + val content = findViewById(R.id.fragment_content)!! content.addView(RecyclerView(content.context).apply { id = android.R.id.list layoutManager = LinearLayoutManager(context) @@ -44,8 +43,8 @@ class RepositoriesFragment: Fragment(), CursorOwner.Callback { syncConnection.bind(requireContext()) screenActivity.cursorOwner.attach(this, CursorOwner.Request.Repositories) - val toolbar = view.findViewById(R.id.toolbar) - screenActivity.onFragmentViewCreated(toolbar) + val toolbar = view.findViewById(R.id.toolbar)!! + screenActivity.onToolbarCreated(toolbar) toolbar.setTitle(R.string.repositories) toolbar.menu.apply { diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/RepositoryFragment.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/RepositoryFragment.kt index c03739a..0cb43c6 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/RepositoryFragment.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/RepositoryFragment.kt @@ -14,7 +14,6 @@ import android.widget.LinearLayout import android.widget.ScrollView import android.widget.TextView import android.widget.Toolbar -import androidx.fragment.app.Fragment import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.Disposable @@ -27,7 +26,7 @@ import nya.kitsunyan.foxydroid.utility.extension.resources.* import java.util.Date import java.util.Locale -class RepositoryFragment(): Fragment() { +class RepositoryFragment(): ScreenFragment() { companion object { private const val EXTRA_REPOSITORY_ID = "repositoryId" } @@ -59,8 +58,8 @@ class RepositoryFragment(): Fragment() { .observeOn(AndroidSchedulers.mainThread()) .subscribe { updateRepositoryView() } - val toolbar = view.findViewById(R.id.toolbar) - screenActivity.onFragmentViewCreated(toolbar) + val toolbar = view.findViewById(R.id.toolbar)!! + screenActivity.onToolbarCreated(toolbar) toolbar.setTitle(R.string.repository) toolbar.menu.apply { @@ -81,7 +80,7 @@ class RepositoryFragment(): Fragment() { } } - val content = view.findViewById(R.id.fragment_content) + val content = view.findViewById(R.id.fragment_content)!! val scroll = ScrollView(content.context) scroll.id = android.R.id.list scroll.isFillViewport = true @@ -151,9 +150,9 @@ class RepositoryFragment(): Fragment() { private fun LinearLayout.addTitleText(titleResId: Int, text: CharSequence) { if (text.isNotEmpty()) { val layout = inflate(R.layout.title_text_item) - val titleView = layout.findViewById(R.id.title) + val titleView = layout.findViewById(R.id.title)!! titleView.setText(titleResId) - val textView = layout.findViewById(R.id.text) + val textView = layout.findViewById(R.id.text)!! textView.text = text addView(layout) } diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenActivity.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenActivity.kt index 739e7d4..b21cda3 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenActivity.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenActivity.kt @@ -21,7 +21,6 @@ import nya.kitsunyan.foxydroid.utility.Utils import nya.kitsunyan.foxydroid.utility.extension.android.* import nya.kitsunyan.foxydroid.utility.extension.resources.* import nya.kitsunyan.foxydroid.utility.extension.text.* -import java.lang.ref.WeakReference abstract class ScreenActivity: FragmentActivity() { companion object { @@ -58,7 +57,6 @@ abstract class ScreenActivity: FragmentActivity() { private set private val fragmentStack = mutableListOf() - private var toolbar: WeakReference? = null private val currentFragment: Fragment? get() { @@ -105,10 +103,8 @@ abstract class ScreenActivity: FragmentActivity() { } override fun onBackPressed() { - val menuItem = toolbar?.get()?.menu?.findItem(R.id.toolbar_search) - if (menuItem != null && menuItem.isActionViewExpanded) { - menuItem.collapseActionView() - } else { + val currentFragment = currentFragment + if (!(currentFragment is ScreenFragment && currentFragment.onBackPressed())) { hideKeyboard() if (!popFragment()) { super.onBackPressed() @@ -159,9 +155,8 @@ abstract class ScreenActivity: FragmentActivity() { hideKeyboard() } - internal fun onFragmentViewCreated(toolbar: Toolbar?) { - this.toolbar = toolbar?.let(::WeakReference) - if (fragmentStack.isNotEmpty() && toolbar != null) { + internal fun onToolbarCreated(toolbar: Toolbar) { + if (fragmentStack.isNotEmpty()) { toolbar.navigationIcon = toolbar.context.getDrawableFromAttr(android.R.attr.homeAsUpIndicator) toolbar.setNavigationOnClickListener { onBackPressed() } } diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenFragment.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenFragment.kt new file mode 100644 index 0000000..33551d0 --- /dev/null +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenFragment.kt @@ -0,0 +1,10 @@ +package nya.kitsunyan.foxydroid.screen + +import androidx.fragment.app.Fragment + +open class ScreenFragment: Fragment() { + val screenActivity: ScreenActivity + get() = requireActivity() as ScreenActivity + + open fun onBackPressed(): Boolean = false +} diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/TabsFragment.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/TabsFragment.kt index 08a743f..66013aa 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/TabsFragment.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/TabsFragment.kt @@ -44,7 +44,7 @@ import nya.kitsunyan.foxydroid.utility.extension.text.* import nya.kitsunyan.foxydroid.widget.EnumRecyclerAdapter import kotlin.math.* -class TabsFragment: Fragment() { +class TabsFragment: ScreenFragment() { companion object { private const val STATE_SEARCH_QUERY = "searchQuery" private const val STATE_SHOW_CATEGORIES = "showCategories" @@ -61,6 +61,7 @@ class TabsFragment: Fragment() { val categoryIcon = view.findViewById(R.id.category_icon)!! } + private var searchMenuItem: MenuItem? = null private var sortOrderMenu: Pair>? = null private var syncRepositoriesMenuItem: MenuItem? = null private var layout: Layout? = null @@ -111,8 +112,8 @@ class TabsFragment: Fragment() { syncConnection.bind(requireContext()) - val toolbar = view.findViewById(R.id.toolbar) - screenActivity.onFragmentViewCreated(toolbar) + val toolbar = view.findViewById(R.id.toolbar)!! + screenActivity.onToolbarCreated(toolbar) toolbar.setTitle(R.string.app_name) val searchView = SearchView(toolbar.context) @@ -137,7 +138,7 @@ class TabsFragment: Fragment() { setGroupDividerEnabled(true) } - add(0, R.id.toolbar_search, 0, R.string.search) + searchMenuItem = add(0, R.id.toolbar_search, 0, R.string.search) .setIcon(Utils.getToolbarIcon(toolbar.context, R.drawable.ic_search)) .setActionView(searchView) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS or MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) @@ -183,7 +184,7 @@ class TabsFragment: Fragment() { searchQuery = savedInstanceState?.getString(STATE_SEARCH_QUERY).orEmpty() productFragments.forEach { it.setSearchQuery(searchQuery) } - val toolbarExtra = view.findViewById(R.id.toolbar_extra) + val toolbarExtra = view.findViewById(R.id.toolbar_extra)!! toolbarExtra.addView(toolbarExtra.inflate(R.layout.tabs_toolbar)) val layout = Layout(view) this.layout = layout @@ -219,7 +220,7 @@ class TabsFragment: Fragment() { sortOrderMenu!!.second[order.ordinal].isChecked = true productFragments.forEach { it.setOrder(order) } - val content = view.findViewById(R.id.fragment_content) + val content = view.findViewById(R.id.fragment_content)!! viewPager = ViewPager2(content.context).apply { id = R.id.fragment_pager @@ -289,6 +290,7 @@ class TabsFragment: Fragment() { override fun onDestroyView() { super.onDestroyView() + searchMenuItem = null sortOrderMenu = null syncRepositoriesMenuItem = null layout = null @@ -331,6 +333,22 @@ class TabsFragment: Fragment() { } } + override fun onBackPressed(): Boolean { + return when { + searchMenuItem?.isActionViewExpanded == true -> { + searchMenuItem?.collapseActionView() + true + } + showCategories -> { + showCategories = false + true + } + else -> { + super.onBackPressed() + } + } + } + private fun setSelectedTab(source: ProductsFragment.Source) { val layout = layout!! (0 until layout.tabs.childCount).forEach { layout.tabs.getChildAt(it).isSelected = it == source.ordinal }