[fenix] For https://github.com/mozilla-mobile/fenix/issues/18515 - Added Icon and sync functionality
Co-authored-by: Jonathan Almeida <jalmeida@mozilla.com>pull/600/head
parent
695c777306
commit
dc1f62eb6e
@ -0,0 +1,93 @@
|
||||
/* 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.tabstray
|
||||
|
||||
import androidx.appcompat.content.res.AppCompatResources
|
||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.cancel
|
||||
import kotlinx.coroutines.flow.collect
|
||||
import kotlinx.coroutines.flow.map
|
||||
import mozilla.components.lib.state.ext.flowScoped
|
||||
import mozilla.components.support.base.feature.LifecycleAwareFeature
|
||||
import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged
|
||||
import org.mozilla.fenix.R
|
||||
import org.mozilla.fenix.tabstray.browser.BrowserTrayInteractor
|
||||
import org.mozilla.fenix.tabstray.syncedtabs.SyncedTabsInteractor
|
||||
|
||||
class FloatingActionButtonBinding(
|
||||
private val store: TabsTrayStore,
|
||||
private val actionButton: ExtendedFloatingActionButton,
|
||||
private val browserTrayInteractor: BrowserTrayInteractor,
|
||||
private val syncedTabsInteractor: SyncedTabsInteractor
|
||||
) : LifecycleAwareFeature {
|
||||
|
||||
private var scope: CoroutineScope? = null
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
override fun start() {
|
||||
setFab(store.state.selectedPage, store.state.syncing)
|
||||
scope = store.flowScoped { flow ->
|
||||
flow.map { it }
|
||||
.ifAnyChanged { state ->
|
||||
arrayOf(
|
||||
state.selectedPage,
|
||||
state.syncing
|
||||
)
|
||||
}
|
||||
.collect { state ->
|
||||
setFab(state.selectedPage, state.syncing)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun stop() {
|
||||
scope?.cancel()
|
||||
}
|
||||
|
||||
private fun setFab(selectedPage: Page, syncing: Boolean) {
|
||||
when (selectedPage) {
|
||||
Page.NormalTabs -> {
|
||||
actionButton.apply {
|
||||
shrink()
|
||||
show()
|
||||
icon = AppCompatResources.getDrawable(context, R.drawable.ic_new)
|
||||
setOnClickListener {
|
||||
browserTrayInteractor.onFabClicked(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
Page.PrivateTabs -> {
|
||||
actionButton.apply {
|
||||
text = context.getText(R.string.tab_drawer_fab_content)
|
||||
extend()
|
||||
show()
|
||||
icon = AppCompatResources.getDrawable(context, R.drawable.ic_new)
|
||||
setOnClickListener {
|
||||
browserTrayInteractor.onFabClicked(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
Page.SyncedTabs -> {
|
||||
actionButton.apply {
|
||||
text = if (syncing) context.getText(R.string.sync_syncing_in_progress)
|
||||
else context.getText(R.string.tab_drawer_fab_sync)
|
||||
extend()
|
||||
show()
|
||||
icon = AppCompatResources.getDrawable(context, R.drawable.ic_fab_sync)
|
||||
setOnClickListener {
|
||||
// Notify the store observers (one of which is the SyncedTabsFeature), that
|
||||
// a sync was requested.
|
||||
if (!syncing) {
|
||||
store.dispatch(TabsTrayAction.SyncNow)
|
||||
syncedTabsInteractor.onRefresh()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="14dp"
|
||||
android:height="14dp"
|
||||
android:viewportWidth="14"
|
||||
android:viewportHeight="14">
|
||||
<group
|
||||
android:pivotX="7"
|
||||
android:pivotY="7"
|
||||
android:scaleX="0.8"
|
||||
android:scaleY="0.8">
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:fillType="evenOdd"
|
||||
android:pathData="M12,1C12,0.4477 12.4477,0 13,0C13.5523,0 14,0.4477 14,1V5C14,5.5523 13.5523,6 13,6H9C8.4477,6 8,5.5523 8,5C8,4.4477 8.4477,4 9,4H10.967C10.0382,2.7401 8.5652,1.9976 7,2C4.7088,2.0026 2.7146,3.5672 2.167,5.792C2.0256,6.319 1.4879,6.6353 0.9586,6.503C0.4293,6.3707 0.1038,5.8385 0.227,5.307C0.8267,2.8397 2.7245,0.896 5.1768,0.2376C7.629,-0.4208 10.2451,0.3109 12,2.146V1ZM11.833,8.208C11.9668,7.6724 12.5093,7.3465 13.045,7.48C13.3024,7.5442 13.5238,7.7081 13.6603,7.9356C13.7969,8.1632 13.8374,8.4356 13.773,8.693C13.1733,11.1603 11.2755,13.104 8.8232,13.7624C6.371,14.4208 3.7548,13.6891 2,11.854V13C2,13.5523 1.5523,14 1,14C0.4477,14 0,13.5523 0,13V9C0,8.4477 0.4477,8 1,8H5C5.5523,8 6,8.4477 6,9C6,9.5523 5.5523,10 5,10H3.033C3.9618,11.2598 5.4348,12.0025 7,12C9.2912,11.9974 11.2854,10.4328 11.833,8.208Z" />
|
||||
</group>
|
||||
</vector>
|
Loading…
Reference in New Issue