From e05f0894e872eb16f041705d34a232f4e4449106 Mon Sep 17 00:00:00 2001 From: Jeff Boek Date: Thu, 28 Feb 2019 16:16:45 -0800 Subject: [PATCH] For #673 - Modifies Session Bottom Sheet to work for current and archived sessions --- .../org/mozilla/fenix/home/HomeFragment.kt | 34 ++++++--- .../CurrentSessionBottomSheetFragment.kt | 51 -------------- .../sessions/SessionBottomSheetFragment.kt | 70 +++++++++++++++++++ ...tom_sheet.xml => session_bottom_sheet.xml} | 16 +++-- 4 files changed, 106 insertions(+), 65 deletions(-) delete mode 100644 app/src/main/java/org/mozilla/fenix/home/sessions/CurrentSessionBottomSheetFragment.kt create mode 100644 app/src/main/java/org/mozilla/fenix/home/sessions/SessionBottomSheetFragment.kt rename app/src/main/res/layout/{current_session_bottom_sheet.xml => session_bottom_sheet.xml} (88%) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 16f3d8c63..7f26b6e8b 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -31,7 +31,7 @@ import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.home.sessions.ArchivedSession -import org.mozilla.fenix.home.sessions.CurrentSessionBottomSheetFragment +import org.mozilla.fenix.home.sessions.SessionBottomSheetFragment import org.mozilla.fenix.home.sessions.SessionsAction import org.mozilla.fenix.home.sessions.SessionsChange import org.mozilla.fenix.home.sessions.SessionsComponent @@ -181,7 +181,11 @@ class HomeFragment : Fragment() { is TabsAction.Archive -> { requireComponents.core.sessionStorage.archive(requireComponents.core.sessionManager) } - is TabsAction.MenuTapped -> openSessionMenu() + is TabsAction.MenuTapped -> { + requireComponents.core.sessionStorage.current() + ?.let { ArchivedSession(it.id!!, it, it.lastSavedAt, it.urls) } + ?.also { openSessionMenu(it) } + } is TabsAction.Select -> { val session = requireComponents.core.sessionManager.findSessionById(it.sessionId) requireComponents.core.sessionManager.select(session!!) @@ -211,7 +215,7 @@ class HomeFragment : Fragment() { is SessionsAction.Delete -> { requireComponents.core.sessionStorage.remove(it.archivedSession.bundle) } - is SessionsAction.MenuTapped -> openSessionMenu() + is SessionsAction.MenuTapped -> openSessionMenu(it.archivedSession) } } } @@ -319,12 +323,26 @@ class HomeFragment : Fragment() { ) } - private fun openSessionMenu() { - CurrentSessionBottomSheetFragment().show( - requireActivity().supportFragmentManager, - CurrentSessionBottomSheetFragment.overflowFragmentTag + private fun openSessionMenu(archivedSession: ArchivedSession) { + val isCurrentSession = archivedSession.bundle.id == requireComponents.core.sessionStorage.current()?.id + SessionBottomSheetFragment().also { + it.archivedSession = archivedSession + it.isCurrentSession = isCurrentSession + it.onArchive = { + if (isCurrentSession) { + requireComponents.core.sessionStorage.archive(requireComponents.core.sessionManager) + } + } + it.onDelete = { + if (isCurrentSession) { + requireComponents.useCases.tabsUseCases.removeAllTabsOfType.invoke(false) + } - ) + requireComponents.core.sessionStorage.remove(archivedSession.bundle) + + true + } + }.show(requireActivity().supportFragmentManager, SessionBottomSheetFragment.overflowFragmentTag) } companion object { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessions/CurrentSessionBottomSheetFragment.kt b/app/src/main/java/org/mozilla/fenix/home/sessions/CurrentSessionBottomSheetFragment.kt deleted file mode 100644 index 439a1a526..000000000 --- a/app/src/main/java/org/mozilla/fenix/home/sessions/CurrentSessionBottomSheetFragment.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.home.sessions - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import kotlinx.android.extensions.LayoutContainer -import kotlinx.android.synthetic.main.current_session_bottom_sheet.view.* -import org.mozilla.fenix.HomeActivity -import org.mozilla.fenix.R -import org.mozilla.fenix.ext.requireComponents - -class CurrentSessionBottomSheetFragment : BottomSheetDialogFragment(), LayoutContainer { - - override val containerView: View? - get() = view - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setStyle(BottomSheetDialogFragment.STYLE_NORMAL, R.style.CurrentSessionBottomSheetDialogTheme) - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val view = inflater.inflate(R.layout.current_session_bottom_sheet, container, false) - val sessions = requireComponents.core.sessionManager.sessions.filter { - (activity as HomeActivity).browsingModeManager.isPrivate == it.private - } - - view.current_session_card_tab_list.text = sessions.joinToString(", ") { - if (it.title.length > maxTitleLength) it.title.substring(0, maxTitleLength) + "..." else it.title - } - - view.delete_session_button.setOnClickListener { - sessions.forEach { - requireComponents.core.sessionManager.remove(it) - } - dismiss() - } - return view - } - - companion object { - const val maxTitleLength = 20 - const val overflowFragmentTag = "sessionOverflow" - } -} diff --git a/app/src/main/java/org/mozilla/fenix/home/sessions/SessionBottomSheetFragment.kt b/app/src/main/java/org/mozilla/fenix/home/sessions/SessionBottomSheetFragment.kt new file mode 100644 index 000000000..57a59a3ba --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/sessions/SessionBottomSheetFragment.kt @@ -0,0 +1,70 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.home.sessions + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import kotlinx.android.extensions.LayoutContainer +import kotlinx.android.synthetic.main.session_bottom_sheet.view.* +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.requireComponents +import java.lang.IllegalStateException + +class SessionBottomSheetFragment : BottomSheetDialogFragment(), LayoutContainer { + var archivedSession: ArchivedSession? = null + var isCurrentSession: Boolean = false + private lateinit var tabTitles: String + var onDelete: ((ArchivedSession) -> Boolean)? = null + var onArchive: (() -> Unit)? = null + + override val containerView: View? + get() = view + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(BottomSheetDialogFragment.STYLE_NORMAL, R.style.CurrentSessionBottomSheetDialogTheme) + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + val view = inflater.inflate(R.layout.session_bottom_sheet, container, false) + val snapshot = archivedSession?.bundle?.restoreSnapshot(requireComponents.core.engine) + ?: throw IllegalStateException() + + tabTitles = snapshot.sessions + .map { it.session.title } + .joinToString(", ") { + if (it.length > maxTitleLength) it.substring(0, maxTitleLength) + "..." else it + } + + if (!isCurrentSession) { + view.current_session_card_title.text = archivedSession?.formattedSavedAt + } + + view.current_session_card_tab_list.text = tabTitles + + view.archive_session_button.apply { + visibility = if (isCurrentSession) View.VISIBLE else View.GONE + setOnClickListener { + onArchive?.invoke() + } + } + + view.delete_session_button.setOnClickListener { + if (onDelete?.invoke(archivedSession!!) == true) { + dismiss() + } + } + + return view + } + + companion object { + const val maxTitleLength = 20 + const val overflowFragmentTag = "sessionOverflow" + } +} diff --git a/app/src/main/res/layout/current_session_bottom_sheet.xml b/app/src/main/res/layout/session_bottom_sheet.xml similarity index 88% rename from app/src/main/res/layout/current_session_bottom_sheet.xml rename to app/src/main/res/layout/session_bottom_sheet.xml index fb183120b..2bb109701 100644 --- a/app/src/main/res/layout/current_session_bottom_sheet.xml +++ b/app/src/main/res/layout/session_bottom_sheet.xml @@ -1,10 +1,14 @@ - + +