From 79395631d7be6135d751aa201940eca50d85c632 Mon Sep 17 00:00:00 2001 From: Jeff Boek Date: Mon, 11 Mar 2019 15:36:43 -0700 Subject: [PATCH] Fixes #870 - Fixes logic for the session bottom sheet fragment for private mode Also fixes #871 --- .../org/mozilla/fenix/home/HomeFragment.kt | 51 +++++---- .../fenix/home/SessionBottomSheetFragment.kt | 100 ++++++++++++++++++ .../sessions/SessionBottomSheetFragment.kt | 70 ------------ .../org/mozilla/fenix/home/tabs/TabsUIView.kt | 3 + app/src/main/res/values/strings.xml | 2 + 5 files changed, 137 insertions(+), 89 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/home/SessionBottomSheetFragment.kt delete mode 100644 app/src/main/java/org/mozilla/fenix/home/sessions/SessionBottomSheetFragment.kt 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 c4945dcf1..d4c97d1be 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -32,7 +32,6 @@ import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.R import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.home.sessions.ArchivedSession -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 @@ -196,9 +195,18 @@ class HomeFragment : Fragment() { requireComponents.core.sessionStorage.archive(requireComponents.core.sessionManager) } is TabsAction.MenuTapped -> { - requireComponents.core.sessionStorage.current() - ?.let { ArchivedSession(it.id!!, it, it.lastSavedAt, it.urls) } - ?.also { openSessionMenu(it) } + val isPrivate = (activity as HomeActivity).browsingModeManager.isPrivate + val titles = requireComponents.core.sessionManager.sessions + .filter { session -> session.private == isPrivate } + .map { session -> session.title } + + val sessionType = if (isPrivate) { + SessionBottomSheetFragment.SessionType.Private(titles) + } else { + SessionBottomSheetFragment.SessionType.Current(titles) + } + + openSessionMenu(sessionType) } is TabsAction.Select -> { val session = requireComponents.core.sessionManager.findSessionById(it.sessionId) @@ -230,7 +238,8 @@ class HomeFragment : Fragment() { is SessionsAction.Delete -> { requireComponents.core.sessionStorage.remove(it.archivedSession.bundle) } - is SessionsAction.MenuTapped -> openSessionMenu(it.archivedSession) + is SessionsAction.MenuTapped -> + openSessionMenu(SessionBottomSheetFragment.SessionType.Archived(it.archivedSession)) } } } @@ -347,22 +356,26 @@ class HomeFragment : Fragment() { ) } - 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) - } + private fun openSessionMenu(sessionType: SessionBottomSheetFragment.SessionType) { + SessionBottomSheetFragment.create(sessionType).apply { + onArchive = { + requireComponents.core.sessionStorage.archive(requireComponents.core.sessionManager) } - it.onDelete = { - if (isCurrentSession) { - requireComponents.useCases.tabsUseCases.removeAllTabsOfType.invoke(false) + onDelete = { + when (it) { + is SessionBottomSheetFragment.SessionType.Archived -> { + requireComponents.core.sessionStorage.remove(it.archivedSession.bundle) + } + is SessionBottomSheetFragment.SessionType.Current -> { + requireComponents.useCases.tabsUseCases.removeAllTabsOfType.invoke(false) + requireComponents.core.sessionStorage.current()?.apply { + requireComponents.core.sessionStorage.remove(this) + } + } + is SessionBottomSheetFragment.SessionType.Private -> { + requireComponents.useCases.tabsUseCases.removeAllTabsOfType.invoke(true) + } } - - requireComponents.core.sessionStorage.remove(archivedSession.bundle) } }.show(requireActivity().supportFragmentManager, SessionBottomSheetFragment.overflowFragmentTag) } diff --git a/app/src/main/java/org/mozilla/fenix/home/SessionBottomSheetFragment.kt b/app/src/main/java/org/mozilla/fenix/home/SessionBottomSheetFragment.kt new file mode 100644 index 000000000..202f790f6 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/SessionBottomSheetFragment.kt @@ -0,0 +1,100 @@ +/* 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 + +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 org.mozilla.fenix.home.sessions.ArchivedSession + +class SessionBottomSheetFragment : BottomSheetDialogFragment(), LayoutContainer { + sealed class SessionType { + data class Current(val titles: List) : SessionType() + data class Archived(val archivedSession: ArchivedSession) : SessionType() + data class Private(val titles: List) : SessionType() + } + + private var sessionType: SessionType? = null + var onDelete: ((SessionType) -> Unit)? = null + var onArchive: ((SessionType.Current) -> 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) + + view.current_session_card_title.text = getCardTitle() + view.current_session_card_tab_list.text = getTabTitles() + view.archive_session_button.apply { + visibility = if (sessionType is SessionType.Current) View.VISIBLE else View.GONE + setOnClickListener { + sessionType?.also { + if (it is SessionType.Current) { + onArchive?.invoke(it) + } + } + + dismiss() + } + } + + view.delete_session_button.setOnClickListener { + sessionType?.apply { onDelete?.invoke(this) } + dismiss() + } + + return view + } + + private fun getCardTitle(): String? { + return sessionType?.let { + when (it) { + is SessionType.Archived -> it.archivedSession.formattedSavedAt + is SessionType.Current -> getString(R.string.tabs_header_title) + is SessionType.Private -> getString(R.string.tabs_header_private_title) + } + } + } + + private fun getTabTitles(): String? { + return sessionType?.let { + when (it) { + is SessionType.Current -> it.titles + is SessionType.Private -> it.titles + is SessionType.Archived -> + it.archivedSession.bundle.restoreSnapshot(requireComponents.core.engine)?.let { snapshot -> + snapshot.sessions.map { item -> item.session.title } + } + } + }?.joinToString(", ") { + if (it.length > maxTitleLength) it.substring(0, + maxTitleLength + ) + "..." else it + } + } + + companion object { + const val maxTitleLength = 20 + const val overflowFragmentTag = "sessionOverflow" + + fun create(sessionType: SessionType): SessionBottomSheetFragment { + val fragment = SessionBottomSheetFragment() + fragment.sessionType = sessionType + return fragment + } + } +} 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 deleted file mode 100644 index db43cdfdf..000000000 --- a/app/src/main/java/org/mozilla/fenix/home/sessions/SessionBottomSheetFragment.kt +++ /dev/null @@ -1,70 +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.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) -> Unit)? = 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() - dismiss() - } - } - - view.delete_session_button.setOnClickListener { - onDelete?.invoke(archivedSession!!) - dismiss() - } - - return view - } - - companion object { - const val maxTitleLength = 20 - const val overflowFragmentTag = "sessionOverflow" - } -} diff --git a/app/src/main/java/org/mozilla/fenix/home/tabs/TabsUIView.kt b/app/src/main/java/org/mozilla/fenix/home/tabs/TabsUIView.kt index 95af8b0db..beaf186aa 100644 --- a/app/src/main/java/org/mozilla/fenix/home/tabs/TabsUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/tabs/TabsUIView.kt @@ -46,6 +46,9 @@ class TabsUIView( val directions = HomeFragmentDirections.actionHomeFragmentToSearchFragment(null) Navigation.findNavController(it).navigate(directions) } + + val headerTextResourceId = if (isPrivate) R.string.tabs_header_private_title else R.string.tabs_header_title + header_text.text = context.getString(headerTextResourceId) tabs_overflow_button.increaseTapArea(HomeFragment.overflowButtonIncreaseDps) tabs_overflow_button.setOnClickListener { actionEmitter.onNext(TabsAction.MenuTapped) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 50703e516..c9c366024 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -159,6 +159,8 @@ Current Session + + Private Session Add Tab