Skip to content

Commit

Permalink
For mozilla-mobile#3478 - Add Tab sent snackbar confirmation for devi…
Browse files Browse the repository at this point in the history
…ce sharing
  • Loading branch information
ekager committed Jul 8, 2019
1 parent 83312b3 commit 39b2f75
Show file tree
Hide file tree
Showing 8 changed files with 114 additions and 28 deletions.
23 changes: 19 additions & 4 deletions app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -97,14 +97,14 @@ import org.mozilla.fenix.quickactionsheet.QuickActionSheetBehavior
import org.mozilla.fenix.quickactionsheet.QuickActionState
import org.mozilla.fenix.quickactionsheet.QuickActionViewModel
import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.share.ShareFragment
import org.mozilla.fenix.utils.ItsNotBrokenSnack
import org.mozilla.fenix.utils.Settings
import java.net.MalformedURLException
import java.net.URL

@SuppressWarnings("TooManyFunctions", "LargeClass")
class BrowserFragment : Fragment(), BackHandler {

class BrowserFragment : Fragment(), BackHandler, ShareFragment.TabsSharedCallback {
private lateinit var toolbarComponent: ToolbarComponent

private var tabCollectionObserver: Observer<List<TabCollection>>? = null
Expand Down Expand Up @@ -953,8 +953,23 @@ class BrowserFragment : Fragment(), BackHandler {
}

private fun shareUrl(url: String) {
val directions = BrowserFragmentDirections.actionBrowserFragmentToShareFragment(url)
nav(R.id.browserFragment, directions)
context?.let {
val shareFragment = ShareFragment()
val bundle = Bundle()
bundle.putString(it.getString(R.string.share_fragment_args_url), url)
shareFragment.arguments = bundle
shareFragment.setTargetFragment(this, 1)
shareFragment.show(fragmentManager!!, ShareFragment.fragmentTag)
}
}

override fun onTabsShared(tabsSize: Int) {
view?.let {
FenixSnackbar.make(it.rootView, Snackbar.LENGTH_SHORT)
.setAnchorView(toolbarComponent.uiView.view)
.setText(getString(if (tabsSize == 1) R.string.sent_tab_snackbar else R.string.sent_tabs_snackbar))
.show()
}
}

companion object {
Expand Down
23 changes: 19 additions & 4 deletions app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,13 @@ import org.mozilla.fenix.mvi.getAutoDisposeObservable
import org.mozilla.fenix.mvi.getManagedEmitter
import org.mozilla.fenix.onboarding.FenixOnboarding
import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.share.ShareFragment
import org.mozilla.fenix.share.ShareTab
import org.mozilla.fenix.utils.allowUndo
import kotlin.math.roundToInt

@SuppressWarnings("TooManyFunctions", "LargeClass")
class HomeFragment : Fragment(), AccountObserver {
class HomeFragment : Fragment(), AccountObserver, ShareFragment.TabsSharedCallback {
private val bus = ActionBusFactory.get(this)
private var tabCollectionObserver: Observer<List<TabCollection>>? = null

Expand Down Expand Up @@ -714,9 +715,15 @@ class HomeFragment : Fragment(), AccountObserver {
}

private fun share(url: String? = null, tabs: List<ShareTab>? = null) {
val directions =
HomeFragmentDirections.actionHomeFragmentToShareFragment(url = url, tabs = tabs?.toTypedArray())
nav(R.id.homeFragment, directions)
context?.let {
val shareFragment = ShareFragment()
val bundle = Bundle()
bundle.putString(it.getString(R.string.share_fragment_args_url), url)
bundle.putParcelableArray(it.getString(R.string.share_fragment_args_tabs), tabs?.toTypedArray())
shareFragment.arguments = bundle
shareFragment.setTargetFragment(this, 1)
shareFragment.show(fragmentManager!!, ShareFragment.fragmentTag)
}
}

private fun currentMode(): Mode = if (!onboarding.userHasBeenOnboarded()) {
Expand Down Expand Up @@ -848,6 +855,14 @@ class HomeFragment : Fragment(), AccountObserver {
return this.map { it.toTab(requireContext(), it == selected) }
}

override fun onTabsShared(tabsSize: Int) {
view?.let {
FenixSnackbar.make(it.rootView, Snackbar.LENGTH_SHORT)
.setText(getString(if (tabsSize == 1) R.string.sent_tab_snackbar else R.string.sent_tabs_snackbar))
.show()
}
}

companion object {
private const val NON_TAB_ITEM_NUM = 3
private const val ANIM_SCROLL_DELAY = 100L
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,12 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
<<<<<<< HEAD
import androidx.navigation.fragment.findNavController
=======
import androidx.navigation.Navigation
import com.google.android.material.snackbar.Snackbar
>>>>>>> For #3478 - Add Tab sent snackbar confirmation for device sharing
import kotlinx.android.synthetic.main.fragment_bookmark.view.*
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Dispatchers.Main
Expand Down Expand Up @@ -55,10 +60,11 @@ import org.mozilla.fenix.ext.withOptionalDesktopFolders
import org.mozilla.fenix.mvi.ActionBusFactory
import org.mozilla.fenix.mvi.getAutoDisposeObservable
import org.mozilla.fenix.mvi.getManagedEmitter
import org.mozilla.fenix.share.ShareFragment
import org.mozilla.fenix.utils.allowUndo

@SuppressWarnings("TooManyFunctions", "LargeClass")
class BookmarkFragment : Fragment(), BackHandler, AccountObserver {
class BookmarkFragment : Fragment(), BackHandler, AccountObserver, ShareFragment.TabsSharedCallback {

private lateinit var bookmarkComponent: BookmarkComponent
private lateinit var signInComponent: SignInComponent
Expand Down Expand Up @@ -214,13 +220,15 @@ class BookmarkFragment : Fragment(), BackHandler, AccountObserver {
}
is BookmarkAction.Share -> {
it.item.url?.apply {
nav(
R.id.bookmarkFragment,
BookmarkFragmentDirections.actionBookmarkFragmentToShareFragment(
this,
it.item.title
)
)
context?.let { context: Context ->
val shareFragment = ShareFragment()
val bundle = Bundle()
bundle.putString(context.getString(R.string.share_fragment_args_url), this)
bundle.putString(context.getString(R.string.share_fragment_args_title), it.item.title)
shareFragment.arguments = bundle
shareFragment.setTargetFragment(this@BookmarkFragment, 1)
shareFragment.show(fragmentManager!!, ShareFragment.fragmentTag)
}
metrics()?.track(Event.ShareBookmark)
}
}
Expand Down Expand Up @@ -405,6 +413,14 @@ class BookmarkFragment : Fragment(), BackHandler, AccountObserver {
}
}

override fun onTabsShared(tabsSize: Int) {
view?.let {
FenixSnackbar.make(it.rootView, Snackbar.LENGTH_SHORT)
.setText(getString(if (tabsSize == 1) R.string.sent_tab_snackbar else R.string.sent_tabs_snackbar))
.show()
}
}

override fun onBackPressed(): Boolean = (bookmarkComponent.uiView as BookmarkUIView).onBackPressed()

override fun onAuthenticated(account: OAuthAccount) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.navigation.Navigation
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.fragment_history.view.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Dispatchers.Main
Expand All @@ -33,18 +34,20 @@ import org.mozilla.fenix.FenixViewModelProvider
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.components.Components
import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.getHostFromUrl
import org.mozilla.fenix.ext.nav
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.mvi.ActionBusFactory
import org.mozilla.fenix.mvi.getAutoDisposeObservable
import org.mozilla.fenix.mvi.getManagedEmitter
import org.mozilla.fenix.share.ShareFragment
import org.mozilla.fenix.share.ShareTab
import java.util.concurrent.TimeUnit

@SuppressWarnings("TooManyFunctions")
class HistoryFragment : Fragment(), BackHandler {
class HistoryFragment : Fragment(), BackHandler, ShareFragment.TabsSharedCallback {

private lateinit var historyComponent: HistoryComponent
private val navigation by lazy { Navigation.findNavController(requireView()) }
Expand Down Expand Up @@ -286,15 +289,29 @@ class HistoryFragment : Fragment(), BackHandler {
}

private fun share(url: String? = null, tabs: List<ShareTab>? = null) {
val directions =
HistoryFragmentDirections.actionHistoryFragmentToShareFragment(url = url, tabs = tabs?.toTypedArray())
nav(R.id.historyFragment, directions)
context?.let {
val shareFragment = ShareFragment()
val bundle = Bundle()
bundle.putString(it.getString(R.string.share_fragment_args_url), url)
bundle.putParcelableArray(it.getString(R.string.share_fragment_args_tabs), tabs?.toTypedArray())
shareFragment.arguments = bundle
shareFragment.setTargetFragment(this, 1)
shareFragment.show(fragmentManager!!, ShareFragment.fragmentTag)
}
}

private inline fun emitChange(producer: () -> HistoryChange) {
getManagedEmitter<HistoryChange>().onNext(producer())
}

override fun onTabsShared(tabsSize: Int) {
view?.let {
FenixSnackbar.make(it.rootView, Snackbar.LENGTH_SHORT)
.setText(getString(if (tabsSize == 1) R.string.sent_tab_snackbar else R.string.sent_tabs_snackbar))
.show()
}
}

companion object {
private const val HISTORY_TIME_DAYS = 3L
}
Expand Down
21 changes: 18 additions & 3 deletions app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ import org.mozilla.fenix.mvi.ActionBusFactory
import org.mozilla.fenix.mvi.getAutoDisposeObservable

class ShareFragment : AppCompatDialogFragment() {
interface TabsSharedCallback {
fun onTabsShared(tabsSize: Int)
}

companion object {
const val fragmentTag = "ShareFragment"
}
private lateinit var component: ShareComponent
private var tabs: Array<ShareTab> = emptyArray()

Expand All @@ -38,13 +45,20 @@ class ShareFragment : AppCompatDialogFragment() {

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_share, container, false)
val args = ShareFragmentArgs.fromBundle(arguments!!)
val args = requireArguments()

if (args.url == null && args.tabs.isNullOrEmpty()) {
val tabArgs =
args.getParcelableArray(context?.getString(R.string.share_fragment_args_tabs)) as? Array<ShareTab> ?: null
if (args.getString(context?.getString(R.string.share_fragment_args_url)) == null && tabArgs.isNullOrEmpty()) {
throw IllegalStateException("URL and tabs cannot both be null.")
}

tabs = args.tabs ?: arrayOf(ShareTab(args.url!!, args.title ?: ""))
tabs = tabArgs ?: arrayOf(
ShareTab(
args.getString(context?.getString(R.string.share_fragment_args_url))!!,
args.getString(context?.getString(R.string.share_fragment_args_title)) ?: ""
)
)

component = ShareComponent(
view.share_wrapper,
Expand Down Expand Up @@ -131,6 +145,7 @@ class ShareFragment : AppCompatDialogFragment() {
)
}
}
(targetFragment as? TabsSharedCallback)?.onTabsShared(tabs.size)
}
}

Expand Down
10 changes: 5 additions & 5 deletions app/src/main/res/navigation/nav_graph.xml
Original file line number Diff line number Diff line change
Expand Up @@ -407,20 +407,20 @@
android:name="org.mozilla.fenix.share.ShareFragment"
tools:layout="@layout/fragment_share" >
<argument
android:name="url"
android:name="@string/share_fragment_args_url"
android:defaultValue="@null"
app:argType="string"
app:nullable="true" />
<argument
android:name="title"
android:name="@string/share_fragment_args_title"
android:defaultValue="@null"
app:argType="string"
app:nullable="true" />
<argument
android:name="tabs"
android:name="@string/share_fragment_args_tabs"
android:defaultValue="@null"
app:nullable="true"
app:argType="org.mozilla.fenix.share.ShareTab[]" />
app:argType="org.mozilla.fenix.share.ShareTab[]"
app:nullable="true" />
<action
android:id="@+id/action_shareFragment_to_turnOnSyncFragment"
app:destination="@+id/turnOnSyncFragment"
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values/static_strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
%1$s is produced by Mozilla.
</string>

<string name="share_fragment_args_url" translatable="false">url</string>
<string name="share_fragment_args_title" translatable="false">title</string>
<string name="share_fragment_args_tabs" translatable="false">tabs</string>

<!-- 1.0.1 strings -->
<!-- Bookmark deletion confirmation -->
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -664,4 +664,9 @@
<string name="onboarding_theme_dark_title">Dark theme</string>
<!-- Theme setting for light mode -->
<string name="onboarding_theme_light_title">Light theme</string>

<!-- Text shown in snackbar when multiple tabs have been sent to device -->
<string name="sent_tabs_snackbar">Tabs sent!</string>
<!-- Text shown in snackbar when one tab has been sent to device -->
<string name="sent_tab_snackbar">Tab sent!</string>
</resources>

0 comments on commit 39b2f75

Please sign in to comment.