From ee229c970938fc64a3937dd1811766c3a5dd47cd Mon Sep 17 00:00:00 2001 From: Colin Lee Date: Sun, 10 Feb 2019 19:30:37 -0600 Subject: [PATCH] Fixes #354: Overflow menu for multitasking in current session --- app/build.gradle | 2 + .../org/mozilla/fenix/home/HomeFragment.kt | 10 +- .../CurrentSessionBottomSheetFragment.kt | 44 ++++++ .../org/mozilla/fenix/home/tabs/TabsUIView.kt | 26 ++++ .../main/res/drawable/ic_add_black_24dp.xml | 9 -- app/src/main/res/drawable/ic_archive.xml | 10 ++ .../main/res/drawable/ic_close_black_24dp.xml | 9 -- app/src/main/res/drawable/ic_delete.xml | 10 ++ app/src/main/res/drawable/ic_send.xml | 10 ++ .../ic_session_thumbnail_placeholder_blue.xml | 20 +++ .../layout/current_session_bottom_sheet.xml | 98 +++++++++++++ app/src/main/res/layout/fragment_home.xml | 135 +++++++++--------- app/src/main/res/layout/tab_list_header.xml | 2 +- app/src/main/res/layout/tab_list_row.xml | 2 +- app/src/main/res/values/strings.xml | 6 + app/src/main/res/values/styles.xml | 9 ++ 16 files changed, 309 insertions(+), 93 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/home/sessions/CurrentSessionBottomSheetFragment.kt delete mode 100644 app/src/main/res/drawable/ic_add_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_archive.xml delete mode 100644 app/src/main/res/drawable/ic_close_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_delete.xml create mode 100644 app/src/main/res/drawable/ic_send.xml create mode 100644 app/src/main/res/drawable/ic_session_thumbnail_placeholder_blue.xml create mode 100644 app/src/main/res/layout/current_session_bottom_sheet.xml diff --git a/app/build.gradle b/app/build.gradle index 96c77674a..b184f880f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,6 +25,8 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } debug { + shrinkResources false + minifyEnabled false applicationIdSuffix ".debug" } } 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 61b805795..2d43bb5ea 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -17,14 +17,12 @@ import androidx.fragment.app.Fragment import androidx.navigation.Navigation import kotlinx.android.synthetic.main.fragment_home.* import kotlinx.android.synthetic.main.fragment_home.view.* -import kotlinx.android.synthetic.main.tab_list_header.view.* import mozilla.components.browser.menu.BrowserMenu import mozilla.components.browser.session.Session import mozilla.components.browser.session.SessionManager import org.mozilla.fenix.DefaultThemeManager import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R -import org.mozilla.fenix.ext.increaseTapArea import org.mozilla.fenix.ThemeManager import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.home.sessions.SessionsComponent @@ -92,12 +90,7 @@ class HomeFragment : Fragment() { view.toolbar.setCompoundDrawablesWithIntrinsicBounds(searchIcon, null, null, null) val roundToInt = (toolbarPaddingDp * Resources.getSystem().displayMetrics.density).roundToInt() view.toolbar.compoundDrawablePadding = roundToInt - view.toolbar.setOnClickListener { it -> - val directions = HomeFragmentDirections.actionHomeFragmentToSearchFragment(null) - Navigation.findNavController(it).navigate(directions) - } - view.add_tab_button.increaseTapArea(addTabButtonIncreaseDps) - view.add_tab_button.setOnClickListener { + view.toolbar.setOnClickListener { val directions = HomeFragmentDirections.actionHomeFragmentToSearchFragment(null) Navigation.findNavController(it).navigate(directions) } @@ -210,6 +203,7 @@ class HomeFragment : Fragment() { companion object { const val addTabButtonIncreaseDps = 8 + const val overflowButtonIncreaseDps = 8 const val toolbarPaddingDp = 12f const val firstKeyTriggerFrame = 55 const val secondKeyTriggerFrame = 90 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 new file mode 100644 index 000000000..9dc2b44db --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/sessions/CurrentSessionBottomSheetFragment.kt @@ -0,0 +1,44 @@ +/* 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.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) + + view.current_session_card_tab_list.text = requireComponents.core.sessionManager.sessions.joinToString(", ") { + if (it.title.length > maxTitleLength) it.title.substring(0, maxTitleLength) + "..." else it.title + } + + view.delete_session_button.setOnClickListener { + requireComponents.core.sessionManager.removeAll() + dismiss() + } + return view + } + + companion object { + const val maxTitleLength = 20 + } +} 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 ca7dc3099..cd4afe841 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 @@ -4,17 +4,25 @@ package org.mozilla.fenix.home.tabs +import android.app.Activity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.constraintlayout.widget.ConstraintLayout +import androidx.fragment.app.FragmentActivity +import androidx.navigation.Navigation import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import io.reactivex.Observable import io.reactivex.Observer import io.reactivex.functions.Consumer +import kotlinx.android.synthetic.main.tab_list_header.view.* import org.mozilla.fenix.R +import org.mozilla.fenix.ext.increaseTapArea +import org.mozilla.fenix.home.HomeFragment +import org.mozilla.fenix.home.HomeFragmentDirections +import org.mozilla.fenix.home.sessions.CurrentSessionBottomSheetFragment import org.mozilla.fenix.mvi.UIView class TabsUIView( @@ -40,10 +48,28 @@ class TabsUIView( adapter = tabsAdapter itemAnimator = DefaultItemAnimator() } + header.add_tab_button.increaseTapArea(HomeFragment.addTabButtonIncreaseDps) + header.add_tab_button.setOnClickListener { + val directions = HomeFragmentDirections.actionHomeFragmentToSearchFragment(null) + Navigation.findNavController(it).navigate(directions) + } + header.tabs_overflow_button.increaseTapArea(HomeFragment.overflowButtonIncreaseDps) + header.tabs_overflow_button.setOnClickListener { + if (view.context as? Activity != null) { + CurrentSessionBottomSheetFragment().show( + (view.context as FragmentActivity).supportFragmentManager, + overflowFragmentTag + ) + } + } } override fun updateView() = Consumer { tabsAdapter.sessions = it.sessions header.visibility = if (it.sessions.isEmpty()) View.GONE else View.VISIBLE } + + companion object { + const val overflowFragmentTag = "current session overflow" + } } diff --git a/app/src/main/res/drawable/ic_add_black_24dp.xml b/app/src/main/res/drawable/ic_add_black_24dp.xml deleted file mode 100644 index 0258249cc..000000000 --- a/app/src/main/res/drawable/ic_add_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_archive.xml b/app/src/main/res/drawable/ic_archive.xml new file mode 100644 index 000000000..001c5806a --- /dev/null +++ b/app/src/main/res/drawable/ic_archive.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_close_black_24dp.xml b/app/src/main/res/drawable/ic_close_black_24dp.xml deleted file mode 100644 index ede4b7108..000000000 --- a/app/src/main/res/drawable/ic_close_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 000000000..26cc6d19b --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_send.xml b/app/src/main/res/drawable/ic_send.xml new file mode 100644 index 000000000..5c0be40c8 --- /dev/null +++ b/app/src/main/res/drawable/ic_send.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_session_thumbnail_placeholder_blue.xml b/app/src/main/res/drawable/ic_session_thumbnail_placeholder_blue.xml new file mode 100644 index 000000000..97b362472 --- /dev/null +++ b/app/src/main/res/drawable/ic_session_thumbnail_placeholder_blue.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/app/src/main/res/layout/current_session_bottom_sheet.xml b/app/src/main/res/layout/current_session_bottom_sheet.xml new file mode 100644 index 000000000..fb183120b --- /dev/null +++ b/app/src/main/res/layout/current_session_bottom_sheet.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 0e67e5e84..07442d656 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -2,79 +2,83 @@ - + android:layout_height="match_parent"> + - - - - - - - + + + + + app:layout_constraintTop_toBottomOf="@id/menuButton" /> - - + android:layout_marginEnd="16dp" + android:layout_marginTop="64dp" + android:layout_marginStart="16dp" + android:elevation="@dimen/toolbar_elevation" + android:background="?attr/toolbarWrapperBackground" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/wordmark"> - + + + - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/tab_list_header.xml b/app/src/main/res/layout/tab_list_header.xml index a22b6b06d..27d487388 100644 --- a/app/src/main/res/layout/tab_list_header.xml +++ b/app/src/main/res/layout/tab_list_header.xml @@ -24,7 +24,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="8dp" - android:src="@drawable/ic_add_black_24dp" + android:src="@drawable/ic_new" android:baselineAlignBottom="true" app:layout_constraintBaseline_toBaselineOf="@id/header_text" app:layout_constraintEnd_toStartOf="@id/tabs_overflow_button"/> diff --git a/app/src/main/res/layout/tab_list_row.xml b/app/src/main/res/layout/tab_list_row.xml index 78a82b39b..410d13ef2 100644 --- a/app/src/main/res/layout/tab_list_row.xml +++ b/app/src/main/res/layout/tab_list_row.xml @@ -42,7 +42,7 @@ %1$s puts you in control.

%1$s is produced by Mozilla. Our mission is to foster a healthy, open Internet.
]]> + + + Delete + Archive + Send and Share + Current session image diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a59bf6b44..7cc50b199 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -116,4 +116,13 @@ 0dp @drawable/search_pill_background + + + +