From 99f979e86b4fcd9ad494357c519f20ebfe654da6 Mon Sep 17 00:00:00 2001 From: Emily Kager Date: Tue, 23 Apr 2019 11:32:48 -0700 Subject: [PATCH] For #1601 - Bookmark icon should change visually if page is bookmarked --- .../mozilla/fenix/browser/BrowserFragment.kt | 70 +++++++++++++++--- .../quickactionsheet/QuickActionComponent.kt | 11 ++- .../quickactionsheet/QuickActionUIView.kt | 1 + .../main/res/drawable/bookmark_two_state.xml | 11 +++ ...=> bookmarks_circle_background_filled.xml} | 9 +-- .../bookmarks_circle_background_outline.xml | 29 ++++++++ app/src/main/res/layout/fragment_library.xml | 2 +- .../res/layout/layout_quick_action_sheet.xml | 4 +- app/src/main/res/values/colors.xml | 6 +- debug.keystore | Bin 0 -> 2625 bytes 10 files changed, 118 insertions(+), 25 deletions(-) create mode 100644 app/src/main/res/drawable/bookmark_two_state.xml rename app/src/main/res/drawable/{library_icon_bookmarks_circle_background.xml => bookmarks_circle_background_filled.xml} (80%) create mode 100644 app/src/main/res/drawable/bookmarks_circle_background_outline.xml create mode 100644 debug.keystore diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 8bb1d4b96..bc2dd24d7 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -70,7 +70,9 @@ import org.mozilla.fenix.ext.share import org.mozilla.fenix.lib.Do import org.mozilla.fenix.mvi.ActionBusFactory import org.mozilla.fenix.mvi.getAutoDisposeObservable +import org.mozilla.fenix.mvi.getManagedEmitter import org.mozilla.fenix.quickactionsheet.QuickActionAction +import org.mozilla.fenix.quickactionsheet.QuickActionChange import org.mozilla.fenix.quickactionsheet.QuickActionComponent import org.mozilla.fenix.settings.quicksettings.QuickSettingsSheetDialogFragment import org.mozilla.fenix.utils.ItsNotBrokenSnack @@ -148,7 +150,9 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope, } private fun getAppropriateLayoutGravity(): Int { - if (getSessionById()?.isCustomTabSession() == true) { return Gravity.TOP } + if (getSessionById()?.isCustomTabSession() == true) { + return Gravity.TOP + } return Gravity.BOTTOM } @@ -264,7 +268,11 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope, ) thumbnailsFeature.set( - feature = ThumbnailsFeature(requireContext(), view.engineView, requireComponents.core.sessionManager), + feature = ThumbnailsFeature( + requireContext(), + view.engineView, + requireComponents.core.sessionManager + ), owner = this, view = view ) @@ -362,8 +370,15 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope, getSessionById()?.let { session -> CoroutineScope(IO).launch { val guid = requireComponents.core.bookmarksStorage - .addItem(BookmarkRoot.Mobile.id, session.url, session.title, null) + .addItem( + BookmarkRoot.Mobile.id, + session.url, + session.title, + null + ) launch(Main) { + getManagedEmitter() + .onNext(QuickActionChange.BookmarkedStateChange(true)) requireComponents.analytics.metrics.track(Event.AddBookmark) view?.let { FenixSnackbar.make( @@ -371,7 +386,10 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope, Snackbar.LENGTH_LONG ) .setAction(getString(R.string.edit_bookmark_snackbar_action)) { - Navigation.findNavController(requireActivity(), R.id.container) + Navigation.findNavController( + requireActivity(), + R.id.container + ) .navigate( BrowserFragmentDirections .actionBrowserFragmentToBookmarkEditFragment( @@ -411,7 +429,11 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope, } } - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { when (requestCode) { REQUEST_CODE_DOWNLOAD_PERMISSIONS -> downloadsFeature.withFeature { it.onPermissionsResult(permissions, grantResults) @@ -473,14 +495,16 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope, .navigate(BrowserFragmentDirections.actionBrowserFragmentToLibraryFragment()) is ToolbarMenu.Item.RequestDesktop -> sessionUseCases.requestDesktopSite.invoke(action.item.isChecked) ToolbarMenu.Item.Share -> getSessionById()?.let { session -> - session.url.apply { requireContext().share(this) + session.url.apply { + requireContext().share(this) } } ToolbarMenu.Item.NewPrivateTab -> { val directions = BrowserFragmentDirections .actionBrowserFragmentToSearchFragment(null) Navigation.findNavController(view!!).navigate(directions) - (activity as HomeActivity).browsingModeManager.mode = BrowsingModeManager.Mode.Private + (activity as HomeActivity).browsingModeManager.mode = + BrowsingModeManager.Mode.Private } ToolbarMenu.Item.FindInPage -> { FindInPageIntegration.launch?.invoke() @@ -500,7 +524,8 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope, val directions = BrowserFragmentDirections .actionBrowserFragmentToSearchFragment(null) Navigation.findNavController(view!!).navigate(directions) - (activity as HomeActivity).browsingModeManager.mode = BrowsingModeManager.Mode.Normal + (activity as HomeActivity).browsingModeManager.mode = + BrowsingModeManager.Mode.Normal } ToolbarMenu.Item.OpenInFenix -> { val intent = Intent(context, IntentReceiverActivity::class.java) @@ -547,7 +572,11 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope, private fun getSessionById(): Session? { return if (externalSessionId != null) { - requireNotNull(requireContext().components.core.sessionManager.findSessionById(externalSessionId!!)) + requireNotNull( + requireContext().components.core.sessionManager.findSessionById( + externalSessionId!! + ) + ) } else { requireComponents.core.sessionManager.selectedSession } @@ -562,6 +591,9 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope, val observer = object : Session.Observer { override fun onLoadingStateChanged(session: Session, loading: Boolean) { super.onLoadingStateChanged(session, loading) + if (!loading) { + searchBookmarks(session) + } setToolbarBehavior(loading) } } @@ -579,8 +611,21 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope, } } + private fun searchBookmarks(session: Session) { + launch { + val list = requireComponents.core.bookmarksStorage.getBookmarksWithUrl(session.url) + val found = list.isNotEmpty() && list[0].url == session.url + launch(Main) { + getManagedEmitter() + .onNext(QuickActionChange.BookmarkedStateChange(found)) + } + } + } + private fun setToolbarBehavior(loading: Boolean) { - if (getSessionById()?.isCustomTabSession() == true) { return } + if (getSessionById()?.isCustomTabSession() == true) { + return + } val toolbarView = toolbarComponent.uiView.view (toolbarView.layoutParams as CoordinatorLayout.LayoutParams).apply { @@ -592,7 +637,7 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope, behavior = BrowserToolbarBottomBehavior(context, null) } else { (behavior as? BrowserToolbarBottomBehavior)?.forceExpand(toolbarView) - null + behavior = null } } } @@ -603,6 +648,7 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope, private const val REQUEST_CODE_PROMPT_PERMISSIONS = 2 private const val REQUEST_CODE_APP_PERMISSIONS = 3 private const val TOOLBAR_HEIGHT = 56f - const val REPORT_SITE_ISSUE_URL = "https://webcompat.com/issues/new?url=%s&label=browser-fenix" + const val REPORT_SITE_ISSUE_URL = + "https://webcompat.com/issues/new?url=%s&label=browser-fenix" } } diff --git a/app/src/main/java/org/mozilla/fenix/quickactionsheet/QuickActionComponent.kt b/app/src/main/java/org/mozilla/fenix/quickactionsheet/QuickActionComponent.kt index bb354a9da..6dbff2543 100644 --- a/app/src/main/java/org/mozilla/fenix/quickactionsheet/QuickActionComponent.kt +++ b/app/src/main/java/org/mozilla/fenix/quickactionsheet/QuickActionComponent.kt @@ -16,7 +16,10 @@ import org.mozilla.fenix.mvi.ViewState class QuickActionComponent( private val container: ViewGroup, bus: ActionBusFactory, - override var initialState: QuickActionState = QuickActionState(false) + override var initialState: QuickActionState = QuickActionState( + readable = false, + bookmarked = false + ) ) : UIComponent( bus.getManagedEmitter(QuickActionAction::class.java), bus.getSafeManagedObservable(QuickActionChange::class.java) @@ -24,6 +27,9 @@ class QuickActionComponent( override val reducer: Reducer = { state, change -> when (change) { + is QuickActionChange.BookmarkedStateChange -> { + state.copy(bookmarked = change.bookmarked) + } is QuickActionChange.ReadableStateChange -> { state.copy(readable = change.readable) } @@ -38,7 +44,7 @@ class QuickActionComponent( } } -data class QuickActionState(val readable: Boolean) : ViewState +data class QuickActionState(val readable: Boolean, val bookmarked: Boolean) : ViewState sealed class QuickActionAction : Action { object Opened : QuickActionAction() @@ -50,5 +56,6 @@ sealed class QuickActionAction : Action { } sealed class QuickActionChange : Change { + data class BookmarkedStateChange(val bookmarked: Boolean) : QuickActionChange() data class ReadableStateChange(val readable: Boolean) : QuickActionChange() } diff --git a/app/src/main/java/org/mozilla/fenix/quickactionsheet/QuickActionUIView.kt b/app/src/main/java/org/mozilla/fenix/quickactionsheet/QuickActionUIView.kt index 88e8084a9..e42fa1333 100644 --- a/app/src/main/java/org/mozilla/fenix/quickactionsheet/QuickActionUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/quickactionsheet/QuickActionUIView.kt @@ -97,5 +97,6 @@ class QuickActionUIView( override fun updateView() = Consumer { view.quick_action_read.visibility = if (it.readable) View.VISIBLE else View.GONE + view.quick_action_bookmark.isSelected = it.bookmarked } } diff --git a/app/src/main/res/drawable/bookmark_two_state.xml b/app/src/main/res/drawable/bookmark_two_state.xml new file mode 100644 index 000000000..3b704a91e --- /dev/null +++ b/app/src/main/res/drawable/bookmark_two_state.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/app/src/main/res/drawable/library_icon_bookmarks_circle_background.xml b/app/src/main/res/drawable/bookmarks_circle_background_filled.xml similarity index 80% rename from app/src/main/res/drawable/library_icon_bookmarks_circle_background.xml rename to app/src/main/res/drawable/bookmarks_circle_background_filled.xml index 6527a3a8e..a847916a2 100644 --- a/app/src/main/res/drawable/library_icon_bookmarks_circle_background.xml +++ b/app/src/main/res/drawable/bookmarks_circle_background_filled.xml @@ -8,7 +8,7 @@ - + + android:fillColor="@color/bookmarks_icon_filled" + android:pathData="M6.749,21.248C6.4234,21.2471 6.1142,21.1054 5.9008,20.8595C5.6875,20.6136 5.5909,20.2874 5.636,19.965L6.414,14.4L2.674,10.38C2.3928,10.0785 2.2991,9.6474 2.4296,9.2564C2.5601,8.8654 2.8941,8.5771 3.3,8.505L8.529,7.57L10.993,2.624C11.1833,2.242 11.5733,2.0006 12,2.0006C12.4267,2.0006 12.8167,2.242 13.007,2.624L15.471,7.57L20.7,8.5C21.1057,8.5724 21.4394,8.8608 21.5697,9.2518C21.7,9.6427 21.6062,10.0737 21.325,10.375L17.586,14.4L18.364,19.968C18.4229,20.3853 18.2434,20.8005 17.8991,21.0434C17.5547,21.2864 17.1034,21.3164 16.73,21.121L12,18.654L7.269,21.119C7.1087,21.2035 6.9302,21.2478 6.749,21.248Z" /> diff --git a/app/src/main/res/drawable/bookmarks_circle_background_outline.xml b/app/src/main/res/drawable/bookmarks_circle_background_outline.xml new file mode 100644 index 000000000..dbbbf8c30 --- /dev/null +++ b/app/src/main/res/drawable/bookmarks_circle_background_outline.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index 84961be34..c72a3a228 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -21,7 +21,7 @@ android:clickable="true" android:contentDescription="@string/library_bookmarks" android:focusable="true" - app:listItemIcon="@drawable/library_icon_bookmarks_circle_background" + app:listItemIcon="@drawable/bookmarks_circle_background_filled" app:listItemTitle="@string/library_bookmarks" /> - \ No newline at end of file + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index bdec44b11..796746bc7 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -91,8 +91,10 @@ #D4C1FA #2E2060 - #F4B8D9 - #491949 + #C60084 + #FFB4DB + #FFB4DB + #50134B #F5C0C6 #3E0909 diff --git a/debug.keystore b/debug.keystore new file mode 100644 index 0000000000000000000000000000000000000000..a04026c33c4efda3e7ef8a99d6ee5a94bf61201e GIT binary patch literal 2625 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 TC;u3nWGpt8Pl6#JTJgUD98JX> literal 0 HcmV?d00001